psadを使用してUbuntuVPSでのネットワーク侵入の試みを検出する方法
序章
侵入の試みを示している可能性のあるネットワークアクティビティを検出できると、イベントが発生する前に適切なアクションを実行するのに役立ちます。 この特定の理由により、侵入検知システムを利用できます。
侵入検知システムは、疑わしい接続をログに記録し、異常なアクティビティが発生しているように見える場合に報告するために使用されます。 一部のプログラムは純粋に通知システムとして使用されますが、他のプログラムは、危害を加えることを意図しているように見えるトラフィックを積極的にブロックしようとすることができます。
psad
ツールは、ポートスキャン攻撃検出の略で、ファイアウォールログをアクティブに監視して、スキャンまたは攻撃イベントが進行中であるかどうかを判断するソフトウェアです。 その後、管理者に警告したり、脅威を阻止するための積極的な措置を講じたりすることができます。
このガイドでは、Ubuntu12.04VPSにpsadをインストールして構成する方法について説明します。 手順は他のディストリビューションでもかなり似ているはずです。
psadをインストールします
psad侵入検知システムは、Ubuntuのデフォルトのリポジトリで利用できるため、apt:を介して簡単に取得できます。
sudo apt-get update
sudo apt-get install psad
管理者に警告するようにメール配信を設定するには、postfixメールサーバーを設定するように求められます。
ほとんどの場合、「インターネットサイト」を選択してから、サーバーに関連付けられているドメイン名を入力できます。 これは、psadによって生成された電子メールの「From」フィールドで使用される名前のドメイン部分になります。
IPTablesルールを構成する
psadがサーバーのポートでのアクティビティを検出する方法は、ファイアウォールアプリケーションによって生成されたログを監視することです。 Ubuntuにはデフォルトでiptablesファイアウォールが付属していますが、完全に構成されておらず、デフォルトでは何も監視またはブロックしていません。
次のコマンドを入力するだけでロギングを有効にすることもできますが、より堅牢な構成を行います。
sudo iptables -A INPUT -j LOG
sudo iptables -A FORWARD -j LOG
上記のルールを入力した場合は、最初から開始できるように、構成する前にルールをフラッシュしてください。
sudo iptables -F
次のように入力すると、現在のルール(現時点ではデフォルトのポリシーのみが含まれている必要があります)を確認できます。
sudo iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
これで、主にINPUTチェーンにルールを追加できるようになりました。 iptablesに、不要または不要な接続をドロップするように指示します。 制限を追加する前に、許可された接続を明示的に許可するルールを追加する必要があります。
最初のルールは、サーバーによって生成され、サーバーに向けられたすべてのトラフィックを許可します。 このタイプの接続は、一般に、サービスが相互に通信し、情報を簡単に渡すために使用されます。
sudo iptables -A INPUT -i lo -j ACCEPT
次に、既存の接続に関連するすべてのトラフィックを明示的に許可するルールを追加します。 これにより、現在のセッションを中断することなく継続できます。
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
次に、公開したいサービスを追加します。 SSHの場合、次のような行を追加できます。
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
デフォルトのポート80でWebサーバーを実行している場合は、次のようなルールを追加できます。
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
同じ構文で開いたままにしておきたい、正当で公的にアクセス可能なサービス用の他のポートを追加します。
sudo iptables -A INPUT -p protocol --dport port_num -j ACCEPT
正規のサービスの追加が完了すると、残りのすべての接続が削除されます。 このルールに当てはまるものはすべて、正当なトラフィック用のルールと一致しませんでした。
ただし、その前に、iptablesにトラフィックのログ記録を開始するように指示するルールを追加する必要があります。 これにより、iptablesはまだ処理されていないトラフィックをログに記録します。
sudo iptables -A INPUT -j LOG
また、トラフィックを他の場所に転送することになった場合に備えて、このルールを転送チェーンに追加する必要があります。
sudo iptables -A FORWARD -j LOG
最後に、まだ一致していないすべての無関係なトラフィックをドロップしましょう。 これを行うには、チェーン内のすべてに一致するルールを次のように最後に追加します。
sudo iptables -A INPUT -j DROP
または、組み込みのポリシー機能を使用して、パケットがルールに一致せずにチェーンを通過したときに何が起こるかを構成できます。
sudo iptables -P INPUT DROP
結果は機能的にまったく同じです。
注意すべき点の1つは、iptablesをフラッシュする必要があり、(チェーンの最下部にルールとして追加するのではなく)DROPポリシーを設定した場合は、フラッシュする前にポリシーを逆にする必要があることです。
sudo iptables -P INPUT ACCEPT
sudo iptables -F
これを怠ると、iptablesルールがフラッシュされ、すべての着信パケットをドロップするというデフォルトのポリシーのみが残ります。 これにより、SSH接続からのトラフィックを含む、サーバーに着信するすべてのネットワークトラフィックが遮断されます。
デフォルトでは、iptablesは再起動間でルールを維持しないため、構成をテストし、希望どおりに動作することを確認したら、これらのルールを永続化するツールをダウンロードして有効にすることができます。
sudo apt-get install iptables-persistent
sudo service iptables-persistent start
スキャンを検出するようにpsadを構成する
「デフォルトドロップ」ポリシーと呼ばれるもので構成されたiptablesルールセットができたので、ログの解析を開始するようにpsadの構成を開始できます。
root権限でメインのpsad構成ファイルを開きます。
sudo nano /etc/psad/psad.conf
最初に変更する必要があるのは、ファイルの先頭です。 EMAIL_ADDRESSES
パラメーターを変更して、レポートが生成されたときに通知する電子メールアドレスと一致させる必要があります。 また、HOSTNAME
をドメインに一致するように変更して、正しいマシンを参照するようにする必要があります。
EMAIL_ADDRESSES [email protected], [email protected];
HOSTNAME your_domain.com;
psadがファイルを正しく読み取るために、各行は必ずセミコロン(;)で終了してください。
おそらく見たいと思うセクションの1つは、「危険レベル」の宣言です。 これらのレベルは、psadが脅威レベルを分類するための方法です。
これらは、イベントに関係するパケットの数によって自動的に決定されますが、特定のタイプのトラフィックを特定の危険レベルに割り当てることもできます。 到達する各レベルのデフォルトのしきい値は次のとおりです。
DANGER_LEVEL1 5;
DANGER_LEVEL2 15;
DANGER_LEVEL3 150;
DANGER_LEVEL4 1500;
DANGER_LEVEL5 10000;
これらのレベルは、psadがアラートに使用する感度のレベルに応じて変更できます。
PORT_RANGE_SCAN_THRESHOLD
パラメーターを使用して、psadの感度を構成することもできます。 これにより、アラートが発生する前にスキャンする必要がある範囲内のポートの数が決まります。 デフォルトでは、2つのポートがスキャンされた後にアラートが発生します。
PORT_RANGE_SCAN_THRESHOLD 1;
構成する最も重要なことの1つは、IPT_SYSLOG_FILE
パラメーターです。これは、現在、syslogがデフォルトで使用するファイルを指していないためです。
これを変更してsyslogファイルを指すようにします。ここで、psadは実際にアクティブなログを調べる機会があります。
IPT_SYSLOG_FILE /var/log/syslog;
ポートノッキングなどに特定のポートを使用する場合は、これらのポートでの試行を無視するようにpsadに指示して、日常的なアクティビティを通じてアラートをトリガーしないようにする必要があります。
IGNORE_PORTS ports_or_range_to_ignore;
同様に、適切な名前のIGNORE_PROTOCOLS
、IGNORE_INTERFACES
、およびIGNORE_LOG_PREFIXES
パラメーターを使用して、他のものに基づくメッセージを無視できます。
アラートを頻繁に受け取る場合は、電子メールを送信する前に到達する必要のあるレベルを調整することで、電子メールのしきい値を設定できます。
MIN_DANGER_LEVEL 1; # Controls psad logging and email alerts
EMAIL_ALERT_DANGER_LEVEL 1; # Applies only for email alerts
次のように設定して、メールの数を直接制限することもできます。
EMAIL_LIMIT 0;
ゼロは制限がないことを意味します。 この制限は、単一のIPアドレスからの脅威によって生成される可能性のある電子メールの数です。
とりあえず、ファイルを保存して閉じましょう。
psad侵入検知を実装する
アラート機能を備えた基本的なpsad構成が整ったので、ポリシーを実装してシステムをアクティブ化できます。
始める前に、psadのシグネチャ定義を更新して、既知の攻撃タイプを正しく認識できるようにする必要があります。 これを行うには、次の電話を呼び出します。
sudo psad --sig-update
これにより、最新のファイルがフェッチされ、データベースが更新されます。
次に、これらの更新を使用して構成変更を実装するために、サービスを再起動する必要があります。 タイプ:
sudo service psad restart
これにより、ログの監視が実装されます。 psadで検出されたイベントの現在のステータスを確認するには、次のように入力します。
sudo service psad status
[+] psadwatchd (pid: 3737) %CPU: 0.0 %MEM: 0.0
Running since: Fri Jan 10 15:36:04 2014
[+] psad (pid: 3735) %CPU: 0.0 %MEM: 0.3
Running since: Fri Jan 10 15:36:04 2014
Command line arguments: [none specified]
Alert email address(es): [email protected]
[+] Version: psad v2.1.7
[+] Top 50 signature matches:
[NONE]
[+] Top 25 attackers:
[NONE]
[+] Top 20 scanned ports:
[NONE]
[+] iptables log prefix counters:
[NONE]
Total packet counters: tcp: 0, udp: 0, icmp: 0
[+] IP Status Detail:
[NONE]
Total scan sources: 0
Total scan destinations: 0
[+] These results are available in: /var/log/psad/status.out
ご覧のとおり、まだ何も見つかりませんでした。 また、検出されたイベントが/var/log/psad/
にあるファイルに記録されていることもわかります。
テストポートスキャンを実行します
別のコンピューターから、サーバーのポートをスキャンしてファイアウォールにヒットを生成する必要があります。 これは、nmap
ユーティリティを使用して実行できます。
別のマシンからSYNtcpポートスキャンを実行します。 -PN
オプションを渡すことにより、ホストが稼働していると想定するように指示します。
sudo nmap -PN -sS server_domain_or_ip
Starting Nmap 5.51 ( http://nmap.org ) at 2014-01-10 15:54 EST
Nmap scan report for server_domain_or_ip
Host is up (0.013s latency).
Not shown: 999 filtered ports
PORT STATE SERVICE
22/tcp open ssh
Nmap done: 1 IP address (1 host up) scanned in 6.84 seconds
ご覧のとおり、このスキャンはファイアウォールに何を構成したかを示しています。 公開されているSSHポートを除いて、すべてのポートには「フィルター済み」のラベルが付いており、ファイアウォールによって保護されていることを示しています。
サーバーで、statusコマンドを再実行する必要があります。
sudo service psad status
アラートのリストがもっと大きくなるはずです。 このイベントは1000ポートスキャンであったため、さまざまな脅威のシグニチャ一致がトリガーされました。 特定のポートまたはエントリポイントに焦点を当てた、より鋭い攻撃の場合、シグニチャははるかに役立ちます。
電子メールアラートを設定した場合は、1〜2通の電子メールも受信しているはずです。 スキャン元のコンピューターに関連付けられたドメインがある場合は、スキャンに関連付けられた所有者に関する「whois」レポートが表示されます。
これを使用して、IPの所有者、またはおそらくISPまたはホスティングプロバイダーに連絡を試みることができます。
侵入防止を実装する
サーバーにアクセスしようとしているアクティビティを検出できることを確認したので、オプションで、psadがiptablesルールを自動的に変更してスキャナーを禁止できる防止メカニズムを実装できます。
これを行う前に、auto_dl
ファイルを確認する必要があります。
sudo nano /etc/psad/auto_dl
このファイルは、特定のIPアドレスを自動的に設定する必要がある危険レベルを指定します。 たとえば、攻撃者がシステムを継続的に調査しようとしている場合、それらを自動的に危険レベル5に設定できます。
attacker_ip 5;
一方、基本的に、特定のIPアドレスをpsadからの反応の誘発から免除することができます。 iptablesにルールを明示的に追加していなければ、ここにローカルホストを追加して「0」に設定できます。
この目的のために、検出された脅威IPからのトラフィックを自動的にブロックするようにpsadを設定するので、自分自身をロックアウトしないように、自宅のコンピューターをこのリストに追加する必要があります。
local_computer_ip 0;
終了したら、ファイルを保存して閉じます。
psad構成ファイルを再度開きます。
sudo nano /etc/psad/psad.conf
ENABLE_AUTO_IDS
というパラメーターを検索します。 これは、psadがファイアウォールを変更して特定のアドレスをブロックできるようにするルールです。 これを自動的に実行する場合は、次のように変更できます。
ENABLE_AUTO_IDS Y;
次に、問題のあるIPをブロックするのに十分な大きさの脅威レベルを構成するものを決定します。 このパラメータを調整することでそれを行うことができます:
AUTO_IDS_DANGER_LEVEL 5;
もう1つの重要なオプションは、秒単位の合計ブロック時間です。
AUTO_BLOCK_TIMEOUT 3600;
これにより、デフォルトで1時間ブロックされます。
侵入防止のテスト
一時的に禁止することで、これがどのように機能するかをテストできます。 同じ構成ファイルで、次のパラメーターを設定します。
ENABLE_AUTOIDS Y;
AUTO_IDS_DANGER_LEVEL 4;
AUTO_BLOCK_TIMEOUT 60;
これにより、自動ファイアウォール構成がオンになり、しきい値が危険レベル4に設定されます。これは、通常のSYNスキャンでヒットし、ブロック時間を60秒に設定します。
ファイルを保存して閉じます。
自宅のIPアドレスを追加した場合は、auto_dl
ファイルを開き、一時的にコメントアウトします。
# local_computer_ip 0;
次に、psadを再起動して、これらのファイルを再読み取りします。
sudo service psad restart
自宅のコンピューターから、前回行ったスキャンを再実行できます。
sudo nmap -PN -sS server_domain_or_ip
この時点で、数秒後、SSH経由でpsadマシンに接続している場合は、接続が切断されます。 60秒間再接続できなくなります。
これは、スキャンが危険レベル4に達するのに十分なポートにヒットしたときにpsadがアクションを実行したためです。 iptablesルールを変更して、IPを一時的にブロックした他のチェーンにトラフィックを転送しました。
再度ログインできるようになったら、iptableルールを確認することで、この迂回の残骸を確認できます。
sudo iptables -S
-P INPUT DROP
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-N PSAD_BLOCK_FORWARD
-N PSAD_BLOCK_INPUT
-N PSAD_BLOCK_OUTPUT
-A INPUT -j PSAD_BLOCK_INPUT
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -j LOG
-A FORWARD -j PSAD_BLOCK_FORWARD
-A FORWARD -j LOG
-A OUTPUT -j PSAD_BLOCK_OUTPUT
ご覧のとおり、さらに多くのチェーンが作成され、すべての入力がこれらのチェーンの1つに送られました。 禁止期間中、このチェーンはホーム接続のIPへの接続試行をドロップします。
この機能をテストしたので、使用したいものに戻します。 この機能を実際に使用することを計画している場合は、おそらく禁止期間を長くする必要があります。 さらに、接続することがわかっているIPアドレスを再度追加する必要があります。
local_computer_ip 0;
ENABLE_AUTOIDS Y;
AUTO_IDS_DANGER_LEVEL 5;
AUTO_BLOCK_TIMEOUT 3600;
実際のアプリケーション用にサービスを構成し終えたら、psadを再起動することを忘れないでください。
sudo service psad restart
送信元IPアドレスをスプーフィングする可能性のある特定の種類の攻撃があることに注意してください。 これは、自動ブロック機能が有効になっていると疑う攻撃者が、正当なサイトまたはサービスを誤って禁止する可能性があることを意味します。 非常に注意して、このタイプの構成のコストと利点を比較検討してください。
結論
psadなどのネットワーク侵入検知ツールを正しく構成することで、問題が実際に発生する前に、脅威に関する必要な警告を受け取る可能性が高くなります。 psadのようなツールは、高度な警告を提供し、いくつかの状況に自動的に対処することができます。
psadを効果的に使用するための鍵は、危険レベルと電子メールアラートを適切に構成し、問題があればフォローアップすることです。 このツールをtripwireなどの他の侵入検知リソースと組み合わせると、侵入の試みを検出できるかなり良好なカバレッジを提供できます。