Ubuntu Weekly Recipe

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

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

先週に引き続き,今回もufwを使いこなすためのレシピを紹介します。今回は実践編となりますので,先週の基礎操作編とあわせて利用してください。

特定のIPアドレスからの接続を許可する

ネットワークの構成上,「このIPアドレスからの接続は安全であると仮定してもいい」(そこには自分が普段使うマシンしかない)といったこともあるでしょう。このような場合は,次の構文を用います。

$ sudo ufw allow from 192.168.254.0/24

この設定は,「192.168.254.*に属するホストからのすべての通信を許す」というものです。個別のホスト単位にしたい場合は,次のようにIPアドレスを指定してください。以下では,192.168.254.10からのすべての通信を受け付けるように設定しています。

$ sudo ufw allow from 192.168.254.10

さらに,以下のようにポート単位で「そのホストからの接続を許可する」設定を書くことができます。以下は,SSHが利用するポート(=22)を,192.168.254.20というホストに対して許しています。

$ sudo ufw allow from 192.168.254.20 to any port ssh

上記では/etc/servicesに書かれている「ssh」というサービス名での表記をしていますが,「22/tcp」などとすることも可能です。さらに,ここで行う指定でapp構文を利用することもできます。

以下は,「192.168.254.*のホストからのSamba関連の接続要求は許す」というものです。

$ sudo ufw allow from 192.168.254.0/24 to any app Samba

ルールの組み合わせと入れ替え

前掲のLIMITキーワードによる指定を行った場合,scpによるコピーなど,「適切な通信にもかかわらず,ufwのLIMIT条件にマッチしてしまう」といった困った状態が起こりえます。

次のような環境を想定してみましょう。

  • SSHサーバーは,外部のネットワークと内部のネットワークの双方に接続されている。
  • 外部からのSSHブルートフォースを防ぎたい。
  • 内部からは,192.168.254.10からscpを用いてコンテンツをアップロードしている。
  • このscpは非常に頻繁に行われている。

このような環境では,そのままではsudo ufw limit sshを実行するわけにはいきません。scpによるコピーまでもLIMIT条件に引っかかってしまい,通信不能になってしまうおそれがあるからです。

このような場合は,「特定のIPアドレスからの接続を許可」し,「それ以外の接続はLIMIT」という設定が必要です。次のようにルールを組み合わせて設定します。

$ sudo ufw allow from 192.168.254.10 to any port ssh
$ sudo ufw limit ssh

このように設定することで,192.168.254.10からのssh(=scp)接続は自由に行える一方,それ以外のホストからの接続はLIMITにより制限される,という状態になります図1)。

図1 特定のホストだけ無制限にし,他をLIMITした状態

図1 特定のホストだけ無制限にし,他をLIMITした状態

ここで重要なのは,ルールの設定順です。

上記の設定手順では,「特定のIPアドレスからの接続を許可」した後に,「全ての接続をLIMIT」という順番でルールを指定しています。ufwのルールは上からチェックされますので,この順番が逆になると,「全ての接続をLIMIT」だけが有効になってしまいます。ufwは通常の動作では,「登録した順番で」ルールを評価します。このため,以下のように「全てのSSH接続のLIMIT」を先に設定してしまった場合,そちらの方が優先されてしまいます。


・誤った例
$ sudo ufw limit ssh
$ sudo ufw allow from 192.168.254.10 to any port ssh

この状態でstatusを見ると,以下図2のように,「LIMIT」指定の方が上に来ているはずです。

図2 誤って先にLIMITを指定した状態

図2 誤って先にLIMITを指定した状態

このような状況で,正しい設定に戻すにはどうすればいいのでしょうか?

一つの方法は,単純に,「全てのSSH接続のLIMIT」指定を削除してから,再度追加することです。以下のように操作します。

$ sudo ufw delete limit ssh
$ sudo ufw limit ssh

この状態でstatusを見ると,正しい設定になっていることが確認できます図3)。

図3 delete後に再追加することで,順番が変化

図3 delete後に再追加することで,順番が変化

ただし,必ずしも削除と追加だけで問題を解決できるわけではありません。より複雑な設定の場合,「設定ルールのこの場所に,新しいルールを追加したい」といった要望もありえます。たとえば,「192.168.254.10からのSSHは許し,192.168.254.20からのSSHはLIMITで限定的に許す。他のSSH接続は全て拒否」などといった場合です。

このような場合,sudo ufw status numberedとinsertキーワードを利用して,「指定した箇所にルールを追加」する操作を行います。

最初に,ufw status numberedで,ルールのナンバーを表示する状態で一覧します図4)。

$ sudo ufw status numbered

図4 ufw status numbered

図4 ufw status numbered

図4における,「1」,もしくは「2」の欄にLIMIT 192.168.254.20のルールが入れば良いわけです注1)。ufwの「insert」を使うことで,「1」の位置にルールを挿入することができます。insertで指定しない場合,常にルールの最後の位置に追加されることになります注2)。

$ sudo ufw delete limit from 192.168.254.20 to any port ssh
$ sudo ufw insert 1 limit from 192.168.254.20 to any port ssh
注1
この例ではルールが三つしかありませんから,現実的にはDENYする設定を削除して追加しなおせば解決します。ですが,より多くのルールが存在する場合,非常に厄介なことになるでしょう。
注2
ただし,この例ではすでに「LIMIT 192.168.254.20」のルールが存在していますので,このルールを削除する必要があります。若干挙動としては不完全ですが(同じルールがinsertされたのなら,それは「移動」として扱う方が妥当な挙動です),このあたりはufwの将来の拡張に期待してください。

この操作を実際に行った例は,図5のようになります。

図5 delete後にinsertした結果

図5 delete後にinsertした結果

著者プロフィール

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

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

コメント

コメントの記入