サーバーを運用するにあたり、セキュリティ設定が必要になります。今回は、ファイアウォール(iptables)の設定をおこなったので紹介します。
そもそも、ファイアウォール(iptables)で何をやっているかというと、プロトコルやポート番号を元にパケットの受信、転送、送信の可否を制御しています。
TCPwrapper(hosts.allowやhosts.denyでアクセス制限を行う)でも同じように(厳密には違いますが)サービスごとに制限をかけることができます。この2つを併用することにより二重でアクセス制御ができ、よりセキュリティを強化することができます。sshなどの重要なサービスは、iptablesで許可した後に、TCPwrapperで接続できるホストに制限をかけておくと安心ですね。
ややこしいですが、簡単に説明するとiptablesとTCPwrapperは、ネットワークの階層で考えた場合に、動作する階層が異なっています。iptablesはパケットレベルのフィルタであるのに対して、TCPwrapperはサービスソフトウェア側での実装です。TCPwrapperに対応したソフトでないと設定しても反映されません。sshはTCPwrapperに対応しているので設定したフィルタの設定が反映されます。(SSHのパケットを通過させて、sshを使う場合に接続元のホストに制限をかけるなどの組み合わせが可能)また、TCPwrapperの設定は、サービスの再起動は不要で、書き換えた後に新しい設定が参照されます。TCPwrapperの設定を書き換える場合は、十分に注意する必要があります。(書き換え後,すぐに接続できなくなったりします…)
ちょっとわき道にそれましたが、本題のファイアウォール(iptable)設定に入ります。
ファイアウォール(iptable)設定には、INPUT、OUTPUT、FORWORDという3つのポリシー(方針)があります。INPUTは受信パケットのポリシー、OUTPUTは送信パケットのポリシー、FORWARDは転送パケットのポリシーです。各ポリシーに対して、”DROP”(拒否)、”ACCEPT”(許可)などの基本ポリシーを設定します。
今回は、各ポリシーに対して、以下の考え方で設定を行いました。
- INPUT:受信パケットに関する基本ポリシーをDROPにして、許可するポートを個別にACCEPT
- OUTPUT:サーバーから出ていく方なので、ACCEPT
- FORWARD:他のサーバへの転送設定で、特に転送するサーバーはないのでDROP
では、さっそくファイアウォール(iptables)の設定を行います。
- まずは、iptableをインストールします。
$ sudo apt-get install iptables-persistent
- 現在の設定を確認(以下のように何も制限されていない状態になっているはず)
$ sudo iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
- iptableのルールを設定
今回は、SSH(SFTP)、HTTP、HTTPSのポートを許可して、他の通信は拒否するように設定します。
ファイアウォール(iptables)のルールファイル「rules.v4」を作成します。
$ sudo vi /etc/iptables/rules.v4
rules.v4の中身
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
#ループバックを許可
-A INPUT -i lo -j ACCEPT
#確立された全ての受信接続を許可
-A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
#DNSを許可
-A INPUT -p udp --sport 53 -j ACCEPT
#SSH(SSHに割り付けたポート番号xxxx)の新たな接続を許可
-A INPUT -p tcp -m state --state NEW --dport xxxx -j ACCEPT
#HTTP(80)/HTTPS(443)の許可
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT
#SAMBAの許可
-A INPUT -p tcp --dport 139 -j ACCEPT
-A INPUT -p udp --dport 137 -j ACCEPT
-A INPUT -p udp --dport 138 -j ACCEPT
-A INPUT -p tcp --dport 445 -j ACCEPT
COMMIT
【よく使うコマンド、パラメータについて補足】 -A ルールの追加 INPUT 入ってくるパケット OUTPUT 出ていくパケット FORWARD 転送するパケット -p ルールの対象となるプロトコルの種類を指定 tcp:TCPプロトコル udp:UDPプロトコル icmp:ICMPプロトコル -m state –state : ・NEW 新しい接続 ・ESTABLEISHED すでに許可されている接続 ・RELATED 新しくかつ許可された接続 ・NVALID 無効な接続 --sport 送信側のポート指定 --dport 受信側のポート指定 ACCEPT パケットを許可 DROP パケットを拒否 REJECT パケットを拒否して制御メッセージを送信
- 新しいルールを適用する
$ sudo iptables-apply /etc/iptables/rules.v4 Applying new iptables rules from '/etc/iptables/rules.v4'… done. Can you establish NEW connections to the machine? (y/N) y … then my job is done. See you next time.
- 設定が適用されたか確認
$sudo iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- anywhere anywhere ACCEPT tcp -- anywhere anywhere state RELATED,ESTABLISHED ACCEPT udp -- anywhere anywhere udp spt:domain ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:xxxx ACCEPT tcp -- anywhere anywhere tcp dpt:http ACCEPT tcp -- anywhere anywhere tcp dpt:https ACCEPT tcp -- anywhere anywhere tcp dpt:netbios-ssn ACCEPT udp -- anywhere anywhere udp dpt:netbios-ns ACCEPT udp -- anywhere anywhere udp dpt:netbios-dgm ACCEPT tcp -- anywhere anywhere tcp dpt:microsoft-ds Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
意図した設定が有効になっていればOKです。
以下は、設定時に調査した内容(メモ)です。
iptableの設定について
- 代表的なサービスのプロトコルとポート番号
サービス名 | プロトコルとポート番号 |
---|---|
httpサーバー(HTTP) | TCP 80 |
httpサーバー(SSL) | TCP 443 |
メールサーバー(POP3) | TCP 110 |
メールサーバー(IMAP) | TCP 143 |
メールサーバー(SMTP) | TCP 25 |
メールサーバー(submission port) | TCP 587 |
FTP | TCP 20, 21 |
SSH、SFTP | TCP 22 |
iptableの基本的な考え方
iptablesには、INPUT、OUTPUT、FORWORDという3つのポリシーがあります。それぞれの通信の基本ポリシーを”DROP”(拒否)、”ACCEPT”(許可)のどちらかに設定できます。
INPUTは、サーバーに入ってくる通信のポリシーです。ここでは基本ポリシーを”DROP”にして、あとで個別のポートに対して許可する設定にします。
OUTPUTは、サーバーから出て行く通信のポリシーです。基本ポリシーは”ACCEPT“にします。
FORWARDは、受信したデータを他のサーバーへ転送する際に適用される設定です。ここでは、特に転送するサーバーは無いので”DROP”にします。