#title ufw(Ubuntu標準の簡易ファイアウォール)を設定するには * '''対象とするUbuntuのバージョン''' * 9.10 Karmic Koala ## 以下にTipsを記述 専用サーバーは基本的に常に電源オンで稼働していて、常にインターネット上に公開されているのが当たり前の存在です。 そのためセキュリティは非常に重要となります。 セキュリティ対策には様々なレベルやツールがあり事前の綿密な計画と迅速な処置が必要ですが、特に初期の段階、つまり専用サーバーが初めてネット上にアップされ、専用サーバーのプロバイダさんからsshログインのアカウントやパスワードが通知された直後にまず最初にやるべきは、アカウントのパスワードの変更とパッケージのセキュリティアップデート、ファイアウォールの設定といえるでしょう。 ところが、アカウントのパスワードの変更やパッケージのセキュリティアップデートは簡単ですが、ファイアウォールの設定は、どのファイアウォールツールを選べば良いかわからなかったり、設定が非常に難しかったり、本当にこの設定でよいのか確信がもてなかったり、万一設定が誤っていてログイン不可能になるのが怖かったりして、やらないで済ませてしまったりすることが実際は多いでしょう。 幸いUbuntuにはベースパッケージ構成に、iptable設定ツールufw(Uncomplicated Fire Wall)が標準搭載されていて、どのツールを使うか悩む必要もなく、その設定もシンプルでおぼえやすいものとなっています。 また本Tipsでは、専用サーバーで実際に設定する場合に、ログイン不能にならないための実践的な工夫や、検証・確認しながら進める工夫をすることで、実践的で理解しやすいものとなるよう配慮しました。 == 前提 == 次の3台のコンピューターを使用して設定や検証を行います。 * 専用サーバー・・・・ufwを設定するコンピューターです。ローカルPCからsshログインされたりnmapされたりします。 * ▼ローカルPC1・・・ユーザーが実際に操作するオフィスや家庭にあるPCで、専用サーバーに常にsshログインしたままにします。こうすることで設定ミスをした場合でも接続が切れないようにします。 * ▽ローカルPC2・・・ユーザーが実際に操作するオフィスや家庭にあるPCです。専用サーバーに対しnmapでポートスキャンするのが主な役割です。たまにsshログインの検証にも用いられます。 (▼▽等の記号は、それぞれのコンピューター上での操作を示します。) (なお、本当はPCを2台も用意する必要はなく、同じローカルPC上の異なる端末セッションで上記と論理上同様な複数セッション化をしたり、KVMやXen等の仮想化を用いて複数化すれば良いのかもしれません。が、たまたま物理的に手元に使えるPCが複数あったり、全ての仮想化環境や端末ソフトがいつでも同じように動作するのかどうかを検証するわけにはいかないため、検証していません。) まず、専用サーバー(10.0.1.100)にポートスキャンツールnmapをインストールしましょう。 ▽ローカルPC2:専用サーバー(10.0.1.100)にログインし、nmapをインストール。 {{{ myaccount@myhost:~$ sudo apt install nmap↓ }}} 次に、専用サーバーの初期状態(デフォルト)を知るために、ローカルPC2からnmapでチェックしてみましょう。 ▽ローカルPC2:専用サーバー(10.0.1.100)に対しnmapでポートスキャンします。 {{{ myaccount@myhost:~$ nmap 10.0.1.100 Starting Nmap 5.00 ( http://nmap.org ) at 2010-01-20 00:17 CST Interesting ports on 10.0.1.100: Not shown: 999 closed ports PORT STATE SERVICE 22/tcp open ssh Nmap done: 1 IP address (1 host up) scanned in 0.32 seconds }}} * 専用サーバー(10.0.1.100)のsshの22番ポートが開いている状態であることがわかります。 ▼ローカルPC1:ufwのステータス(状況)を確認します。 {{{ myaccount@localhost:~$ sudo ufw status Status: inactive }}} * まだufwを有効にしていないので、Status: inactive(ステータス:停止中)とだけ表示されます。 ▼ローカルPC1:ufwのデフォルト設定をdenyに設定してみます。 {{{ myaccount@localhost:~$ sudo ufw default deny Default incoming policy changed to 'deny' (be sure to update your rules accordingly) }}} ▼ローカルPC1:ufwのステータス(状況)を確認します。 {{{ myaccount@localhost:~$ sudo ufw status Status: inactive }}} * まだufwを有効にしていないので、Status: inactiveの表示のままです。 ▽ローカルPC2:nmapでポートスキャンしてみます。 {{{ myaccount@myhost:~$ nmap 10.0.1.100 Starting Nmap 5.00 ( http://nmap.org ) at 2010-01-20 00:17 CST Interesting ports on 10.0.1.100: Not shown: 999 closed ports PORT STATE SERVICE 22/tcp open ssh Nmap done: 1 IP address (1 host up) scanned in 0.32 seconds }}} * まだufwをactive(有効)にしていないので当然まだ全く変化はありません。 ▼ローカルPC1:ufwをactive(有効)にしてみます。 {{{ myaccount@localhost:~$ sudo ufw enable Command may disrupt existing ssh connections. Proceed with operation (y|n)? }}} * ここで質問にはyを入力しましょう。 ▼ローカルPC1:次のようなメッセージが表示され、ファイアウォールが有効化されます。 {{{ Firewall is active and enabled on system startup }}} ▼ローカルPC1:status(ステータス=状況)を確認します。 {{{ myaccount@localhost:~$ sudo ufw status Status: active }}} * ステータスがactive(有効=動作中)になりました。 * ここで、デフォルトdeny設定で、active(有効=動作中)にしても、接続が切れないことに注目しましょう。 ▽ローカルPC2:nmapでポートスキャンしてみます。 {{{ myaccount@myhost:~$ nmap 10.0.1.100 Starting Nmap 5.00 ( http://nmap.org ) at 2010-01-20 00:24 CST Note: Host seems down. If it is really up, but blocking our ping probes, try -PN Nmap done: 1 IP address (0 hosts up) scanned in 3.09 seconds }}} * さっきまで通っていたsshの22番ポートが通らなくなっていることがわかります。 ▽ローカルPC2:この時点で専用サーバーにsshアクセスしてみましょう。 {{{ myaccount@myhost:~$ ssh -l myaccount 10.0.1.100 ^C }}} * 全く反応がないため、やむなく[Control]キーと[C]キーを同時に押して、キャンセルせざるをえなくなっています。 * sshが通らない状態になっていることがわかります。 ▼ローカルPC1:sshのポート22を通す設定をします。 {{{ myaccount@localhost:~$ sudo ufw allow 22 Rule updated }}} ▼ローカルPC1:ufwのステータスを確認してみましょう。 {{{ myaccount@localhost:~$ sudo ufw status Status: active To Action From -- ------ ---- 22 ALLOW Anywhere }}} * sshの22番ポートがALLOWになりました。 ▽ローカルPC2:ここで、nmapでポートスキャンしてみましょう。 {{{ myaccount@myhost:~$ nmap 10.0.1.100 Starting Nmap 5.00 ( http://nmap.org ) at 2010-01-20 00:31 CST Note: Host seems down. If it is really up, but blocking our ping probes, try -PN Nmap done: 1 IP address (0 hosts up) scanned in 3.10 seconds }}} * 依然として空きポートがスキャンできない状態のようです。 ▽ローカルPC2:ここでいつもはnmapしているローカルPC2からsshログインを試してみましょう。 {{{ myaccount@myhost:~$ ssh -l myaccount 10.0.1.100 The authenticity of host '10.0.1.100 (10.0.1.100)' can't be established. RSA key fingerprint is d6:4d:7c:2b:2d:db:eb:9b:e2:5f:25:60:4d:de:93:a1. Are you sure you want to continue connecting (yes/no)? }}} ▽ローカルPC2:yesを入力して進めます。 {{{ Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '10.0.1.100' (RSA) to the list of known hosts. myaccount@10.0.1.100's password: }}} * ここではパスワードを入力します。 ▽ローカルPC2:次のように表示され、無事にsshログインできます。 {{{ Linux localhost 2.6.31-17-generic-pae #54-Ubuntu SMP Thu Dec 10 17:23:29 UTC 2009 i686 To access official Ubuntu documentation, please visit: http://help.ubuntu.com/ Last login: Wed Jan 20 00:11:44 2010 from 10.0.1.5 myaccount@localhost:~$ }}} ▽ローカルPC2:いったんログアウトしておきましょう。 {{{ myaccount@localhost:~$ exit logout Connection to 10.0.1.100 closed. }}} ▼ローカルPC1:別のコンピューター(ローカルPC2)からsshアクセスできたので、サーバーを再起動してローカルPC1からもsshアクセス可能かどうか試してみましょう。 {{{ myaccount@localhost:~$ sudo reboot The system is going down for reboot NOW! Connection to 10.0.1.100 closed by remote host. }}} ▼ローカルPC1:専用サーバーにsshログインしてみましょう。 {{{ Shige-no-MacBook:~ shige$ ssh -l myaccount 10.0.1.100 myaccount@10.0.1.100's password: Linux localhost 2.6.31-17-generic-pae #54-Ubuntu SMP Thu Dec 10 17:23:29 UTC 2009 i686 To access official Ubuntu documentation, please visit: http://help.ubuntu.com/ Last login: Wed Jan 20 00:32:43 2010 from 10.0.1.5 }}} * 無事にログインできました。 ▼ローカルPC1:サーバーがシステム再起動後にufwの設定はどのようになっているか確認してみましょう。 {{{ myaccount@localhost:~$ sudo ufw status [sudo] password for myaccount: Status: active To Action From -- ------ ---- 22 ALLOW Anywhere }}} * システム再起動してもufwの設定はそのままであることがわかります。 ▽ローカルPC2:サーバー再起動した直後にnmapでポートスキャンしてみましょう。 {{{ myaccount@myhost:~$ nmap 10.0.1.100 Starting Nmap 5.00 ( http://nmap.org ) at 2010-01-20 00:41 CST Note: Host seems down. If it is really up, but blocking our ping probes, try -PN Nmap done: 1 IP address (0 hosts up) scanned in 3.09 seconds }}} * やはり全てのポートがふさがっています。 ▼ローカルPC1:ここで検証目的でufwのデフォルトをallowにしてみましょう。 {{{ myaccount@localhost:~$ sudo ufw default allow Default incoming policy changed to 'allow' (be sure to update your rules accordingly) }}} ▼ローカルPC1:ステータスを確認します。 {{{ myaccount@localhost:~$ sudo ufw status Status: active To Action From -- ------ ---- 22 ALLOW Anywhere }}} ▽ローカルPC2:nmapしてみましょう。 {{{ myaccount@myhost:~$ nmap 10.0.1.100 Starting Nmap 5.00 ( http://nmap.org ) at 2010-01-20 00:55 CST Interesting ports on 10.0.1.100: Not shown: 999 closed ports PORT STATE SERVICE 22/tcp open ssh Nmap done: 1 IP address (1 host up) scanned in 0.19 seconds }}} * ポート22番の空きがスキャンできるようになりました。 ▼ローカルPC1:ここで、デフォルトをdenyにまた戻してみましょう。 {{{ myaccount@localhost:~$ sudo ufw default deny Default incoming policy changed to 'deny' (be sure to update your rules accordingly) }}} ▼ローカルPC1:ステータスを確認します。 {{{ myaccount@localhost:~$ sudo ufw status Status: active To Action From -- ------ ---- 22 ALLOW Anywhere }}} ▽ローカルPC2:再度、nmapでポートスキャンを試してみましょう。 {{{ myaccount@myhost:~$ nmap 10.0.1.100 Starting Nmap 5.00 ( http://nmap.org ) at 2010-01-20 00:57 CST Note: Host seems down. If it is really up, but blocking our ping probes, try -PN Nmap done: 1 IP address (0 hosts up) scanned in 3.09 seconds }}} * やはり、先程まで見えていた22番ポートさえも検出されないようになりました。 以上で、ファーストエイドとしての(最初の一歩としての)、ufwの設定と検証は一段落です。 今後はサーバーにインストールするデーモンやアプリケーションに応じて対応するポートを徐々に・順次開けていくと良いでしょう。 ufw等のファイアウォールの設定や設定変更する際の実践的なポイントは次の通り。 * 必ずローカルな環境で検証してから、実際の専用サーバーに適用するようにしましょう。 * 実際に専用サーバーに適用する場合でも、最低1セッションは常にssh接続したままにしておきましょう。(検証は別のセッションからnmap等でポートスキャンしましょう。) * 当然ですがホワイトリスト方式(デフォルトdenyに設定し、必要なポートだけを順次開けていくやり方)で設定しましょう。ブラックリスト方式(デフォルトallowに設定し、通したくないポートを順次閉じていくやり方)の逆のやり方です。