syslog-ng で監査を試みて、アウトバウンド HTTP 呼び出しを行うプロセスを見つける

syslog-ng で監査を試みて、アウトバウンド HTTP 呼び出しを行うプロセスを見つける

一部のアプリケーション (不明) は、HTTPS プロトコルを使用して、既知のホスト/ポート/URL (これは WAF ハニーポットで、ホスト/URL/ポートは既知です) に、散発的で不定期な短いアウトバウンド HTTP(S) 要求を行います。要求は 3 ~ 5 日に 1 回発生する可能性があります。文字通り、3 ~ 5 日に 1 つの短い要求です。目標は、これらの要求を行うアプリケーション (バイナリへのパス、PID など) を定義することです。サーバーには、、、、などnginxを含む多数のソフトウェアがインストールされていますphpmariadbredisdocker

簡単にするために、ここではハニーポットの IP は 7.7.7.7 になります。

これまで試したこと:

  1. tcpダンプ
$ sudo tcpdump -i any dst host 7.7.7.7 and "tcp[tcpflags] & (tcp-syn) != 0" and "tcp[tcpflags] & (tcp-ack) == 0" &> /tmp/out_7.7.7.7_$(date "+%Y.%m.%d-%H.%M.%S").log &

tcpdumpアウトバウンド HTTP リクエストを行うプロセス ID または実行可能ファイルを検出できないようです。

  1. 監査ctl/監査d
sudo auditctl -a exit,always -F arch=b64 -S connect -k connectLog

auditctl/auditdパスと pid を出力できるようですが、フィルタリング機能がありません。監査ルールを 3 ~ 5 日間実行すると、ディスクが監査ログでいっぱいになります。または、監査ログがローテーションされている場合、すでにローテーションされて消去されたログ ファイル内の必要なログ データを見逃す可能性があります。auditctlターゲット IP による書き込み (解析ログではなく) のフィルタリング機能があれば、おそらく最適な候補になります。何か見落としているかもしれませんが、フィルタリング機能はありますか?

私が考え出したもう一つの選択肢は、次のような bash スクリプトを作成することです。

  • 監査を開始したconnect
  • 監視プロセスは次のように開始されました。 ( tail -f -n0 /var/log/audit/audit.log & ) | grep -q "7.7.7.7"
  • モニターがこれを検出したら、監査を停止しますauditctl -d...

問題は、このイベントが 3 ~ 5 日後にすべてのディスクがいっぱいになったときに発生する可能性があることです。

  1. ネットスタット
$ sudo netstat -tupnc | grep 7.7.7.7

netstatオプション (continuos)を使用すると、1 秒ごとに読み取りを繰り返すようです-c。リクエストが非常に短いため、このリクエストを見逃す可能性があります。

  1. ss

ss送信接続を開始したプロセスが表示されないようです。

  1. lsof
lsof -i TCP:80,443 -r 1

アウトバウンド接続は非常に短く、高速であるため、1秒ごとにlsofを実行してもログに記録されない可能性があります。

  1. wireshark Wireshark には優れたフィルタリング機能 (IP による) がありますが、接続元のプロセス名や pid は表示されないようです。

  2. 現在、私は次の解決策に行き詰まっています:syslog-ngレシーバーとして、またauditdログ イベント センダーとして、TCP/ネットワーク経由でログを受信するときにフィルタリング機能を持つ を結合します。syslog-ngポート 2222 から開始し、ネットワークからデータを受信して​​、何らかの文字列でフィルタリングすることに成功しました ( でテスト済みcurl)。しかし、ネットワークへのログの送信を管理できませんauditd

私がやったこと:

7.1) インストール済みaudisp-remote-plugin:

$ sudo apt install audispd-plugins

7.2) 有効audisp-remote plugin:

ファイル内/etc/audit/plugins.d/au-remote.conf: 設定active = yes

7.3) 設定されたaudisp-remoteプラグイン:

ファイル内/etc/audit/auditsp-remote.conf:

remote_server = 127.0.0.1
port = 2222

7.4) ローカル log_file への書き込みを無効にしました

ファイル内/etc/audit/auditd.conf:

write_logs = no

そしてauditdを再起動しました:

$ sudo systemctl restart auditd

7.5) 接続 (システムコール) をキャッチするための監査ルールを追加しましたconnect:

$ sudo auditctl -a exit,always -F arch=b64 -F saddr_fam=2 -S connect -k sckt

7.6)auditdログ内の以前のデータを消去するためにログをローテーションする

$ service auditd rotate

7.7) テストHTTP呼び出しを実行しました:

$ curl -v https://7.7.7.7/api/v1/t

7.8)syslog-ngログを確認しましたが、期待した記録がありませんでした。

これを行うための最も適切で、最も簡単で、最もシンプルなアプローチをご存知の方がいらっしゃいましたら、ご協力いただければ幸いです。

答え1

おそらく、ファイル ソースを使用して監査ログを syslog-ng に取り込み、監査ログの保持期間を比較的短く設定できるでしょう。

これにより、syslog-ng 側でフィルタリングを適用し、興味深いレコードを別のログ ファイルに出力できます。

関連情報