Ubuntu Weekly Recipe

第77回 Ubuntuのソフトウェアファイアウォール:ufwの利用(2)

この記事を読むのに必要な時間:およそ 4.5 分

gufwの利用

コマンドによる操作に抵抗がある場合,ufwには「gufw」というGUIフロントエンドが存在します(注3)⁠デフォルトではインストールされていませんが,Synapticからgufwパッケージをインストールするか,以下のコマンドで導入できます。

$ sudo apt-get install gufw

gufwは,⁠システム]⁠⁠システム管理]⁠⁠ファイアウォールの設定]から起動できます図6)⁠

図6 gufwのメニュー

図6 gufwのメニュー

メインウインドウ図7で,ufwの有効/無効の切り替え(ufw enable・disable)⁠⁠外部からのトラフィックを拒否・許可する」⁠ufw default deny・default allow)⁠各種ルールの追加が可能です。

図7 gufwのメインウインドウ

図7 gufwのメインウインドウ

また,⁠編集]⁠⁠設定]から,gufwそのものの設定を変更することが可能です図8)⁠

図8 gufwのメインウインドウ

図8 gufwのメインウインドウ

設定のうち,⁠ログイン時に自動起動する」には注意が必要です。これはufwの有効・無効の制御ではなく,⁠gufwそのものをログイン時に起動するかどうか」を制御します。ufwそのものの制御は,メイン画面の有効・無効の切り替えを用いてください。

たいていの環境では,⁠トレイアイコンを表示する」⁠閉じたらトレイアイコンに最小化する」⁠ログイン時に自動起動する」を有効にしておき,必要に応じてトレイアイコンから呼び出せるようにしておくと便利でしょう。

注3
ただし,ufwの基本的な概念を理解していないと設定しにくいので,コマンド構文を覚えなくて済む,というのが主なメリットとなります。⁠よく分からないが,なんとなく設定すると動作する」というタイプのGUIではありません。

ufwによる設定のサンプル

ここまでに登場したものを含めて,ufwを利用したファイアウォール設定の実例(+サーバーソフトウェアの設定変更)を幾つか挙げておきます。

HTTPサービスを提供するマシン

Apache(apache2.2-*)を導入し,HTTPとHTTPSでコンテンツを配信するサーバーを考えてみましょう。日常的なメンテナンス作業にはSSHを利用するものとし,HTTPとHTTPS以外のサービスは存在しないものとします。

このような環境では,ufwを以下のように設定していきます。

まず,ufwのデフォルト指定はsudo ufw denyにしておきます。ポリシーによってはrejectにしても良いのですが,後述の理由でポートスキャンを容易に行われる状態を避けたいので注4)⁠denyの方が妥当でしょう。

$ sudo ufw deny
注4
denyであれば,⁠開いていないポートである」ことを確認するためにタイムアウト待ちが必要ですが,rejectの場合はすぐにConnection Refusedが返ってしまうため,ポートスキャンを行う攻撃者にとって有利です。

この状態ではサービスに利用するポートも閉じられた状態ですので,HTTP・HTTPS関連のポートを開放します。apache2.2-commonパッケージにはufwのアプリケーションプロファイルとなる/etc/ufw/applications.d/apache2.2-commonが含まれていますので,次のようにufw app操作を用いることで,容易に設定することができます。

$ sudo ufw app list | egrep -i apache
  Apache
  Apache Full
  Apache Secure
$ sudo ufw allow 'Apache Full'

これでHTTP・HTTPSのそれぞれの待ち受けポートを開くことができました注5)⁠さらにSSHのポートを,⁠LIMIT」で開いておきましょう。

$ sudo ufw app list | egrep -i ssh   
  OpenSSH
$ sudo ufw limit OpenSSH

これで,⁠HTTP・HTTPS・SSHだけを開いたサーバー」が設定できました。……が,これだけではやや危険な状態です。SSHをport 22で待ち受ける状態にするのではなく,SSHの待ち受けポートを変更しておきましょう。多くのSSHブルートフォースアタックはport 22を狙いますので,ポートを変更しておくことで,攻撃を受ける機会そのものを減らすことができます注6)⁠

注5
本文中では触れていませんが,⁠Apache」はHTTP単独の,⁠Apache Secure」はHTTPS単独,そして「Apache Full」がHTTP・HTTPS双方の有効化のためのプロファイルとなっています。
注6
ポートを変更し,LIMITをかけているだけでは完全な防御ではありません。SSH接続を試み,長時間ブルートフォースアタックを仕掛けることが可能であれば,理論上はいつかはパスワードを破られてしまいます。少なくとも外部に公開するサーバーであれば,SSHの認証に弱いパスワードを使うべきではありません。公開鍵認証を用いるのが妥当です。パスワード認証を使わざるをえない場合,最低でも8文字,安全を見込むなら10文字で,かつ,数字や記号・大文字・小文字の混じったパスワードを用いるべきです。

次のように設定を行います。

まず,SSHの設定ファイル/etc/ssh/sshd_configの,⁠Port 22」という設定項目を,⁠Port 4242」などに変更します。このポート番号はできるだけランダムな(推定しにくい)ものが良いでしょう。

$ gksu gedit /etc/ssh/sshd_config

設定を修正したら,SSHデーモンを再起動します。

$sudo /etc/init.d/ssh restart

これでSSHの待ち受けポートが,4242に変更されました。この状態のシステムにSSHでアクセスする場合,⁠ssh -p 4242 サーバ名」という形で,⁠-p 4242」をオプションとして追加します。また,scpの場合は「-P 4242」と,大文字Pで指定します。これにより,少なくともport 22を固定的に狙うSSHブルートフォースアタックについては回避することが可能です。

ただし,この状態では,ufwの「app」による指定が行えません。以下のようにポートを指定してLIMITを設定するのが一つの手です。

$ sudo ufw limit 4242

ですが,この状態でstatusを表示しても,以下のように表示されてしまいます。これでは,⁠4242とは何のポートなのか」というのが,すぐには分からなくなってしまうででしょう。一人の管理者が利用するシステムでは良いのですが,複数の管理者で共同管理しているようなシステムの場合,これは致命的です。

$ sudo ufw status
Status: active

To                         アクションFrom
--                         -------------------
Apache Full                ALLOW   Anywhere
4242                       ALLOW   Anywhere

このような場合には,ufwのアプリケーションプロファイルを書いて解決することができます。アプリケーションプロファイルは非常に単純な構造になっていますから,修正は容易です。以下はデフォルトのOpenSSHのプロファイルです。

[OpenSSH]
title=Secure shell server, an rshd replacement
description=OpenSSH is a free implementation of the Secure Shell protocol.
ports=22/tcp

これをコピーして,今回の修正に合わせた,別のSSHプロファイルを作成しましょう。

$ cd /etc/ufw/applications.d
$ sudo cp openssh-server openssh-server-another
$ gksu gedit openssh-server-another

エディタで「[OpenSSH]」の部分を「[OpenSSH Another]」へ,⁠ports=22/tcp」の箇所を「ports=4242/tcp」に修正してください。

[OpenSSH Another]
title=Secure shell server, an rshd replacement
description=OpenSSH is a free implementation of the Secure Shell protocol.
ports=4242/tcp

この状態でアプリケーションプロファイルを確認すると,以下のように「OpenSSH Another」というプロファイルが追加されているはずです。

$ sudo ufw app list | egrep -i ssh
  OpenSSH
  OpenSSH Another

あとは,以下のように,⁠OpenSSH Another」プロファイルを用いてLIMITを設定するだけです。

$ sudo ufw limit 'OpenSSH Another'

この状態でstatusを表示すると,以下のように「OpenSSH Another」と表示されます注7)⁠複数の管理者が存在する場合でも,設定がそのまま意思表示になりますので,誤解による設定ミスが引き起こされる可能性を下げることができるでしょう。

$ sudo ufw status
Status: active

To                         アクションFrom
--                         -------------------
Apache Full                ALLOW   Anywhere
OpenSSH Another            LIMIT   Anywhere

といったところで,今週はここまで。来週は,Ubuntu Japanese Teamのリーダーである小林さんが担当する予定です。

注7
ただ,現実的には「4242が何のポートなのかわからない」ということは,⁠sshで接続する際,どのポートにつなげばいいのかわからない」ということと同義ですから,あまり望ましい状態ではありません。

著者プロフィール

吉田史(よしだふみひと)

Ubuntu Japanese Team Member株式会社創夢所属。システム管理を中心にWindows/PC Unixを併用している。Ubuntu Japanese Teamではパッケージサーバの管理や翻訳などの作業を担当。

コメント

コメントの記入