回答:
このようなことにはauditdフレームワークを使用できます。それらは「ユーザーフレンドリー」でも直感的でもないため、少し掘り下げる必要があります。
最初に、auditdがインストールされ、実行中であり、カーネルがそれをサポートしていることを確認してください。
Ubuntuの場合、たとえば、インストールできますapt-get install auditd
。
次に、監査用のポリシーを追加して、次のconnect
ようなすべてのsyscall を監視します。
auditctl -a exit,always -F arch=b64 -S connect -k MYCONNECT
Linuxの32ビットインストールを使用している場合、b64をb32に変更する必要があります。
このコマンドは、監査フレームワークにポリシーを挿入し、connect()syscallsが監査ログファイル(通常/var/log/audit/audit.log
)に記録されるようになりました。
たとえば、netcatを使用してnews.ycombinator.comポート80に接続すると、次のような結果になります。
type=SYSCALL msg=audit(1326872512.453:12752): arch=c000003e syscall=42 success=no exit=-115 a0=3 a1=24e8fa0 a2=10 a3=7fff07a44cd0 items=0 ppid=5675 pid=7270 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts4 ses=4294967295 comm="nc" exe="/bin/nc.openbsd" key="MYCONNECT"
type=SOCKADDR msg=audit(1326872512.453:12752): saddr=02000050AE84E16A0000000000000000
ここでは、/ bin / nc.openbsdアプリケーションがconnect()呼び出しを開始したことがわかります。多くの接続呼び出しを取得し、特定のIPまたはポートのみをgrepで出力する場合は、変換が必要です。SOCKADDR行にはsaddr引数が含まれ、0200で始まり、その後に80を意味する16進数のポート番号(0050)が続き、その後に16進数のIP(AE84E16A)が続きます。
監査フレームワークは大量のログを生成する可能性があるため、ミッションを達成したら必ず忘れて無効にしてください。上記のポリシーを無効にするには、-aを-dに置き換えます。
auditctl -d exit,always -F arch=b64 -S connect -k MYCONNECT
監査フレームワークに関する優れたドキュメント:http :
//doc.opensuse.org/products/draft/SLES/SLES-security_sd_draft/part.audit.html
http://www.kloth.net/services/iplocate.phpで、IPアドレスを16進数、12進数、バイナリなどに変換します
。
一般的なhex / decコンバーター:http :
//www.statman.info/conversions/hexadecimal.html
IT Security Stack Exchangeのauditdの簡単な紹介。 http://security.blogoverflow.com/2013/01/a-brief-introduction-to-auditd/
編集1:
別のクイックアンドダーティ(スウェーデン語:フルハック)の方法は、次のように接続データをダンプする高速ループを作成することです。
while true;do
ss -ntap -o state established '( dport = :80 )'
sleep 1
done
このコマンドは、ss
コマンド(ソケット統計)を使用して、ポート80への現在確立されている接続を、それを開始したプロセスを含めてダンプします。大量のデータを追加した| tee /tmp/output
後、画面に出力を表示するだけでなく、後で処理/掘り出すために/ tmp / outputに書き込むこともできます。迅速なhaproxy接続がキャッチされない場合は、削除してみてください。sleep 1
ただし、マシンの使用率が高い場合は、広範囲のロギングに注意してください。必要に応じて変更してください!
ausearch -i
これらのsaddr
16進文字列を自動的にデコードするために使用することもできます。
「ausearch -i」から取得した巨大なログをgrepして、インターネット上の別のホストに正常に接続されたソケットのみを表示することもできます。インターネット上のホストに接続するソケットを作成する各プロセスとコマンドを取得する単純なスクリプトを作成し、そのターゲットホストの接続アドレスと、ソケットが「作成」された現在の時刻を取得しました。ここにあります:
#!/bin/bash
if [[ $EUID -ne 0 ]]; then
echo "You must run this script as root boy!"
exit 1
fi
> proccessConnections.dat
connections=`ausearch -i | grep host: | awk -F "msg=audit" '{print $2}' | awk -F ": saddr" '{print $1}'`
connectionsNumber=`echo "$connections" | wc -l`
echo "Number of connections: $connectionsNumber"
echo "$connections" > conTemp.dat
let counter=1
while read connectInfo; do
success=`ausearch -i | grep "$connectInfo" | grep "type=SYSCALL" | grep success=yes`
addressInfo=`ausearch -i | grep "$connectInfo" | grep type=SOCKADDR | awk -F ': ' '{print $2}'`
processInfo=`ausearch -i | grep "$connectInfo" | grep "type=SYSCALL" | awk -F 'comm=' '{print $2}' | awk -F 'key' '{print $1}'`
if [[ $success != "" ]]
then
echo "[$counter - $connectionsNumber] (success) comm=$processInfo - $addressInfo - $connectInfo"
echo "[$counter - $connectionsNumber] (success) comm=$processInfo - $addressInfo - $connectInfo" >> proccessConnections.dat
else
echo "[$counter - $connectionsNumber] (no success) comm=$processInfo - $addressInfo - $connectInfo"
echo "[$counter - $connectionsNumber] (no success) comm=$processInfo - $addressInfo - $connectInfo" >> proccessConnections.dat
fi
let counter++
done < conTemp.dat