
私は LAMP Ubuntu 10.04 サーバーを持っています。多数の (>140) ユーザーと、多数の異なる Web PHP サイト (カスタム、さまざまな PHP フレームワーク、CMS など) があります。
問題は、サーバーが時々「スパム」を送信することです。そして、ローカル Exim はそのためには使用されません。次のような奇妙なアクティビティを発見しました。
/usr/bin/lsof -ni | grep smtp |grep -v ^exim4
perl 15177 www-data 510u IPv4 1101127040 0t0 TCP server_ip:46401->65.55.37.72:smtp (SYN_SENT)
perl 15178 www-data 510u IPv4 1101127059 0t0 TCP server_ip:51002->98.136.217.202:smtp (SYN_SENT)
perl 15179 www-data 510u IPv4 1101126982 0t0 TCP server_ip:39232->74.125.205.26:smtp (SYN_SENT)
perl 15180 www-data 510u IPv4 1101126975 0t0 TCP server_ip:53339->65.55.37.72:smtp (SYN_SENT)
perl 15181 www-data 510u IPv4 1101127014 0t0 TCP server_ip:45429->65.55.37.72:smtp (SYN_SENT)
perl 15182 www-data 510u IPv4 1101126984 0t0 TCP server_ip:49985->74.125.205.26:smtp (SYN_SENT)
perl 15183 www-data 510u IPv4 1101126971 0t0 TCP server_ip:42199->65.55.37.72:smtp (SYN_SENT)
..........
...........
perl 15184 www-data 510u IPv4 1101126968 0t0 TCP server_ip:36641->74.125.205.26:smtp (SYN_SENT)
perl 15186 www-data 510u IPv4 1101126979 0t0 TCP server_ip:57690->98.138.112.32:smtp (SYN_SENT)
...........
そして、これらの Perl プロセスを誰が実行しているか、どのように実行されているかを知ることはできません。これらのプロセス (例: pid 15179) を分析しようとしました: /proc/15179/cmdline - 空です
/proc/15179/status
Name: perl
State: S (sleeping)
Tgid: 15179
Pid: 15179
PPid: 15176
TracerPid: 0
Uid: 33 33 33 33
Gid: 33 33 33 33
FDSize: 1024
Groups: 33
VmPeak: 10400 kB
VmSize: 10372 kB
VmLck: 0 kB
VmHWM: 8140 kB
VmRSS: 8092 kB
VmData: 6980 kB
VmStk: 88 kB
VmExe: 1200 kB
VmLib: 1980 kB
VmPTE: 32 kB
Threads: 1
SigQ: 0/16382
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000000000080
SigCgt: 0000000180017427
CapInh: 0000000000000000
CapPrm: 0000000000000000
CapEff: 0000000000000000
CapBnd: ffffffffffffffff
Cpus_allowed: f
Cpus_allowed_list: 0-3
Mems_allowed: 1
Mems_allowed_list: 0
voluntary_ctxt_switches: 6431
nonvoluntary_ctxt_switches: 34
lsof -n -p 15179 - ここ ここにリンクの説明を入力してください
親プロセスを見つけようとしました: 15179 の親 PID は 15176 です:
/proc/15176/cmdline - 空です
そして
/proc/15176/status
Name: perl
State: S (sleeping)
Tgid: 15176
Pid: 15176
PPid: 1
TracerPid: 0
Uid: 33 33 33 33
Gid: 33 33 33 33
FDSize: 1024
Groups: 33
VmPeak: 11116 kB
VmSize: 11116 kB
VmLck: 0 kB
VmHWM: 8712 kB
VmRSS: 8692 kB
VmData: 7772 kB
VmStk: 88 kB
VmExe: 1200 kB
VmLib: 1940 kB
VmPTE: 32 kB
Threads: 1
SigQ: 0/16382
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000000010080
SigCgt: 0000000180007427
CapInh: 0000000000000000
CapPrm: 0000000000000000
CapEff: 0000000000000000
CapBnd: ffffffffffffffff
Cpus_allowed: f
Cpus_allowed_list: 0-3
Mems_allowed: 1
Mems_allowed_list: 0
voluntary_ctxt_switches: 14467
これはまれに (2 日に 1 回) 発生し、数分間続きます。そのため、詳細情報を取得するのは困難です。この情報はすべて、SMTP 接続を監視する cron ジョブを使用して記録されます。これらのプロセスを実行しているユーザーや、プロセスの実行方法を特定する方法がわかりません。見つける方法はありますか?
答え1
表示されたデータにはすでに多くの情報が含まれています。ユーザーのUIDは33で、私のシステムでは次のようになります。wwwデータ、そしておそらくあなたのシステムでも同じことが当てはまると思います。なぜなら、あなたが表示したソケットはwwwデータ。
また、コマンドラインでさらに情報が得られるとは思えません。perlプログラムのPPIDは15176ですが、15176のPPIDは1です(つまり、初期化)。これにはシェルはなく、その間のセッションもありません。
接続された IP アドレスは特に心配するものではありません。それらは Microsoft と Google のものであり、彼らは自らを守る方法を知っています。
では、不正行為の証拠はどこにあるのでしょうか? 接続のステータス SYN_SENT は確かに懸念すべきものであることに同意します。これは、接続が適切な SYN/ACK を受信せず、宙ぶらりん状態になっていることを意味するためです。
では、さらに情報を得るために何ができるでしょうか?ユーザーを直接特定することはできません。投稿から、ユーザーがwwwデータプロセスが端末またはセッションに直接接続されていないことを確認します。
しかし、まずは自分のIPがブラックリストに登録されているかどうかを確認することができます。例えばここ: もしそうなら、それはスパムの証拠になります。
次に、メール送信者のログをチェックして、何か異常なことがないか確認する必要があります。たとえば、ブラックリストに載っているためにサイトが接続を拒否している、同じサイトから複数の接続がある、リレーとして使用されている証拠がある、などです。
3つ目は、ポートを監視することです。
ss -lntp
これは、任意の時点で(TCP)ポートを使用しているプロセスのPIDを示し、複数の接続を再度チェックします。上記のコマンドを1秒ごとに繰り返すようにスクリプト化し、その出力を保存することができます(おそらく、ユーザー)とタイムスタンプを組み合わせれば、疑わしい接続が発生した時点で何が起こっていたのか、さらに詳しい情報を得ることができます。死後ログインしているユーザー、またはサイトに接続しているユーザー。
さらに詳しい情報を得るには、よく見かけるMicrosoftのサイトにすべてのパケットをダンプするだけでいい。
nohup tcpdump -n -i eth0 host 65.52.0.0/14 -w outfile &
IPアドレス範囲は、Microsoftに属するブロック全体であり、出力によると、65.55.37.72 のwhois; 上記のコマンドはかなりの出力を生成する可能性が高いため、式をフィルタリングするスキルを磨く準備をしてください。ワイヤーシャーク。
これらすべてが失敗した場合は、ユーザーにパスワードの変更を強制する準備をしてください。
答え2
単なるアイデアです。Apache ログを grep で検索してください。時間があれば、メールが送信されたときに簡単に見つけられるかもしれません。特に Perl スクリプトを探してください。
答え3
ユーザーを取得する
通常、ユーザIDフィールドにはユーザIDプロセスを開始したユーザーの。
あなたの場合、これはiserになりますユーザID 33
。
getent passwd 33
ユーザーの名前を確認するために使用します。
ユーザーを追跡する
小さなCデーモンを使えば、ユーザーのアクティビティを簡単に監視して記録することができます。
使用してこれ/proc/pid/status
ファイルを読み取り、ユーザーを検索するための小さなライブラリ。
これにより、サーバー ランタイムの問題を回避できます。
(デーモンにkill
これらのプロセスを実行させることもできます)