2.2.5 リモートからのアクセス制限

インストール直後のRedHat Linux 7.0は、様々なサービスが利用可能となっています。 それらサービスの中には、 メールサーバーのような外部からのアクセスが必要なサービスもありますが、 かな漢字変換サーバーのような外部からのアクセスが必要ないサービスもあります。 また、外部からのアクセスがセキュリティ上好ましくないサービスも含まれています。 外部からアクセスされるサービスを必要最低限なサービスだけに絞るためには、 サービスの停止や無効化、 もしくはサービスにアクセスするためのポートのアクセス制限を行う必要があります。

なお、ここに挙げたものはOSとしての機能を中心としています。
この他にもipchainsを使用できます。 詳細は、ipchainsを参照してください。

(1) xinetdによるサービスへのアクセス制御

RedHat Linux 7.0に標準搭載のスーパーサーバーは、 RedHat Linux 6.xまで標準搭載であったinetdから、 DoS対策や設定のきめ細かさをより重視したxinetdへと変更されました。 ここでは、xinetdをスーパーサーバーとして利用する場合の設定について説明します。 なお、inetdとTCP Wrapperをスーパーサーバーとして利用する場合は、 後述のinetdとTCP Wrapperによるサービスへのアクセス制御を参照して下さい。

xinetdのインストール

xinetdがインストールされていない場合は、以下の手順でxinetdをインストールして下さい。 なお、RedHat Linux 7.0をワークステーションでインストールした場合、 xinetdはインストールされません。

xinetdは、RedHat Linux 7.0のインストールCDにRPMパッケージで入っています。 インストールCDをマウントした後、以下のコマンドでインストールを実行して下さい。

# rpm -Uvh /mnt/cdrom/RedHat/RPMS/xinetd-2.1.8.9pre9-6.i386.rpm
xinetd                      ##################################################

設定ファイルのアクセス権変更

xinetdの設定は、/etc/xinetd.confと、 /etc/xinetd.d/以下に置かれる各サービス毎のアクセス制御ファイルによって行われます。 xinetdのインストール直後は、設定ファイルがroot以外のユーザーに読み取り可能となっていますので、 root以外のユーザーが読み取れないようにアクセス権を変更します。

# chmod 600 /etc/xinetd.conf
# chmod -R 600 /etc/xinetd.d/

xinetd.confの設定

/etc/xinetd.confには、各サービスに共通の設定をします。

defaults
{
        instances               = 60
        log_type                = SYSLOG authpriv
        log_on_success          = HOST PID
        log_on_failure          = HOST RECORD
}

includedir /etc/xinetd.d
基本的には、/etc/xinetd.confの設定はデフォルトのままで構いませんが、 DoS対策として、サービスプロセスへのアクセスタイムアウト秒数であるinstanceをより小さな値に設定することもできます。 この値を変更すると、xinetdから起動される全てのサービスプロセスのアクセスタイムアウト秒数が変更されます。 ただし、あまり小さな値に設定すると、 提供すべきサービスもネットワークの負荷などが原因で正常に接続できなくなる可能性が出てきますので、 ネットワークの負荷とDoSの境界をどこに設定するか等を考えてから変更して下さい。

各サービス毎のアクセス制御ファイルの設定

/etc/xinetd.d/以下に置かれる各サービス毎のアクセス制御ファイルは、 /etc/servicesに登録されているサービス(ftpやtelnet等)1つに対して、 1つのアクセス制御ファイルが対応するように設定します。

RedHat Linux 7.0のインストールCDにRPMパッケージで入っているサービスアプリケーションは、 該当するサービス用のアクセス制御ファイルも一緒にインストールします。 例えば、telentサーバー(telnet-server-0.17-7.i386.rpm)をインストールした場合、 以下のアクセス制御ファイル(/etc/xinetd.d/telnet)もインストールされます。

service telnet
{
        flags           = REUSE
        socket_type     = stream
        wait            = no
        user            = root
        server          = /usr/sbin/in.telnetd
        log_on_failure  += USERID
}
これも、基本的には、デフォルト設定のままで構いません。

なお、不要なサービス用のアクセス制御ファイルを/etc/xinetd.d/以下に置くと、 不要なサービスのアクセスを許可することになりますので、 必要なサービスアプリケーションだけをインストールするように注意して下さい。

インストール済みの不要なサービスアプリケーションは、アンインストールするか、 アクセス制御ファイルを無効化して下さい。 該当するサービス用のアクセス制御ファイルのファイル名の先頭に"."を付けてリネームすることで無効化します。

# mv /etc/xinetd.d/[アクセス制御ファイル名] /etc/xinetd.d/.[アクセス制御ファイル名]
例えば、telnetサーバーの無効化は、以下の通りです。
# mv /etc/xinetd.d/telnet /etc/xinetd.d/.telnet

設定の有効化

ここまでの設定を有効にするため、xinetdを起動します。

# /etc/rc.d/init.d/xinetd start
Starting xinetd:                                           [  OK  ]

すでに起動している場合は、再起動します。

# /etc/rc.d/init.d/xinetd restart
Stopping xinetd:                                           [  OK  ]
Starting xinetd:                                           [  OK  ]

稼動しているサービスの確認

稼動しているサービスの確認は、以下のコマンドで行います。

# netstat -a
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 *:ssh                   *:*                     LISTEN
raw        0      0 *:icmp                  *:*                     7
raw        0      0 *:tcp                   *:*                     7
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags       Type       State         I-Node Path
unix  0      [ ]         STREAM     CONNECTED     204    @0000001c
unix  0      [ ACC ]     STREAM     LISTENING     852    /tmp/.font-unix/fs7100
unix  2      [ ]         DGRAM                    424    /dev/log
unix  0      [ ]         DGRAM                    2985
unix  0      [ ]         DGRAM                    439

稼動してはならないサービスが見つかった場合は、 アクセス制御ファイルを無効化して、xinetdを再起動してから、再度確認をして下さい。 また、稼動しなければならないサービスが見つからない場合も、 アクセス制御ファイルを有効化した後にxinetdを再起動し、 再度確認を行ってください。

(2) inetdとTCP Wrapperによるサービスへのアクセス制御

RedHat Linux 7.0からxinetdが標準のスーパーサーバーとなりましたが、 今のところ、inetdを利用しているケースが多いようです。
しかし、inetdだけではアクセス制御ができないため、 セキュリティ面では不安が残ります。
これを補うためにTCP Wrapperを併用することで、アクセス制御が可能となります。 ここでは、inetdとTCP Wrpaaerをスーパーサーバとして利用する場合の設定について説明します。

inetdのインストール

inetdは、RedHat Linux 7.0から標準搭載でなくなったため、 該当するRPMパッケージもインストールCDには存在しません。 よって、RedHat社のダウンロードページから、inetdの入ったRPMパッケージである"netkit-base 0.10-34"をダウンロードします。

netkit-base-0.10-34 package information
http://www.redhat.com/swr/i386/netkit-base-0.10-34.i386.html
ただし、このRPMパッケージには、pingプログラムも含まれており、 システムにインストール済みのpingプログラムと衝突してしまうため、 普通にインストールはできません。 pingプログラムをバックアップした後、強制インストールでpingを上書きし、 pingプログラムをバックアップから戻す等の工夫をして下さい。
"netkit-base 0.10-34"の強制インストールは、 以下のコマンドで実行します。
# rpm -Uvh --force netkit-base-0_10-34_i386.rpm

設定ファイルのアクセス権変更

inetdの設定は、/etc/inetd.confによって行われます。 inetdのインストール直後は、設定ファイルがroot以外のユーザーに読み取り可能となっていますので、 root以外のユーザーが読み取れないようにアクセス権を変更します。

# chmod 600 /etc/inetd.conf

inetd.confの設定

/etc/inetd.confは、/etc/servicesに登録されているサービス(ftpやtelnet等)1つに対して、 1行のアクセス制御文が対応するように設定します。 "#"が先頭に付いている行のサービスは、無効化されているサービスを表わします。

#echo       stream  tcp     nowait  root    internal
#echo       dgram   udp     wait    root    internal
#discard    stream  tcp     nowait  root    internal
#discard    dgram   udp     wait    root    internal
#daytime    stream  tcp     nowait  root    internal
#daytime    dgram   udp     wait    root    internal
#chargen    stream  tcp     nowait  root    internal
#chargen    dgram   udp     wait    root    internal
#time       stream  tcp     nowait  root    internal
#time       dgram   udp     wait    root    internal
#
# These are standard services.
#
ftp         stream  tcp     nowait  root    /usr/sbin/tcpd  in.ftpd -l -a
telnet      stream  tcp     nowait  root    /usr/sbin/tcpd  in.telnetd
#
# Shell, login, exec, comsat and talk are BSD protocols.
#
shell       stream  tcp     nowait  root    /usr/sbin/tcpd  in.rshd
login       stream  tcp     nowait  root    /usr/sbin/tcpd  in.rlogind
...
(省略)
...
finger      stream  tcp     nowait  nobody  /usr/sbin/tcpd  in.fingerd
#cfinger    stream  tcp     nowait  root    /usr/sbin/tcpd  in.cfingerd
#systat     stream  tcp     nowait  guest   /usr/sbin/tcpd  /bin/ps -auwwx
#netstat    stream  tcp     nowait  guest   /usr/sbin/tcpd  /bin/netstat    -f inet
#
# Authentication
#
auth        stream  tcp     nowait    nobody    /usr/sbin/in.identd in.identd -l -e -o
#
# End of inetd.conf

不要なサービスであるにも関わらず、 有効になっている("#'"が付いていない) 場合は、 "#"を行の先頭に追加するか行を削除し、サービスを無効にして下さい。

設定の有効化

ここまでの設定を有効にするため、inetdを起動します。

# /etc/rc.d/init.d/inet start

すでに起動している場合は、再起動します。

# /etc/rc.d/init.d/inet restart

稼動しているサービスの確認

稼動しているサービスの確認は、xinetdと同じです。

tcp_wrapperによるアクセス制御

セキュリティ確保のためのソフトウェアにtcp_wrapperがあります。
tcp_wrapperは、元々inetdから起動されるものに対して有効でしたが、 現在では/etc/rc等から起動されるデーモンに対しても、ライブラリを1つリンクさせるだけで有効になっています。
FreeBSDでは、インストール時のアプリケーションは既にtcp_wrapperによる制御が可能になっています。

tcp_wrapperによって、特定のホストやネットワーク以外からの接続をサービスごとに許可や不許可の設定が行えます。
そして、この制御を行う部分が、/etc/hosts.allowです。 インストール直後のhosts.allowは何も設定されていません。

それでは実際にアクセス制限の設定を行ってみましょう。
tcp_wrapperの構文は従来と同じです。

サービス名:ホスト:allow(許可) または deny(不許可)
たとえば、telnetを192.168.0.0/24の範囲以外を禁止する場合は次のように記述します。
in.telnetd:192.168.0.0/255.255.255.0:allow

これで、192.168.0.0/24の以外からのtelnet要求は拒否されます。 もし、192.168.0.0/24だけでなく、ipa-sec.comのネットワークアドレスを指定するには次のように記述します。

in.telnetd : 192.168.0.0/255.255.255.0 : allow
in.telnetd : 172.16.0.0/255.255.0.0 : allow

もし、これら2つのネットワークに加えて、10.1.1.1/8という特定のホストを加えたいのであれば、同様に記述します。
また、この時は、一行に一定義だけではなく、カンマで区切ることもできます。

in.telnetd : 192.168.0.0/255.255.255.0 : allow
in.telnetd : 172.16.0.0/255.255.0.0,10.1.1.1/255.0.0.0 : allow

もし、アクセス不許可の設定になっているホストやサービスに対して接続されてきた場合、tcp_wrapperは/var/log/messagesにその事実を記述します。
よって、管理者は/var/log/messagesの監視を行う必要があります。

アクセス不許可の通知

管理者は/var/log/messagesの監視を行う場合、 24時間見張っているわけにもいきません。 また、一日一回などの参照では何か重大な事実が発生したときに対処が遅れることが考えられます。
/etc/hosts.allowのデフォルトで設定されているものの中に次のような定義があることにお気づきでしょう。
最初の定義は、アクセス不許可の設定に引っかかった相手に対してfingerを送り、 その結果をメールでroot宛に送信している部分です。
次の定義は、アクセス不許可の設定に引っかかった相手に対して何らかのメッセージを送るときに使用します。
これによって、許可されていないホストからtelnetを行うと "You are not welcome to use ドメイン名 from ホスト名." というメッセージを表示して切断します。

tcp_wrapperによって接続を許可されずに切断されるときの処理
fingerd : ALL \
        : spawn (echo Finger. | \
         /usr/bin/mail -s "tcpd\: %u@%h[%a] fingered me!" root) & \
        : deny

# The rest of the daemons are protected.
ALL : ALL \
        : severity auth.info \
        : twist /bin/echo "You are not welcome to use %d from %h."

それでは、これをカスタマイズして更に詳しい情報を管理者に送信するようにしてみましょう。
詳細はtcpdのman pageに記述されていますが、%dや%h以外にも使用可能な変数があります。
許可されていないホストからの接続が行われた際、相手のIPアドレスやホスト名、接続しようとしたプロセスなどを列挙し管理者宛に送信します。
ここでは、root宛に送信していますが、たとえば管理を他のドメインの管理者に依頼しているケースは"ユーザ名@ドメイン名"という通常のメールアドレスも記述できますし、管理者と管理者の携帯端末というように複数指定したい場合は","で区切ります。

hosts.denyまたはhosts.allowのALL:ALL部を置き換える
ALL : ALL \
: severity auth.info : spawn (/usr/bin/finger -l @%h | \
/usr/bin/printf " \
client address \: %a \n \
client hostname \: %n \n \
client username \: %u \n \
client info \: %c \n \
server address \: %A \n \
server hostname \: %N \n \
server process \: %d \n \
server info \: %s" | \
/usr/bin/mail -s "tcpd\: %u@%h[%a] tried to use %d (denied)" root) & \
: twist /bin/echo "You are not welcome to use %d from %h."

inetdを利用する上での注意点

TCP Wrapperとの併用により、inetdのセキュリティ面が大分改善されますが、 DoSに対する脆弱制は依然残ったままです。 DoSへの対策としては、xinetdへの移行も考えてみて下さい。

(3) システム起動時に起動するサービスの制限

RedHat Linux 7.0は、システム起動の際、 /etc/rc.d/以下の"rc[数字].d"というディレクトリ内にあるサービス制御スクリプトを実行します。 "rc[数字].d"の数字は、ランレベルと呼ばれる、 動作状態のレベルを表わします。
各ランレベルと対応する動作状態、内容は以下の通りです。

表2.2.5-1 ランレベル
ランレベル 動作状態 内容
0 システム停止モード システムを停止するときのモード
1 シングルユーザーモード システムに1人(root)しかログインできないモード
2 マルチユーザーモード ネットワークをサポートしない複数ユーザーがログインなモード
3 フルマルチユーザーモード ネットワークをサポートした複数ユーザーがログインなモード
4 未使用 将来のために予約(使用しない)
5 X Widow GUIモード X Window Systemを用いてログインを行うモード
6 リブートモード 再起動時のモード

システム起動時にコンソールを起動する場合は、ランレベル3のため、 /etc/rc.d/rc3.d/以下が実行されることになります。
システム起動時にX Windowを起動する場合は、ランレベル5のため、 /etc/rc.d/rc5.d/以下が実行されることになります。

各ランレベル毎のディレクトリ以下にあるサービス制御スクリプトはシンボリックリンクであり、 実体は/etc/rc.d/init.d/ 以下のサービス制御スクリプトに起動もしくは停止の指定付きでリンクしています。 シンボリックリンクファイルの先頭に"S"が付いている場合は、起動を行います。
先頭に"K"が付いている場合は、停止を行います。 また、"S"や"K"の後の数字は、処理順番を表わします。
数字の若い順に起動もしくは停止が実行されます。

ランレベルの変更は、/sbin/telinitで行います。
たとえば、ランレベル5に変更する場合は次のように実行します。

# /sbin/telinit 5

システム起動時のサービスの無効化

/etc/rc.d/init.d/以下にある、サービス制御スクリプトの実体を無効化すると、 各ランレベル毎のディレクトリ以下にあるシンボリックリンクも無効になり、 システム起動時に実行されなくなります。
これを利用して、システム起動時のサービスの無効化を行います。

無効にしたいサービス制御スクリプトのファイル名の先頭に "."を付けてリネームして下さい。

# mv /etc/rc.d/init.d/[サービス制御スクリプト名] /etc/rc.d/init.d/.[サービス制御スクリプト名]
例えば、FreeWnnを無効にする場合は、以下のコマンドを実行します。
# mv /etc/rc.d/init.d/FreeWnn /etc/rc.d/init.d/.FreeWnn

設定の有効化

ここまでの設定を有効にするため、システムを再起動します。 以下のコマンドを実行すると、システムの再起動に入ります。 作業中のファイル等を保存してから、システムの再起動を実行して下さい。

# reboot

稼動しているサービスの確認

稼動しているサービスの確認は、以下のコマンドで行います。

# ps -aux
USER       PID %CPU %MEM   VSZ  RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1  1292  116 ?        S    Feb21   0:05 init [3]
root         2  0.0  0.0     0    0 ?        SW   Feb21   0:00 [kflushd]
root         3  0.0  0.0     0    0 ?        SW   Feb21   0:00 [kupdate]
root         4  0.0  0.0     0    0 ?        SW   Feb21   0:00 [kpiod]
root         5  0.0  0.0     0    0 ?        SW   Feb21   0:00 [kswapd]
root         6  0.0  0.0     0    0 ?        SW<  Feb21   0:00 [mdrecoveryd]
root        59  0.0  0.0     0    0 ?        SW   Feb21   0:00 [khubd]
root       400  0.0  0.3  1352  208 ?        S    Feb21   0:01 syslogd -m 0
root       410  0.0  0.2  1608  172 ?        S    Feb21   0:00 klogd
root       516  0.0  0.0  1264    0 tty3     SW   Feb21   0:00 [mingetty]
root       517  0.0  0.0  1264    0 tty4     SW   Feb21   0:00 [mingetty]
root       518  0.0  0.0  1264    0 tty5     SW   Feb21   0:00 [mingetty]
root       519  0.0  0.0  1264    0 tty6     SW   Feb21   0:00 [mingetty]
root       637  0.0  0.0  1264    0 tty2     SW   Feb23   0:00 [mingetty]
xfs        933  0.0  5.2  7664 3336 ?        S    Feb23   1:11 xfs -droppriv -da
root      2914  0.0  1.7  2232 1092 tty1     S    19:41   0:00 login -- root
root      2915  0.0  2.0  2324 1332 tty1     S    19:41   0:00 -bash
root      3007  0.0  1.7  2428 1136 ?        S    19:52   0:00 /usr/sbin/sshd
root      3012  0.0  2.7  3116 1744 ?        S    19:52   0:00 /usr/sbin/sshd
rima      3013  0.0  1.9  2252 1256 pts/0    S    19:52   0:00 -bash
root      3039  0.0  1.5  2568 1016 pts/0    S    19:53   0:00 su
root      3040  0.0  2.1  2772 1392 pts/0    S    19:53   0:00 bash
root      3061  0.0  1.3  2708  848 pts/0    R    20:00   0:00 ps -aux

稼動してはならないサービスが見つかった場合は、 システム起動時のサービスを無効化して、システムを再起動してから、 再度確認をして下さい。
また、稼動しなければならないサービスが見つからない場合は、 システム起動時のサービスを有効化して、システムを再起動してから、 再度確認をして下さい。


    Copyright(C)  2001 Information-technology Promotion Agency, Japan.  All rights reserved.