Encontrando o processo do proprietário de conexões TCP de vida curta

12

Executando tcpdump em conexões locais para um servidor apache, encontrei conexões TCP sendo estabelecidas e fechadas imediatamente a cada 2 segundos. Como faço para descobrir qual processo é responsável por isso? netstat -ctp não ajudou, as conexões foram muito rápidas e o identificador do processo não é exibido por TIME_WAIT.

Eles se revelaram sondas haproxy, que eu pude verificar com strace , mas ainda não sei como identificar o haproxy em primeiro lugar.

    
por pmezard 21.01.2012 / 16:54

2 respostas

13

Você pode usar o framework auditd para esse tipo de coisa. Eles não são muito "amigáveis" ou intuitivos, então requer um pouco de escavação da sua parte.

Primeiro, certifique-se de ter o auditd instalado, em execução e de que seu kernel o suporta.
Para o Ubuntu você pode instalá-lo com apt-get install auditd , por exemplo.

Em seguida, você adiciona uma política de auditoria para monitorar todos os connect syscalls da seguinte forma:

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

Se você estiver usando uma instalação de 32 bits do Linux, precisará alterar b64 para b32.

Este comando irá inserir uma política no framework de auditoria, e qualquer syscalls connect () será agora registrado em seus arquivos de log de auditoria (geralmente /var/log/audit/audit.log ) para você olhar.

Por exemplo, uma conexão com o netcat para a porta 80 do news.ycombinator.com resultará em algo como isto:

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

Aqui você pode ver que o aplicativo /bin/nc.openbsd iniciou uma chamada connect (), se você receber muitas chamadas de conexão e quiser apenas obter um certo ip ou porta, terá que fazer alguma conversão. A linha SOCKADDR contém um argumento saddr, que começa com 0200 seguido pelo número da porta em hexadecimal (0050) que significa 80, e depois o IP em hexadecimal (AE84E16A) que é o IP do news.ycombinator.com de 174.132.225.106.

O framework de auditoria pode gerar muito de logs, então lembre-se de desativá-lo quando tiver cumprido sua missão. Para desativar a política acima, simplesmente substitua -a por -d como tal:

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

Boa documentação sobre o framework auditd: link

Converta endereços IP de / para hex, dec, binário, etc em: link

Conversor hex / dec geral:
link

Uma breve introdução para auditoria, a partir do Stack Stack de segurança de TI. link

Editar 1 :
Outra maneira rápida de fazer isso é criar um loop rápido que despeja os dados de conexão para você, assim:

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

Este comando usa o comando ss (estatísticas de soquete) para despejar as conexões estabelecidas atuais para a porta 80, incluindo qual processo o iniciou. Se houver muitos dados, você pode adicionar | tee /tmp/output depois de feito para mostrar a saída na tela, bem como gravá-la em / tmp / output para processamento posterior / escavação. Se ele não obtiver a conexão haproxy rápida, tente remover sleep 1 , mas seja cauteloso com registros extensivos se for uma máquina muito utilizada. Modifique conforme necessário!

    
por 21.01.2012 / 18:33
1

Você também pode fazer o grep dos enormes logs que você recebe de "ausearch -i" para ver apenas os sockets que se conectaram com sucesso a outro host na Internet. Eu escrevi um script simplista para obter cada processo e comando que criou um soquete para se conectar a um host na Internet junto com o endereço de conexão desse host de destino e a hora atual em que o soquete foi "criado". Aqui está:

#!/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
    
por 27.09.2015 / 19:15