Ubuntu Weekly Recipe

第76回 Ubuntuのソフトウェアファイアウォール:UFWの利用(1)

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

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

図1 ufwの有効化

図1 ufwの有効化

これで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)。何も設定していない場合,「状態:アクティブ」とだけ表示されるはずです。無効になっている場合は,「状態:非アクティブ」です。

図2 ufwのstatus

図2 ufwのstatus

また,ufwのコマンド一覧は「sudo ufw help」で出力することができます図3)。コマンドの引数を忘れてしまった場合は,これらを利用すると良いでしょう。

図3 ufwのhelp

図3 ufwのhelp

著者プロフィール

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

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

コメント

コメントの記入