UFWの使い方とVPSでの設定手順|SSHロックアウトを防ぐ方法
UFW(Uncomplicated Firewall)を使ってVPSのセキュリティを強化する基本手順を解説します。設定ミスによるSSHのロックアウトを防ぐための必須コマンドや、デフォルトのdenyポリシー設定、必要なportのみをallowする具体的な方法を分かりやすく説明します。
UFWの概要と導入の目的
UFWはUncomplicated Firewallの略称であり、その名の通り簡潔な設計となっています。これはLinux kernelの既存のfirewallに対する使いやすいフロントエンドです。生のルールを記述する代わりに、ufw allow 22/tcpのような短いコマンドを使用できます。初期状態のVPSでは、すべてのlistenしているサービスがデフォルトでインターネットからアクセス可能です。firewallを導入すると、この状態が逆転します。まずすべてをdeny(拒否)し、その後に実際に使用する少数のportのみをallow(許可)します。この設定変更により、わずか4つのコマンドで攻撃対象となる範囲(exposure)を大幅に削減できます。
設定を行う前に、どのサービスがlistenしているかを確認してください。firewallはそれらのサービスの通信を制御するためです。まずはss -tlnpを使用して、listenしているサービスを確認することが適切な最初のステップです。
自己ロックアウトを防ぐための唯一のルール
firewall の設定で多くの人が失敗する原因がこれです。default-deny ポリシーで UFW を有効にした際、SSH を許可していないと、有効化した瞬間に接続が切断され、再接続できなくなります。UFW を有効にする前に、必ず SSH を許可してください。これが唯一の回避策です。以下の手順は、安全な順序でこれを行います。
万が一ロックアウトされても、対処可能です。プロバイダーの web console(VNC または serial 経由)は SSH を介さないため、そこからログインして ufw disable を実行するか、不足している rule を追加できます。
Step 1: Set the default policies
Start by telling UFW to deny everything coming in and allow everything going out:
sudo ufw default deny incoming
sudo ufw default allow outgoingdeny incoming is the important half. It means any port with no explicit allow rule is closed to the outside, even if a service is listening on it. allow outgoing lets your server reach the internet normally for updates and the like. These two commands change policy only; nothing is enforced until you enable UFW in step 3.
Step 2: 必要なポートのみを許可する
有効化する前に、接続を維持するために SSH を開いてください。
sudo ufw allow 22/tcpUFW は SSH のレート制限も可能です。sudo ufw limit 22/tcp を使用すると、ポートは許可されますが、30秒間に6回以上の接続を試みたアドレスはブロックされます。これにより、追加のソフトウェアなしでブルートフォーススクリプトを抑制できます。
Web サーバーを運用している場合は、HTTP と HTTPS も許可してください。
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp公開するものだけを許可してください。ポート 5432 の Postgres のようなデータベースには、原則として allow ルールを設定すべきではありません。代わりに 127.0.0.1 にバインドし、そのマシン内からのみアクセス可能にしてください。開いたポートはすべて防御すべき入り口となります。リストは最小限に抑えてください。
サーバー用の ufw コマンドの全シーケンスをここで作成し、順番に実行できます。
Step 3: 有効化と動作確認
sudo ufw enableこのコマンドは、既存の SSH 接続が切断される可能性があることを警告します。Step 2 で 22/tcp を許可しているため、現在のセッションは維持されます。結果を確認してください:
sudo ufw status verboseStatus: active
Default: deny (incoming), allow (outgoing)
To Action From
-- ------ ----
22/tcp ALLOW IN Anywhere
22/tcp (v6) ALLOW IN Anywhere (v6)
80/tcp ALLOW IN Anywhereここで2つの点を確認します。Status: active は、firewall が動作していることを示します。また、各ルールは、通常の表示と (v6) を伴う表示の2回ずつ表示されます。これは、UFW が IPv4 と IPv6 の両方を管理していることを意味します。もし (v6) の行が表示されない場合、IPv6 側は管理されていません。これについては IPv6 firewall post で解説しています。
後でルールを管理する
特定のルールを削除するために、番号付きでルールを表示する方法:
sudo ufw status numbered
sudo ufw delete 3特定のIPアドレスからのみポートへのアクセスを許可します。これは、管理サービスを自分のIPのみに公開する際に有効な方法です:
sudo ufw allow from 10.0.0.24 to any port 5432 proto tcpFirewallは一つのレイヤーに過ぎません。Firewallはポートへの到達を制御しますが、SSHのように開いたままのポートへの連続的な攻撃(hammering)を遅延させることはできません。それに対処するには、SSHの前にFail2banを導入して、繰り返し攻撃を行う者を禁止してください。Defence in depth(多層防御)とは、各レイヤーが他のレイヤーでカバーできない部分を補完することを意味します。
Firewallの運用には、ポートの仕組みとサービスのListen方法の理解が不可欠です。また、Firewallの設定は 新しいVPSでの最初の10分間における重要なステップの一つです。
FAQ
UFWを有効にするとSSHセッションが切断されますか?
先にSSHを許可していれば切断されません。sudo ufw enableを実行する前にsudo ufw allow 22/tcpを実行してください。ファイアウォールがport 22を許可するため、接続は維持されます。SSHの許可ルールがない状態で、デフォルトで拒否する設定のファイアウォールを有効にすると、接続が遮断されるため危険です。もし接続が切れた場合は、プロバイダーのVNCまたはシリアルコンソールからログインし、ufw disableを実行してください。
VPSではどのポートを開放すべきですか?
公開する必要があるポートのみを開放してください。サーバー管理用のSSH (22/tcp)、およびウェブサイトを運営する場合はHTTPとHTTPS (80/tcp, 443/tcp) です。それ以外のポートはすべて拒否状態にしてください。データベースなどの内部サービスは127.0.0.1にバインドし、ファイアウォールのルールを設定しないでください。これにより、ネットワークからアクセスできない状態になります。
UFWはIPv6をサポートしていますか?
最新のUbuntuではサポートされています。/etc/default/ufw内でIPV6=yesが設定されているため、各ルールは両方のスタックに適用されます。また、(v6)サフィックスを付けることでufw statusにIPv6のルールが表示されます。発生しうる問題については、IPv6ファイアウォールの落とし穴で説明しています。
UFWのルールを削除する方法は?
sudo ufw status numberedを実行してインデックス番号付きのルール一覧を表示し、次にsudo ufw delete Nを実行します(Nは削除したいルールの番号です)。また、sudo ufw delete allow 80/tcpのように仕様を指定して削除することも可能です。
特定のIPアドレスからのみポートを許可するには?
通常のallowの代わりにfromルールを使用します。PostgreSQLへのアクセスをオフィスのIPアドレスのみに制限するには、sudo ufw allow from 10.0.0.10 to any port 5432 proto tcpを実行してください。デフォルト拒否ポリシーでは、ルールで許可されるまでポートは全員に対して閉じられています。したがって、このfromルールが唯一のアクセス手段となり、インターネット全体はブロックされたまま、指定したアドレスのみが通過できます。全員にポートを開放してしまうため、通常のallow 5432/tcpを併用しないでください。これは、データベースや管理パネルを公開する際の最も安全な方法です。sudo ufw status verboseを実行して、ポートの横に送信元アドレスが表示されることを確認してください。