インストール直後のRedHat Linux 7.0は、様々なサービスが利用可能となっています。 それらサービスの中には、 メールサーバーのような外部からのアクセスが必要なサービスもありますが、 かな漢字変換サーバーのような外部からのアクセスが必要ないサービスもあります。 また、外部からのアクセスがセキュリティ上好ましくないサービスも含まれています。 外部からアクセスされるサービスを必要最低限なサービスだけに絞るためには、 サービスの停止や無効化、 もしくはサービスにアクセスするためのポートのアクセス制限を行う必要があります。
なお、ここに挙げたものはOSとしての機能を中心としています。
この他にもipchainsを使用できます。
詳細は、ipchainsを参照してください。
RedHat Linux 7.0に標準搭載のスーパーサーバーは、 RedHat Linux 6.xまで標準搭載であったinetdから、 DoS対策や設定のきめ細かさをより重視したxinetdへと変更されました。 ここでは、xinetdをスーパーサーバーとして利用する場合の設定について説明します。 なお、inetdとTCP Wrapperをスーパーサーバーとして利用する場合は、 後述のinetdとTCP Wrapperによるサービスへのアクセス制御を参照して下さい。
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/
/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を再起動し、 再度確認を行ってください。
RedHat Linux 7.0からxinetdが標準のスーパーサーバーとなりましたが、
今のところ、inetdを利用しているケースが多いようです。
しかし、inetdだけではアクセス制御ができないため、
セキュリティ面では不安が残ります。
これを補うためにTCP Wrapperを併用することで、アクセス制御が可能となります。
ここでは、inetdとTCP Wrpaaerをスーパーサーバとして利用する場合の設定について説明します。
inetdは、RedHat Linux 7.0から標準搭載でなくなったため、 該当するRPMパッケージもインストールCDには存在しません。 よって、RedHat社のダウンロードページから、inetdの入ったRPMパッケージである"netkit-base 0.10-34"をダウンロードします。
netkit-base-0.10-34 package informationただし、このRPMパッケージには、pingプログラムも含まれており、 システムにインストール済みのpingプログラムと衝突してしまうため、 普通にインストールはできません。 pingプログラムをバックアップした後、強制インストールでpingを上書きし、 pingプログラムをバックアップから戻す等の工夫をして下さい。
http://www.redhat.com/swr/i386/netkit-base-0.10-34.i386.html
# rpm -Uvh --force netkit-base-0_10-34_i386.rpm
inetdの設定は、/etc/inetd.confによって行われます。
inetdのインストール直後は、設定ファイルがroot以外のユーザーに読み取り可能となっていますので、
root以外のユーザーが読み取れないようにアクセス権を変更します。
# chmod 600 /etc/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は、元々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 ホスト名."
というメッセージを表示して切断します。
|
それでは、これをカスタマイズして更に詳しい情報を管理者に送信するようにしてみましょう。
詳細はtcpdのman pageに記述されていますが、%dや%h以外にも使用可能な変数があります。
許可されていないホストからの接続が行われた際、相手のIPアドレスやホスト名、接続しようとしたプロセスなどを列挙し管理者宛に送信します。
ここでは、root宛に送信していますが、たとえば管理を他のドメインの管理者に依頼しているケースは"ユーザ名@ドメイン名"という通常のメールアドレスも記述できますし、管理者と管理者の携帯端末というように複数指定したい場合は","で区切ります。
|
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." |
TCP Wrapperとの併用により、inetdのセキュリティ面が大分改善されますが、 DoSに対する脆弱制は依然残ったままです。 DoSへの対策としては、xinetdへの移行も考えてみて下さい。
RedHat Linux 7.0は、システム起動の際、
/etc/rc.d/以下の"rc[数字].d"というディレクトリ内にあるサービス制御スクリプトを実行します。
"rc[数字].d"の数字は、ランレベルと呼ばれる、
動作状態のレベルを表わします。
各ランレベルと対応する動作状態、内容は以下の通りです。
| ランレベル | 動作状態 | 内容 |
|---|---|---|
| 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.