不正な通信に対して,通信の自動遮断(portsentry を使用)(Ubuntu 上)

Portsentryは不正な通信を検知し自動遮断するツールである.Ubuntu の設定はportsentry.confで監視ポートや検知モードを設定し,portsentry.ignore.staticで除外IPを指定する.Ubuntu 24.04 LTSではnftables連携やsystemdでのサービス管理に留意が必要である.設定確認はログやテストスキャンで行い,ブロック解除はブロックリスト編集で行う.

前準備

Ubuntu のシステム更新

Ubuntu で OS のシステム更新を行う際には, 次のコマンドを実行する.

Ubuntu のインストールは別ページ »で説明する.

# パッケージリストの情報を更新
sudo apt update
# インストール済みのパッケージを包括的に更新 (依存関係も考慮)
sudo apt full-upgrade
# (オプション) 必要に応じてシステムを再起動
sudo shutdown -r now

インストールと設定(Ubuntu 上)

  1. インストール
    # パッケージリストの情報を更新
    sudo apt update
    sudo apt -y install portsentry
    
  2. インストール中にPortsentryの設定に関する質問が表示される場合がある.表示を確認し,環境に合わせて適切に応答する必要がある.
  3. /etc/portsentry/portsentry.conf の設定

    このファイルでは,監視対象ポート,検知モード,遮断方法など,Portsentryの主要な動作を設定する.

    監視対象ポートの設定

    TCP_PORTS および UDP_PORTS の行で,監視対象とするポート番号を指定する.デフォルトでは一般的なポートがリストアップされているが,必要に応じて追記または変更する.

    検知モードの設定

    Portsentryは複数の検知モードをサポートする.主なモードとして,Port Bound Detection (モード 0), Stealth Scan Detection (モード 1), Advanced Stealth Scan Detection (モード 2) がある.より高度なスキャンを検知するためには,Stealth Scan Detection (モード 1) や Advanced Stealth Scan Detection (モード 2) を有効化することが推奨される場合がある.

    • モード 0 (Port Bound Detection): ポートが実際にバインド(待ち受け)されている場合にアクセスを検知する基本的なモードである.
    • モード 1 (Stealth Scan Detection - stcp/sudp): ポートがバインドされているかに関わらず,特定のパケットパターンからステルススキャンを検知するモードである.
    • モード 2 (Advanced Stealth Scan Detection - atcp/audp): 最も高度な検知モードであり,より複雑なスキャン手法に対応する.誤検知のリスクも伴うため,慎重な設定とテストが必要である.

    使用する検知モードは,SCAN_DETECTION_MODE および ADVANCED_SCAN_DETECTION_MODE 等の項目で設定する.必要に応じて該当行のコメントアウト (#) を解除し,モード番号を指定する.高度なモード(atcp/audp)では,確立済み接続からのトラフィックを追跡することで,正規の通信を誤検知しないように設計されている.SCAN_TRIGGER設定を調整することで,一定回数の接続試行があった場合のみブロックするように設定し,誤検知を減らすことも可能である.

    遮断コマンドの設定

    不正通信を検知した際に実行するコマンドを KILL_ROUTE で設定する.デフォルトでは iptables を使用する設定が記載されている.

    KILL_ROUTE="/sbin/iptables -I INPUT -s $TARGET$ -j DROP"
    

    注意: Ubuntu 24.04 LTSではnftablesが標準のファイアウォールフレームワークとなっている場合がある.設定した遮断ルールがシステムで使用されているファイアウォール(例: nftables)と正しく連携するか確認が必要な場合がある.nftablesを使用する場合は,KILL_ROUTE設定を以下のように変更することが推奨される.

    KILL_ROUTE="/usr/sbin/nft insert rule inet filter input position 0 ip saddr $TARGET$ counter drop comment 'portsentry block'"
    

    PortsentryはTCPとUDPの両方のプロトコルで同時に異なるモードで実行することができ,詳細な設定は /etc/default/portsentry で行う.UDPポートスキャン検知(特に BLOCK_UDP オプション)は,インターネットに直接接続されたサーバーではなりすましによるサービス拒否攻撃を受けるリスクがあるため,慎重な設定が必要である.

  4. 監視対象から除外する IP アドレスを記載する.

    内部ネットワークのホストなど,監視対象から除外したいIPアドレスやネットワークを以下のファイルに記載する.監視対象から除外しない場合,正当な通信も不正通信と判定され,自動でアクセスが遮断される可能性があるため,設定に注意が必要である.

    /etc/portsentry/portsentry.ignore.static の設定

    次のように設定する.「XXX.YYY」は適切に読み替えてください.CIDR表記 (例: 192.168.1.0/24, 127.0.0.1/32) が使用可能である.

    XXX.YYY.0.0/24
    127.0.0.1/32
    0.0.0.0
    

    また,portsentry.conf 内の ADVANCED_EXCLUDE_TCP および ADVANCED_EXCLUDE_UDP の設定で,特定のポートを監視対象から除外することも可能である.これにより,正規のサービスが誤ってブロックされるのを防止できる.

  5. 設定ファイルを書き換えたため,portsentryサービスを再起動する.Ubuntu 24.04 LTSではsystemdが使用されており,以下のコマンドで再起動する.
    sudo systemctl restart portsentry
    

設定の確認と運用

設定の確認

設定が正しく反映されportsentryが動作しているか確認するために,別のホストから,設定した監視ポートへ意図的にポートスキャンを実行してみる.nmapなどのツールを使用すると良い.設定した遮断ルールが適用され,接続が拒否されることを確認する.また,ログファイル /var/log/syslog や,ブロックされた履歴が記録される /var/lib/portsentry/portsentry.history を確認し,検知と遮断が記録されているか確認すると良い.長期運用では,ブロックされたIPアドレスのログを定期的に確認し,誤検知によるブロックが無いかを監視することが重要である.

設定ミスの復旧

設定に誤りがあり,正当な通信まで遮断されてしまった場合は,以下のコマンドで一時的にportsentryサービスを停止する.

sudo systemctl stop portsentry

サービス停止後,設定ファイルを修正し,再度サービスを起動する.

ブロックの解除

誤ってIPアドレスがブロックされてしまった場合は,ブロックリストから該当エントリを削除する必要がある.PortsentryがブロックしたIPアドレスは /var/lib/portsentry/portsentry.blocked ファイルに記録されるため,このファイルから該当するIPアドレスの行を削除する.また,Portsentryがファイアウォールに追加したルールも手動で削除する必要がある場合がある.iptablesやnftablesコマンドを使用して,該当する遮断ルールを特定し削除する.