Dify導入のためのLinuxセキュリティ強化:firewalldで国内IPのみ許可設定

Dify環境構築

Difyサーバーを安全に運用するためには、SSHのポート変更やrootログイン禁止といった基本的な設定に加え、ファイアウォールの設定が不可欠です。

特に、Webアプリケーションサーバーは常にインターネット全体からの攻撃対象となりますが、その多くは海外のIPアドレスから発信されています。

この記事では、Difyサーバーのセキュリティを飛躍的に高めるため、firewalld を利用して日本国内のIPアドレスからのアクセスのみを許可する具体的な手順を解説します。

【前提条件】

  • この記事の手順は、firewalld がインストールされ、有効になっていることを前提としています。
    • Ubuntuのデフォルトは ufw です。もし firewalld を使用する場合は、sudo apt install firewalld などで事前にインストールし、ufw を無効化(sudo ufw disable)しておく必要があります。
  • wget コマンドがインストールされていること。(sudo apt install wget

 

ステップ1: 日本国内のIPアドレスリストをダウンロードする

まず、許可対象とする日本国内のIPv4アドレスリストをダウンロードします。ここでは、信頼できるIPアドレスリストを提供している ipv4.fetus.jp を利用します。

# IPアドレスリストを「domestic.txt」という名前でダウンロード
wget -O domestic.txt 
https://ipv4.fetus.jp/jp.txt
(https://ipv4.fetus.jp/jp.txt)

ステップ2: firewalld に「domestic」ゾーンと ipset を作成する

次に、firewalld に「国内専用」の新しいゾーンと、そこに適用するIPアドレスのリスト(ipset)を作成します。

# 1. 「domestic」という名前の新しいゾーンを永続設定として作成
sudo firewall-cmd --permanent --new-zone=domestic

# 2. 「domestic」という名前の ipset(IPアドレスの集合)を永続設定として作成
#    タイプは「hash:net」を指定します
sudo firewall-cmd --permanent --new-ipset=domestic --type=hash:net

ステップ3: IPアドレスリストを ipset に登録する

ステップ1でダウンロードした domestic.txt の中身(大量のIPアドレス)を、ステップ2で作成した domesticipset に一括で流し込みます。

# domestic.txt ファイルからIPアドレスを読み込み、domestic の ipset に追加
sudo firewall-cmd --permanent --ipset=domestic --add-entries-from-file=domestic.txt

ステップ4: ipset を「domestic」ゾーンに適用する

作成した domestic ゾーンの通信許可対象(source)として、IPアドレスが登録された ipset:domestic を指定します。

# domestic ゾーンの通信元(source)を、ipset:domestic に限定する
sudo firewall-cmd --permanent --zone=domestic --add-source=ipset:domestic

この設定により、「ipset:domestic に含まれるIPアドレス(=国内IP)」からアクセスがあった場合のみ、domestic ゾーンのルールが適用されるようになります。

ステップ5: 「domestic」ゾーンに許可するサービスを追加する

domestic ゾーン(=国内IP)からのアクセスに対して、Difyの運用に必要なサービス(ポート)を許可します。

重要: Difyサーバーの場合、最低限以下の3つが必要です。

  • SSH: サーバー管理用。以前の記事でポート番号を変更したはずです。(例:10022)
  • HTTP (80/tcp): Webアクセス用。(Let’s EncryptでのSSL証明書更新にも必要)
  • HTTPS (443/tcp): Webアクセス用。(SSL/TLSによる暗号化通信)
# 【重要】変更したSSHポートを許可 (例: 10022番ポート)
sudo firewall-cmd --permanent --zone=domestic --add-port=10022/tcp

# HTTP (80番ポート) を許可
sudo firewall-cmd --permanent --zone=domestic --add-service=http

# HTTPS (443番ポート) を許可
sudo firewall-cmd --permanent --zone=domestic --add-service=https

(参考記事では imapssmtps が例示されていますが、Difyの運用に合わせて上記のように変更しています。)

ステップ6: (注意)デフォルトゾーンの設定を見直す

このままでは、国内IP以外からのアクセス(ipset:domestic に一致しないアクセス)は、デフォルトのゾーン(通常は public)のルールで処理されてしまいます。

public ゾーンでSSHやHTTPが許可されていると、国外からのアクセスも許可されてしまうため、public ゾーンからはこれらの許可設定を削除する必要があります。

# デフォルトゾーン(public)からSSHの許可を削除
sudo firewall-cmd --permanent --zone=public --remove-service=ssh

# デフォルトゾーン(public)からHTTPの許可を削除
sudo firewall-cmd --permanent --zone=public --remove-service=http

# デフォルトゾーン(public)からHTTPSの許可を削除
sudo firewall-cmd --permanent --zone=public --remove-service=https

(もし変更したSSHポート 10022/tcp などを public ゾーンで許可していた場合は、--remove-port=10022/tcp で削除してください)

これにより、国内IP (domestic ゾーン) からはSSH, HTTP, HTTPS が許可され、それ以外 (public ゾーンなど) からは拒否される、という強力なセキュリティ設定が実現します。

ステップ7: 設定の反映と後片付け

最後に、これまでの設定を firewalld に再読み込みさせ、不要になったIPリストファイルを削除します。

# firewalld の設定をリロードして反映
sudo firewall-cmd --reload

# 正常にリロードされたことを確認
echo $?
# (0 と表示されれば成功)

# 不要になったIPアドレスリストを削除
rm domestic.txt

まとめ

これで、Difyサーバーへのアクセスを日本国内に限定する設定が完了です。

この設定は、海外のボットネットや攻撃者からの無差別なスキャン、ブルートフォースアタックの大半をファイアウォールレベルで遮断できるため、サーバーのセキュリティを大幅に向上させます。

コメント

error: Content is protected !!