Individuazione del processo del proprietario delle connessioni TCP di breve durata


15

In esecuzione tcpdumpsu connessioni locali a un server Apache, ho scoperto che le connessioni TCP venivano stabilite e chiuse immediatamente ogni 2 secondi. Come trovo quale processo è responsabile di questi? netstat -ctpnon ha aiutato, le connessioni erano troppo veloci e l'identificatore del processo non è visualizzato per TIME_WAIT.

Si sono rivelati essere sonde alproxy, con le quali ho potuto verificare strace, ma ancora non conosco alcun modo per individuare il haproxy in primo luogo.

Risposte:


20

È possibile utilizzare il framework auditd per questo tipo di cose. Non sono molto "intuitivi" o intuitivi, quindi richiedono un po 'di ricerche da parte tua.

Per prima cosa assicurati di avere auditd installato, in esecuzione e che il tuo kernel lo supporti.
Per Ubuntu puoi installarlo con apt-get install auditdad esempio.

Quindi aggiungi un criterio per il controllo per monitorare tutti i connectsyscall in questo modo:

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

Se si utilizza un'installazione a 32 bit di Linux, è necessario modificare da b64 a b32.

Questo comando inserirà un criterio nel framework di controllo e tutti i syscall di connect () verranno ora registrati nei file di registro di controllo (di solito /var/log/audit/audit.log) per consentirne la visualizzazione .

Ad esempio, una connessione con netcat alla porta 80 di news.ycombinator.com comporterà qualcosa del genere:

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

Qui puoi vedere che l'applicazione /bin/nc.openbsd ha avviato una chiamata connect (), se ricevi molte chiamate connect e vuoi solo estrarre un determinato ip o porta devi fare qualche conversione. La riga SOCKADDR contiene un argomento saddr, inizia con 0200 seguito dal numero di porta in esadecimale (0050) che significa 80 e quindi dall'IP in esadecimale (AE84E16A) che è l'IP di news.ycombinator.com di 174.132.225.106.

Il framework di controllo può generare molti log, quindi ricordati di disabilitarlo una volta completata la missione. Per disabilitare la politica di cui sopra, è sufficiente sostituire -a con -d come tale:

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

Buona documentazione sul framework auditd:
http://doc.opensuse.org/products/draft/SLES/SLES-security_sd_draft/part.audit.html

Converti gli indirizzi IP in / da hex, dec, binary, ecc su:
http://www.kloth.net/services/iplocate.php

Convertitore hex / dec generale:
http://www.statman.info/conversions/hexadecimal.html

Una breve introduzione a auditd, dallo scambio di stack di sicurezza IT. http://security.blogoverflow.com/2013/01/a-brief-introduction-to-auditd/

Modifica 1 :
Un altro modo rapido e veloce (svedese: fulhack) per farlo è quello di creare un ciclo rapido che scarica i dati di connessione, in questo modo:

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

Questo comando utilizza il sscomando (statistiche socket) per scaricare le connessioni correnti stabilite alla porta 80, incluso il processo avviato. Se sono molti i dati che è possibile aggiungere | tee /tmp/outputdopo aver fatto entrambi per mostrare l'output sullo schermo e scrivere su / tmp / output per successive elaborazioni / scavi. Se non rileva la rapida connessione haproxy, provare a rimuovere sleep 1ma prestare attenzione a una registrazione estesa se si tratta di una macchina molto utilizzata. Modifica secondo necessità!


Grazie per la risposta dettagliata. Prenderò la tua parola per la soluzione auditd poiché il kernel host non la supporta e non ho il tempo di trovarne una adatta per la sperimentazione, ma lo terrò a mente. Per quanto riguarda la soluzione di polling, ho iniziato a fare qualcosa di simile con lsof ma mi sono fermato abbastanza rapidamente perché non era ... soddisfacente.
pmezard,

2
Puoi anche usare ausearch -iper saddrdecodificare automaticamente quelle stringhe esadecimali.
sch

ss è più soddisfacente di lsof perché è più veloce e ha buone regole di filtro - non c'è bisogno di grep. Riesco ad apprezzare i problemi con il supporto: Systemtap è un altro strumento eccezionale, ma farlo funzionare su un server di produzione può essere ... non soddisfacente.
Max Murphy,

1

Puoi anche eseguire il grep degli enormi registri che ottieni da "ausearch -i" per vedere solo quei socket che si sono connessi con successo a un altro host su Internet. Ho scritto uno script semplicistico per ottenere ogni processo e comando che ha creato un socket per connettersi a un host su Internet insieme all'indirizzo di connessione dell'host di destinazione e l'ora corrente in cui il socket è stato "creato". Ecco qui:

#!/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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.