この特集のトップページへ
この回のトップページへ

セキュリティを高める

 ここまで解説してきたように,実はサーバをインターネットに公開するということは,ちょっと苦労をすれば誰にでも実現できることだ。しかし,インターネットに公開するということは,誰もがサーバにアクセスできることを意味し,セキュリティ上の懸念が残る。そこでセキュリティ対策について考える必要がある。

 セキュリティを考える場合,自分が動かしているサーバでどのようなサービスが動いているのかを知ることが重要だ。インターネット側から接続される場合,サーバー上に存在する「ソケット(Socket)」と呼ばれる口に接続される形態を持つ。いい換えれば,サーバ上にソケットの口を開けているサービス(デーモン)が動作していなければ,接続する手段がないのだ(もちろんカーネル自身にセキュリティホールがある場合には、それはまた別の話だ)。


現在稼動させているサーバ上で開いているソケット一覧は,netstatコマンドに-lオプションと--inetオプションをつけて実行すると知ることができる。また-pオプションをつけると,ソケットを開けているプログラム名を確認することも可能だ(-pオプションを使う場合にはroot権限が必要)。

 基本的なセキュリティ対策としては,ソケットを開けているサービス(デーモン)のうち,不必要なものを動かさないようにしたり,各サービスの設定ファイルを正しく設定することが大切だ。覚えのないサービスは停止させておいて,インターネット側から接続できないように制限するのだ。

 今回ここで紹介する方法は,Linuxのipchainsコマンドを使い,パケットフィルタリングと呼ばれる機能を利用する方法である。パケットフィルタリングとは,インターネットから自サーバへの接続や,逆に自サーバからインターネット側へ接続する際,どのソケットからどのソケットに到達するかを設定するものだ。特定のパケット(データ)を判別し,必要のないものは通さないようにする方法である。ソケットには「ポート番号」と呼ばれる番号が付いている。ipchainsコマンドでは,ポート番号を指定することで,どのソケットへ到達を許すのか,許さないのかを設定することが可能だ。

 RP-PPPoEでは、ファイアウォールタイプとしてSTANDALONEを指定すると,/etc/pppディレクトリ下のfirewall-standaloneというスクリプトファイルが実行される。このスクリプトの内容は次のようになっている。この設定は,自サーバからインターネットには接続できるが,逆にインターネットからこのサーバ上に動作しているすべてのサービスには接続できないという高いセキュリティレベルである。

1: #!/bin/sh
2: #
3: # firewall-standalone This script sets up firewall rules for a standalone
4: # machine
5: #
6: # Copyright (C) 2000 Roaring Penguin Software Inc.This software may
7: # be distributed under the terms of the GNU General Public License, version
8: # 2 or any later version.
9:
10: # Interface to Internet
11: EXTIF=ppp+
12:
13: ANY=0.0.0.0/0
14:
15: ipchains -P input ACCEPT
16: ipchains -P output ACCEPT
17: ipchains -P forward DENY
18:
19: ipchains -F forward
20: ipchains -F input
21: ipchains -F output
22:
23: # Deny TCP and UDP packets to privileged ports
24: ipchains -A input -l -i $EXTIF -d $ANY 0:1023 -p udp -j DENY
25: ipchains -A input -l -i $EXTIF -d $ANY 0:1023 -p tcp -j DENY
26:
27: # Deny TCP connection attempts
28: ipchains -A input -l -i $EXTIF -p tcp -y -j DENY
29:
30: # Deny ICMP echo-requests
31: ipchains -A input -l -i $EXTIF -s $ANY echo-request -p icmp -j DENY
※説明の都合上、行頭には行番号を付けた。実際のfirewall-standaloneファイルには行番号はついていない。


ipchainsコマンドは/sbinディレクトリに存在する。ログインされているシェル環境で,/sbinディレクトリにパスが設定されていない場合にはfirewall-standaloneファイルの実行に失敗してしまう。正しく動作しない場合には,「ipchains」とある部分をすべて「/sbin/ipchains」のようにフルパスで書き換えてほしい。正しく反映されるかどうかは,rootログインをして「sh /etc/ppp/firewall-standalone」と入力して実行した際,「command not found」と表示されるかどうかで判断できる(「command not found」と表示される場合,パスが通っていないことになる)。

 前述のように,上記で挙げたfirewall-standaloneスクリプトファイルの設定では,インターネット側から自サーバ上で動作しているすべてのサービスには接続できないようになっている。しかしこのままでは必要なサービスを外部に公開できないので,公開したいものだけをインターネット側から接続できる――すなわち,公開したいポート番号の部分だけ通過できる穴をあける――ように設定する必要がある。これは,必要なものだけ空けていくというセキュリティーポリシーに則っているものだ。

 特定のサービスに対して接続許可を与えたいのであれば,22行目に次のような記述で設定を挿入すればよい。

ipchains -A input-i $EXTIF -d $ANY ポート番号 -p プロトコル -j ACCEPT

この行は21行目より後ろ,23行目よりも前に挿入しなければならない。


ipchainsコマンドはかなり多数のオプションがあるため、ここでは詳細説明をしない。詳細は、「Linux IPCHAINS-HOWTO」などを参照してほしい。

 おもなサービスのポート番号とプロトコルを,Table 3に挙げる。たとえば,httpサービスに対してインターネットからの接続を許可し,外部にホームページを公開したいのであれば次の行を挿入すればよい。

ipchains -A input -i $EXTIF -d $ANY 80 -p tcp -j ACCEPT

 同様に,ftpサービスを許したいのであれば次の行を挿入する。

ipchains -A input -i $EXTIF -d $ANY 21 -p tcp -j ACCEPT

 このように公開したいサービスの数だけipchains行を挿入していくのだ。


Table 3に示したもののうち、tcpudpの両者があるものは、2行に分けて記述する。というのは、ipchainsコマンドは,「-p tcp udp」という書式を受け付けないためである。この場合,「-p tcp」とした行と「-p udp」とした行の2つに分けて記述することになる。
Table 3■おもなサービスのポート番号とプロトコル
サービス名 ポート番号 プロトコル 提供する主なプログラム名
ftp 21 tcp (inetdより起動)in.ftpd
ssh 22 tcp sshd
telnet 23 tcp (inetdより起動)in.telnetd
smtp 25 tcp sendmail
domain(DNS) 53 tcp,udp bind
www 80 tcp apache
pop3 110 tcp (inetdより起動)ipop3d、qpopper
ntp 123 tcp,udp ntpd、xntpd
netbios(Windows共有) 137-139,445 tcp,udp samba
https(www SSL) 443 tcp apache

※表に示した以外のポート番号,プロトコルについては,/etc/servicesファイルやRFC1700を参照してほしい。

 このようにfirewall-standaloneファイルを変更したならば,次にRP-PPPoEの設定を変更してファイアウォールタイプとしてSTANDALONEを使うようにする。そのためには,/etc/ppp/ディレクトリにあるpppoe.confファイルをviエディタなどで読み込み,FIREWALLという項目をSTANDALONEに変更する。

# Firewalling: One of NONE, STANDALONE or MASQUERADE
FIREWALL=STANDALONE

 以上の設定により,挿入したipchains行で許可したサービスのみしかインターネット側から利用できないようになり,サーバのセキュリティが保たれることになる。


設定変更は、ADSLに再接続したときに有効になる。即座に有効にしたいのであれば、adsl-stopコマンドを使って切断したのち、adsl-startコマンドを使って再接続する。

PREV 8/12 NEXT