さくらVPSでセキュリティ関連の設定をする(ファイヤーウォール編)

SSHの設定に引き続き、ファイヤーウォールiptables)の設定をする。

1. iptablesの設定

以下のサイトの説明がわかりやすいので、その通りにした。設定ファイルの場所は、/etc/sysconfig/iptables

さくらのVPS を使いはじめる 3‐iptables を設定する

流れとしては、以下のようになる。

  1. VPSiptablesがインストールされていることを確認
  2. 現在のiptablesの設定を確認
  3. ポートの設定
  4. iptablesの再起動と動作確認

SSH, HTTP, FTP1, FTP2, MySQLのパケットを許可(ACCEPT)した。その後、iptablesがOS起動時に自動起動する設定になっているかを確認するために、以下のコマンドを実行する。

$ chkconfig --list iptables
iptables        0:off   1:off   2:on    3:on    4:on    5:on    6:off # ランレベル2〜5のonを確認

もし上記のようになっていなければ、以下のコマンドで設定する。

$ sudo chkconfig iptables on # OS起動時に自動で起動するように設定

2. iptablesが効いているか確認

(1) ポートをスキャンするためのツールnmapをインストールする

さくらVPSのOSはCentOSなので、yumコマンドでインストールする。

$ yum list installed | grep nmamp # インストール済みでないことを確認(このコマンドで何も表示されない)
# sudo -i
# yum -y install nmap # yum の -y オプションは「すべてYESで答える」
(2) ポートをスキャンしてみる

以下のコマンドを実行すると、SSHSMTPのポートだけが開いていることがわかる。「え? さっきiptablesの設定でACCEPTした他のポートはどうして開いていないの?」と思ったら、以前の記事をご覧いただきたい。ポートは、そのポートを使うアプリケーションが起動されていないと開かない。

# nmap localhost # ポートスキャンを実行
Starting Nmap 4.11 ( http://www.insecure.org/nmap/ ) at 2011-11-07 00:22 JST
Interesting ports on localhost.localdomain (127.0.0.1):
Not shown: 1678 closed ports
PORT   STATE SERVICE
22/tcp open  ssh
25/tcp open  smtp

Nmap finished: 1 IP address (1 host up) scanned in 0.061 seconds

ただ、この方法でポートをスキャンするだけだったら、iptablesの設定が効いているかどうかは判別できない。

(3) ブラウザでアクセスしてみる

「nmap localhost」のコマンドでは、iptablesが機能しているかどうかがわからないので、ブラウザを使ってパケットが届くかどうか試してみる。

まず、Apache*1を起動した状態で、ブラウザでVPSのURL(http://wwwXXXXXX.sakura.ne.jp)にアクセスする。

Apacheのページが表示される。

nmapコマンドを実行すると、80番ポート(HTTP)が開いていることがわかる。

# nmap localhost # ポートスキャンを実行

Starting Nmap 4.11 ( http://www.insecure.org/nmap/ ) at 2011-11-10 01:34 JST
Interesting ports on localhost.localdomain (127.0.0.1):
Not shown: 1677 closed ports
PORT   STATE SERVICE
22/tcp open  ssh
25/tcp open  smtp
80/tcp open  http

Nmap finished: 1 IP address (1 host up) scanned in 0.140 seconds

次に、iptablesの設定ファイルを編集して、80番ポートへのパケットを拒否するようにしてみる。

$ sudo vi /etc/sysconfig/iptables # 設定ファイルを編集する
...
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22    -j ACCEPT
# -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80    -j ACCEPT # ポート80をACCEPTしない
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 3306  -j ACCEPT
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited # ACCEPTしていないパケットをすべて拒否

$ sudo /etc/rc.d/init.d/iptables restart # iptablesを再起動する

この状態では、ブラウザでVPSのURLにアクセスしても、Apacheのページが表示されない。iptablesにより、ポート80番のパケットが破棄されているからである。

ポートは開いているが、このポートに入ってくるパケットはちゃんとブロックされている。

# nmap localhost # ポートスキャンを実行

Starting Nmap 4.11 ( http://www.insecure.org/nmap/ ) at 2011-11-10 01:34 JST
Interesting ports on localhost.localdomain (127.0.0.1):
Not shown: 1677 closed ports
PORT   STATE SERVICE
22/tcp open  ssh
25/tcp open  smtp
80/tcp open  http

Nmap finished: 1 IP address (1 host up) scanned in 0.140 seconds

*1:Apacheのインストール方法は、「さくらVPS設定その2 Apache+MySQL+WordPress」のページを参考にさせていただいた。