Menemukan proses pemilik koneksi TCP yang berumur pendek

15

Berjalan tcpdumppada koneksi lokal ke server apache, saya menemukan koneksi TCP dibuat dan ditutup segera setiap 2 detik. Bagaimana saya menemukan proses mana yang bertanggung jawab untuk ini? netstat -ctptidak membantu, koneksi terlalu cepat dan pengidentifikasi proses tidak ditampilkan untuk yang TIME_WAIT.

Mereka ternyata merupakan probe haproxy, yang bisa saya verifikasi strace, tapi saya masih tidak tahu cara untuk menentukan haproxy di tempat pertama.

pmezard
sumber

Jawaban:

20

Anda dapat menggunakan kerangka auditd untuk hal-hal semacam ini. Mereka tidak terlalu "ramah pengguna" atau intuitif, sehingga membutuhkan sedikit penggalian di pihak Anda.

Pertama pastikan Anda telah menginstal auditd, menjalankan dan bahwa kernel Anda mendukungnya.
Untuk Ubuntu Anda dapat menginstalnya dengan apt-get install auditdmisalnya.

Kemudian Anda menambahkan kebijakan untuk audit untuk memantau semua connectsyscalls seperti ini:

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

Jika Anda menggunakan instalasi Linux 32-bit, Anda harus mengubah b64 ke b32.

Perintah ini akan menyisipkan kebijakan ke kerangka kerja audit, dan syscalls connect () apa pun sekarang akan dicatat ke file log audit Anda (biasanya /var/log/audit/audit.log) untuk Anda lihat.

Misalnya, koneksi dengan netcat ke news.ycombinator.com port 80 akan menghasilkan sesuatu seperti ini:

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

Di sini Anda dapat melihat bahwa aplikasi /bin/nc.openbsd memulai panggilan connect (), jika Anda mendapatkan banyak panggilan koneksi dan hanya ingin mengeluarkan ip atau port tertentu, Anda harus melakukan beberapa konversi. Baris SOCKADDR berisi argumen saddr, dimulai dengan 0200 diikuti oleh nomor port dalam heksadesimal (0050) yang berarti 80, dan kemudian IP dalam hex (AE84E16A) yang merupakan IP news.ycombinator.com dari 174.132.225.106.

Kerangka audit dapat menghasilkan banyak log, jadi ingatlah untuk menonaktifkannya ketika Anda telah menyelesaikan misi Anda. Untuk menonaktifkan kebijakan di atas, cukup ganti -a dengan -d seperti:

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

Dokumentasi yang bagus tentang kerangka kerja auditd:
http://doc.opensuse.org/products/draft/SLES/SLES-security_sd_draft/part.audit.html

Ubah alamat IP ke / dari hex, dec, binary, dll di:
http://www.kloth.net/services/iplocate.php

Konverter hex / dec umum:
http://www.statman.info/conversions/hexadecimal.html

Pengantar Singkat untuk auditd, dari IT Security Stack Exchange. http://security.blogoverflow.com/2013/01/a-brief-introduction-to-auditd/

Sunting 1 :
Cara quick'n'dirty (swedish: fulhack) lainnya untuk melakukannya adalah membuat loop cepat yang membuang data koneksi ke Anda, seperti ini:

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

Perintah ini menggunakan ssperintah (statistik socket) untuk membuang koneksi yang ada ke port 80 termasuk proses apa yang memulainya. Jika banyak data yang dapat Anda tambahkan | tee /tmp/outputsetelah dilakukan untuk menampilkan output di layar dan menuliskannya ke / tmp / output untuk pemrosesan / penggalian nanti. Jika tidak menangkap koneksi haproxy cepat, silakan coba hapus sleep 1tetapi berhati-hatilah dalam pencatatan yang ekstensif jika ini adalah mesin yang banyak digunakan. Ubah sesuai kebutuhan!

Mattias Ahnberg
sumber
Terima kasih atas tanggapan terinci. Saya akan mengambil kata Anda untuk solusi auditd karena kernel host tidak mendukungnya dan saya tidak punya waktu sekarang untuk menemukan satu yang cocok untuk eksperimen, tetapi saya akan mengingatnya. Adapun solusi jajak pendapat, saya mulai melakukan sesuatu yang mirip dengan lsof tetapi berhenti cukup cepat karena tidak ... memuaskan.
pmezard
2
Anda juga dapat menggunakan ausearch -iagar saddrstring hex tersebut diterjemahkan secara otomatis untuk Anda.
sch
ss lebih memuaskan daripada lsof karena lebih cepat dan memiliki aturan penyaringan yang baik - tidak perlu grep. Saya bisa menghargai masalah dengan dukungan: Systemtap adalah alat lain yang luar biasa tetapi menjalankannya pada server produksi bisa ... tidak memuaskan.
Max Murphy
1

Anda juga dapat menangkap log besar yang Anda dapatkan dari "ausearch -i" untuk melihat hanya soket yang berhasil terhubung ke host lain di internet. Saya menulis skrip sederhana untuk mendapatkan setiap proses dan perintah yang membuat soket untuk terhubung ke host di internet bersama dengan alamat koneksi host target dan waktu saat soket "dibuat". Ini dia:

#!/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
Marcelo Silva
sumber