Ubuntu Weekly Recipe
第76回 Ubuntuのソフトウェアファイアウォール:UFWの利用(1)
ufw(Uncomplicated FireWall)は,Ubuntuで標準的に利用できる,「iptablesを簡単に設定するツール」です。ufwを利用することで,「外部からの接続は基本的に受け付けない」「sshだけは許す」などといった設定を,iptablesにくらべて格段に少ない操作で実現できます。
今回と次回の2回にわけて,ufwを使って,サーバーなどの設定を簡単に行うレシピを紹介します。
ufwの基本
ufwは,Canonicalの社員であり,Ubuntuのセキュリティ関連モジュールやセキュリティアップデートを主に担当しているJamie Strandboge氏が中心になって開発している,「iptablesのフロントエンド」となるツールです(注1)。Ubuntuには8.04で取り込まれています。過去に本レシピでも,第45回でごく軽く内容を紹介しています。
今回はコマンドラインからufwを使う方法のうち,基礎的な部分を紹介します。次回はより実践的な設定の例と,gufwによるGUI設定の手順を紹介する予定です。
- 注1
- 厳密に言うのであれば,ufwは「NetFilterの設定フロントエンド」となるユーザーランドツールです。ufwが提供する機能はあくまでもNetFilterの設定であり,必ずしもiptablesとは関係ありません。ただし,現時点でのufwの実装はiptables・ip6tablesコマンドを実行することで行われていること(ufw/src/backend_iptables.py)と,NetFilterとiptablesの関連を厳密に区分けする必要も微妙なことから,ここでは「iptablesのフロントエンド」としています。
実際にufwを体験する前に,ufwとiptablesの違いを把握しておきましょう。
iptablesは,Linuxでファイアウォールを設定するための標準的なツールです。iptablesの各種モジュールを利用してNetFilterを設定した場合,ファイアウォールとして求められる,ほぼありとあらゆる設定を行うことができます。また,多くの設定方法が存在し,さらにその設定の自由度も高いものです。
ですが,iptablesはその自由度と機能の豊富さから,設定を行うのに専門の知識が必要になります。少なくとも,いきなりiptablesを利用して自由自在に設定を行うことは困難でしょう。たとえば以下はiptablesを用い,「30秒に5回,sshアクセスを試みてきたホストからの接続は300秒間拒絶する」という設定を行ったものです(注2)。
$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ssh tcp -- anywhere anywhere tcp dpt:ssh
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain ssh (1 references)
target prot opt source destination
ACCEPT tcp -- anywhere anywhere tcp flags:!FIN,SYN,RST,ACK/SYN state RELATED,ESTABLISHED
REJECT tcp -- anywhere anywhere tcp flags:FIN,SYN,RST,ACK/SYN recent: UPDATE seconds: 300 name: ssh_block side: source reject-with icmp-port-unreachable
ssh_brute tcp -- anywhere anywhere tcp flags:FIN,SYN,RST,ACK/SYN recent: CHECK seconds: 30 hit_count: 5 name: ssh_conn side: source
tcp -- anywhere anywhere tcp flags:FIN,SYN,RST,ACK/SYN recent: SET name: ssh_conn side: source
ACCEPT tcp -- anywhere anywhere tcp flags:FIN,SYN,RST,ACK/SYN
Chain ssh_brute (1 references)
target prot opt source destination
LOG all -- anywhere anywhere recent: SET name: ssh_block side: source LOG level notice prefix `Auto block: ssh-bruteforce: '
REJECT all -- anywhere anywhere reject-with icmp-port-unreachable
- 注2
- この設定は「TCP port 22への接続回数」が5回に達したら拒否,という動作になっています。注意すべきは,「sshによるパスワード認証の試行」は,「1回のTCP接続で複数回行うことができる」ということです。パスワード認証の場合,1回のTCP接続で3回のチャレンジが可能ですので,この設定では,でたらめなパスワードを30回試すと接続が拒絶される,ということになります。
正当な通信を通すための設定や,「sshへのアクセス回数をカウントする」「閾値を超えたらブロックする」「ログを残す」などといった機能が組み合わさり,すぐに読み取るのは困難なものとなっています。実現したいのは,単に「sshのポートへ一定回数接続が来たら拒否」ということだけですが,iptablesで実現しようとすると,非常に複雑な設定になってしまいます。
これをufwで設定するとどうなるのか,を端的に示すのが以下です。ufwで設定を行った場合,非常に単純に設定できることが分かるはずです(注3)。
$ sudo ufw status
Status: active
To アクションFrom
-- -------------------
OpenSSH LIMIT Anywhere
- 注3
- ただし,ここでは非常に極端な例(ufwに圧倒的に有利な例)を上げています。
ufwは「ソフトウェアファイアウォールとしての機能を,できるだけ単純なインターフェースで設定する」(注4),という設計思想に基づいたツールです。できないことも存在しますが,「できること」であれば,きわめて簡単に設定が可能です。ここからは実際にufwを用いて,接続の制限や許可を設定してみましょう。
- 注4
- ここではファイアウォールを,ハードウェア型のファイアウォールと「ソフトウェアファイアウォール」の二種類に分けています。ハードウェア型のファイアウォールはルータやスイッチと同じように動作し,ネットワークの途中に「はさむ」ことで,不要な通信を抑制する機能を提供するネットワーク機器の一種です。言い換えると,「他のホストに,不要な通信をせき止めるもの」です。一方でソフトウェアファイアウォールはサーバーなどのホスト上で動作し,「自ホストにたどり着いたもののうち,不要な通信をせき止めるもの」で,その名の通り,サーバー上で動作する1ソフトウェアです。LinuxのNetFilter/iptablesはソフトウェアファイアウォールとして機能するものですが,ブリッジ機能などを併用することで,他のホストへの通信をせき止める目的で利用することも可能です。
ufwの基本的な使い方
前述の通り,ufwの一部の機能は第45回で紹介していますが,ここでは一からufwを使う方法を説明します。多くの場合はサーバーで役に立つ機能ですが,「デスクトップマシンにサーバー的な機能を導入しておき,それを他のマシンから利用する」などといった場合にはデスクトップ環境でも役に立つでしょう。
最初にすべての通信を無効にする
ufwの操作は,ターミナルから行います。[アプリケーション]→[アクセサリ]→[端末]を開いて操作を行ってください。ufwは基本的に,「デフォルトではあらゆる外部からの通信を拒否し,許可する通信を定義していく」形で設定を行います(「sudo ufw default ALLOW」を実行することで,「デフォルトでは全て通すが,不要な通信のみを落とす」設定にすることも可能です。ただし,この設定を使うことはあまりないでしょう)。
以下のように,「sudo ufw enable」と端末上で入力してください(図1)。
$ sudo ufw enable
これでufwが有効になっています。ufwは一度有効化すると,システム起動時に自動的に有効になります。この状態を解除するには「sudo ufw disable」を行います(が,ほとんどの場合無効化する必要はないでしょう)。
ここから設定を行っていくことになりますが,ufwが有効になった時点で,まっさきに外部からの通信を受け付けないように設定しておきましょう。以下のように操作します。
$ sudo ufw default DENY
この状態は,外部から見ると,接続を試みるとConnection Refusedが返るのではなく,単にタイムアウトする状態です。もしConnection Refusedを返したい場合は,「sudo ufw default REJECT」を実行してください。
これらの設定を行っても,「外部に出ていく」通信(アウトバウンド)は可能です。ufwはあくまで,「外からの」通信(インバウンド)だけを制御します(注5)ので,たとえば,「トロイの木馬などに感染した場合に,想定していない通信をせき止める」といった用途に利用することはできません。
- 注5
- Windows環境向けの統合セキュリティソフトが提供する「ソフトウェアファイアウォール」の多くは,「内側から外側に出て行く通信」(アウトバウンド)と「外側から内側に入ってくる通信」(インバウンド)の双方を制御することができますが,(今のところ)ufwはあくまでインバウンド通信の制御に特化しています。
その時点でufwが動作しているかどうかは,「sudo ufw status」で確認できます(図2)。何も設定していない場合,「状態:アクティブ」とだけ表示されるはずです。無効になっている場合は,「状態:非アクティブ」です。
また,ufwのコマンド一覧は「sudo ufw help」で出力することができます(図3)。コマンドの引数を忘れてしまった場合は,これらを利用すると良いでしょう。
Ubuntu Weekly Recipe
- 第113回 Debian Liveのlive-helperを使ってUbuntu Liveを作成する
- 第112回 Bansheeを使用して携帯音楽プレーヤと同期する
- 第111回 UbuntuからHDDレコーダを使いこなす(2)動画ファイルのダウンロード
- 第110回 HYBRID W-ZERO3を使いこなす(2)
- 第109回 HDDレコーダを使いこなす(1)DLNAクライアント
- 第108回 HYBRID W-ZERO3を使いこなす(1)
- 第107回 HandBrakeでリッピングしたDVDをNetWalkerで再生する
- 第106回 PulseAudioでリモートスピーカを使う
- 第105回 Acer Aspire Timeline 1410でUbuntu 9.10を動かす
- 第104回 標準搭載予定のPiTiViでビデオ編集
- 2009年11月27日号 9.10のJapanese RemixのHTTP配布・Smartbook・LPIA廃止・GIMPの格下げ・LucidのPapercuts・Webkitベースの軽量ブラウザ・UWN#169
- 2009年11月20日号 UDS-L・Netbook Remixの終了・Ubuntu One Music Store・UWN#168・Firefoxの再アップデート
- 2009年11月6日号 9.10 Japanese Remix・Ubuntu Open Week・10.04の開発開始・FCM#30・UWN#166・Firefoxのセキュリティアップデート
- 2009年10月9日号 9.10のI/Oスケジューラ・Ubuntu Oneの有償プラン・Full Circle Magazine#29・UWN#162・GLibのセキュリティアップデート
- 2009年9月18日号 NetWalkerの先行販売・9.10のAlpha 6・9.10の新機能(『ほぼ』確定版)その3・カウントダウンバナー・10.04のUDS・Firefoxのセキュリティアップデート


