단기 TCP 연결 소유자 프로세스 찾기


15

tcpdump아파치 서버에 대한 로컬 연결에서 실행 되는 동안 TCP 연결이 설정되어 2 초마다 즉시 닫혔습니다. 이러한 프로세스를 담당하는 프로세스를 어떻게 찾을 수 있습니까? netstat -ctp도움이되지 않으면 연결 속도가 너무 빨라 프로세스 식별자가 TIME_WAIT 연결에 표시되지 않습니다.

그들은 haproxy 프로브로 판명 strace되었지만, 이것으로 확인할 수 는 있지만, 여전히 haproxy를 정확히 찾아 낼 방법을 모릅니다.

답변:


20

이러한 종류의 작업에 감사 된 프레임 워크를 사용할 수 있습니다. 그들은 "사용자 친화적"이거나 직관적이지 않기 때문에 약간의 파고가 필요합니다.

먼저 감사 설치, 실행 및 커널이 지원하는지 확인하십시오.
우분투의 apt-get install auditd경우 예를 들어 설치할 수 있습니다 .

그런 다음 감사에 대한 정책을 추가하여 다음 connect과 같이 모든 syscall 을 모니터링 하십시오.

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

Linux의 32 비트 설치를 사용하는 경우 b64를 b32로 변경해야합니다.

이 명령은 감사 프레임 워크에 정책을 삽입하고 이제 connect () syscall이 감사 로그 파일 (보통 /var/log/audit/audit.log)에 기록됩니다 .

예를 들어, netcat을 news.ycombinator.com 포트 80에 연결하면 다음과 같은 결과가 발생합니다.

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

여기에서 /bin/nc.openbsd 응용 프로그램이 connect () 호출을 시작했음을 알 수 있습니다. 많은 연결 호출을 받고 특정 IP 또는 포트만 grep하려는 경우 약간의 변환을 수행해야합니다. SOCKADDR 행에는 saddr 인수가 포함되며 0200으로 시작하고 16을 나타내는 16 진수 (0050)의 포트 번호 (80)를 의미하고 16 진수의 IP (AE84E16A)는 news.ycombinator.com의 IP 174.132.225.106입니다.

감사 프레임 워크는 많은 로그를 생성 할 수 있으므로 미션을 완료하면 비활성화해야합니다. 위의 정책을 비활성화하려면 다음과 같이 -a를 -d로 바꾸십시오.

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

감사 된 프레임 워크에 대한 유용한 문서 :
http://doc.opensuse.org/products/draft/SLES/SLES-security_sd_draft/part.audit.html

http://www.kloth.net/services/iplocate.php 에서 IP 주소를 16 진수, 12 월, 바이너리 등으로 변환합니다.

일반 16 진 / dec 변환기 :
http://www.statman.info/conversions/hexadecimal.html

IT 보안 스택 교환에서 감사에 대한 간략한 소개. http://security.blogoverflow.com/2013/01/a-brief-introduction-to-auditd/

편집 1 :
또 다른 빠른 '더러운 (스웨덴어 : fulhack) 방법은 다음과 같이 연결 데이터를 덤프하는 빠른 루프를 만드는 것입니다.

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

이 명령은 ss명령 (소켓 통계)을 사용하여 시작된 프로세스를 포함하여 현재 설정된 연결을 포트 80에 덤프합니다. 많은 데이터가 있으면 | tee /tmp/output화면에 출력을 표시하고 나중에 처리 / 파기 할 수 있도록 / tmp / output에 기록하기 위해 추가 한 후에 추가 할 수 있습니다 . 빠른 haproxy 연결을 찾지 못하면 제거를 시도 sleep 1하지만 사용량 이 많은 시스템 인 경우 광범위한 로깅에주의하십시오. 필요에 따라 수정하십시오!


자세한 답변 감사합니다. 호스트 커널이 지원하지 않으므로 감사 솔루션에 대한 귀하의 말을 들겠습니다. 지금 실험에 적합한 것을 찾을 시간이 없지만, 나는 그것을 명심할 것입니다. 폴링 솔루션에 관해서는 lsof와 비슷한 작업을 시작했지만 만족스럽지 않아 꽤 빨리 멈췄습니다.
pmezard

2
16 진수 문자열을 자동으로 디코딩 ausearch -i하는 데 사용할 수도 있습니다 saddr.
sch

ss는 lsof보다 빠르며 grep가 필요없는 필터링 규칙이 빠르기 때문에 lsof보다 더 만족합니다. 지원 문제를 이해할 수 있습니다. Systemtap은 훌륭한 도구이지만 프로덕션 서버에서 실행되도록하는 것은 만족스럽지 않습니다.
Max Murphy

1

인터넷에서 다른 호스트에 성공적으로 연결된 소켓 만 보려면 "ausearch -i"에서 얻은 거대한 로그를 가져와도됩니다. 필자는 인터넷에서 호스트에 연결하기 위해 소켓을 생성 한 각 프로세스와 명령을 해당 대상 호스트의 연결 주소와 소켓이 "생성 된"현재 시간으로 가져 오는 간단한 스크립트를 작성했습니다. 여기있어:

#!/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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.