Kısa ömürlü TCP bağlantıları sahibi işlemini bulma


15

Koşu tcpdumpbir apache sunucusuna yerel bağlantılarında, ben TCP bağlantıları kuruluyor bulundu ve hemen her 2 saniyede kapattı. Bunlardan hangi sürecin sorumlu olduğunu nasıl bulabilirim? netstat -ctpyardımcı olmadı, bağlantılar çok hızlıydı ve işlem tanımlayıcısı TIME_WAIT olanlar için görüntülenmedi.

Doğrulayabildiğim haproksi probları oldukları ortaya çıktı strace, ancak yine de ilk etapta haproxy'yi saptamanın herhangi bir yolunu bilmiyorum.

Yanıtlar:


20

Bu tür şeyler için denetim çerçevesini kullanabilirsiniz. Çok "kullanıcı dostu" veya sezgisel değiller, bu yüzden sizin için biraz kazma gerektirir.

Öncelikle denetlemenin kurulu, çalışır durumda olduğundan ve çekirdeğinizin desteklediğinden emin olun.
Ubuntu apt-get install auditdiçin örneğin yükleyebilirsiniz .

Ardından, aşağıdaki connectgibi tüm sistem çağrılarını izlemek için denetim için bir politika eklersiniz :

auditctl -a exit,always -F arch=b64 -S connect -k MYCONNECT

32 bit Linux kurulumu kullanıyorsanız, b64'ü b32 olarak değiştirmeniz gerekir.

Bu komut, denetim çerçevesine bir ilke ekler ve bakmanız gereken tüm connect () sistem çağrıları artık denetim günlük dosyalarınıza (genellikle /var/log/audit/audit.log) kaydedilir.

Örneğin, netcat ile news.ycombinator.com bağlantı noktası 80'e bağlantı şu şekilde sonuçlanır:

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

Burada, /bin/nc.openbsd uygulamasının bir connect () çağrısı başlattığını görebilirsiniz, eğer çok sayıda bağlantı çağrısı alırsanız ve sadece belirli bir ip veya portu çıkarmak istiyorsanız, biraz dönüşüm yapmanız gerekir. SOCKADDR satırı bir saddr argümanı içerir, 0200 ile başlar, ardından 80 anlamına gelen onaltılık (0050) bağlantı noktası numarası ve daha sonra news.ycombinator.com'un 174.132.225.106 IP'si olan hex (AE84E16A) içindeki IP ile başlar.

Denetim çerçevesi çok sayıda günlük oluşturabilir, bu nedenle görevinizi tamamladığınızda devre dışı bırakmayı unutmayın. Yukarıdaki politikayı devre dışı bırakmak için -a yerine -d yazın:

auditctl -d exit,always -F arch=b64 -S connect -k MYCONNECT

Denetim çerçevesi hakkında iyi belgeler:
http://doc.opensuse.org/products/draft/SLES/SLES-security_sd_draft/part.audit.html

IP adreslerini hex, dec, binary vb. Adreslerine / adreslerinden dönüştürün:
http://www.kloth.net/services/iplocate.php

Genel onaltılık / yavaşlama dönüştürücü:
http://www.statman.info/conversions/hexadecimal.html

IT Security Stack Exchange'den denetlemeye kısa bir giriş. http://security.blogoverflow.com/2013/01/a-brief-introduction-to-auditd/

Düzenleme 1 :
Bunu yapmanın başka bir quick'n'dirty (İsveççe: fulhack) yolu, bağlantı verilerini size gönderen hızlı bir döngü oluşturmaktır:

while true;do
  ss -ntap -o state established '( dport = :80 )'
  sleep 1
done

Bu komut, ssbaşlatılan bağlantı da dahil olmak üzere, bağlantı noktası 80'e geçerli yerleşik bağlantıları boşaltmak için komutu (soket istatistikleri) kullanır . Eğer | tee /tmp/outputdaha sonra işleme / kazma için / tmp / output yazmak hem de çıktı ekranda göstermek için yaptıktan sonra ekleyebileceğiniz çok fazla veri varsa . Hızlı haproksi bağlantısını yakalamazsa, lütfen kaldırmayı deneyin, sleep 1ancak çok kullanılan bir makine ise kapsamlı günlük kaydına dikkat edin. Gerektiği gibi değiştirin!


Ayrıntılı yanıt için teşekkürler. Ev sahibi çekirdeği desteklemediğinden denetleme çözümü için sözünüzü alacağım ve şimdi denemeye uygun bir tane bulmak için zamanım yok, ama bunu aklımda tutacağım. Oylama çözümüne gelince, lsof ile benzer bir şey yapmaya başladım ama tatmin edici olmadığı için oldukça hızlı bir şekilde durdum.
pmezard

2
Bu altıgen dizelerin sizin için otomatik olarak deşifre ausearch -iedilmesi için de kullanabilirsiniz saddr.
sch

ss lsof'dan daha tatmin edicidir çünkü daha hızlıdır ve iyi filtreleme kurallarına sahiptir - grep'e gerek yoktur. Destekle ilgili sorunları takdir edebilirim: Systemtap mükemmel olan başka bir araçtır, ancak bir üretim sunucusunda çalışmasını sağlamak tatmin edici olmayabilir.
Max Murphy

1

Ayrıca "ausearch -i" adresinden aldığınız dev günlükleri, yalnızca internetteki başka bir ana bilgisayara başarıyla bağlanan soketleri görmek için grep edebilirsiniz. İnternetteki bir ana bilgisayara bağlanmak için bir soket oluşturan her işlemi ve komutu o hedef ana bilgisayarın bağlantı adresi ve soketin "oluşturulduğu" geçerli saatle birlikte almak için basit bir komut dosyası yazdım. İşte burada:

#!/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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.