
我有一台 LAMP Ubuntu 10.04 伺服器。有許多(>140)使用者和許多不同的 PHP 網站(自訂、不同的 PHP 框架、CMS 等)。
問題是:有時伺服器會發送「垃圾郵件」。本地進出口銀行不用於此目的。我發現如下奇怪的活動:
/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
這種情況很少發生(每兩天一次)並且持續幾分鐘。因此很難獲得更多資訊。所有這些資訊均使用監控 smtp 連線的 cron 作業記錄。我不知道如何識別誰運行這些進程或它們是如何運行的。有什麼策略可以找到他們嗎?
答案1
您顯示的資料已經包含許多資訊:使用者的UID是33,在我的系統上對應於www-數據,我認為這很可能同樣適用於您的系統,因為您顯示的套接字屬於www-數據。
另外,我懷疑命令列會為你帶來更多資訊:perl程式的PPID是15176,但是15176的PPID是1(IE,在裡面)。這中間沒有 shell,也沒有會話。
所聯繫的 IP 位址並不是特別令人擔憂:它們屬於微軟和谷歌,而這些人知道如何保護自己。
那麼,犯規行為的證據在哪裡呢?我同意連線的 SYN_SENT 狀態確實值得關注,因為這表示您的連線尚未收到正確的 SYN/ACK,並且您處於掛起狀態。
那麼,您可以做什麼來挖掘更多資訊呢?您無法嘗試直接識別用戶:您的貼文已經表明該用戶是www-數據,且該進程不直接連接到終端機或會話。
但你首先可以確定你的IP是否被列入黑名單,例如這裡:如果是,那就是垃圾郵件的證據。
其次,您應該檢查郵件程式的日誌,是否有任何異常情況:網站拒絕連接,因為您位於黑名單中,來自同一網站的多個連接,被用作中繼的證據,...
第三,您可以使用以下方式監控您的連接埠
ss -lntp
這會告訴您在任何給定時刻使用 (TCP) 連接埠的進程的 pid,並再次檢查多個連線。您可以將上述命令編寫為每秒重複一次,並儲存其輸出(也許與使用者)和時間戳,以了解有關可疑連接時發生的情況的更多資訊。這可以是互相關的屍檢用戶已登入或連接到您的網站。
有關更多信息,您可以簡單地將所有資料包轉儲到經常出現的 Microsoft 站點,例如
nohup tcpdump -n -i eth0 host 65.52.0.0/14 -w outfile &
IP 位址範圍是屬於 Microsoft 的整個區塊,根據輸出世界衛生組織 65.55.37.72;上面的命令可能會產生相當多的輸出,因此準備好磨練您過濾表達式的技能線鯊。
如果所有這些都失敗了,請準備好強制您的使用者更改密碼。
答案2
只是一個想法。 Grep 瀏覽您的 apache 日誌。如果您有時間,當郵件發送後,很容易找到它們。特別尋找 perl 腳本。
答案3
取得用戶
通常情況下uid欄位顯示uid啟動該進程的使用者的。
在你的情況下,這將是 iser 與uid 33
。
用於getent passwd 33
查看使用者的名稱。
追蹤用戶
您可以使用一個小型的 C 守護程式輕鬆監視和記錄使用者的活動,
使用這/proc/pid/status
用於讀取檔案並在使用者之後進行搜尋的小庫。
這可以幫助您避免伺服器運行時出現問題。
(你也可以讓守護程式處理kill
這些行程)