การค้นหากระบวนการเชื่อมต่อ TCP ที่มีอายุสั้น


15

ทำงานtcpdumpบนการเชื่อมต่อท้องถิ่นไปยังเซิร์ฟเวอร์ apache ฉันพบว่ามีการสร้างการเชื่อมต่อ TCP และปิดทันทีทุก 2 วินาที ฉันจะค้นหากระบวนการที่รับผิดชอบได้อย่างไร netstat -ctpไม่ได้ช่วยการเชื่อมต่อเร็วเกินไปและตัวระบุกระบวนการไม่ปรากฏขึ้นสำหรับ TIME_WAIT

พวกเขากลายเป็นโพรบ haproxy ซึ่งฉันสามารถตรวจสอบได้straceแต่ฉันก็ยังไม่รู้วิธีที่จะระบุ haproxy ตั้งแต่แรก

คำตอบ:


20

คุณสามารถใช้เฟรมเวิร์ก auditd สำหรับสิ่งเหล่านี้ พวกเขาไม่ได้เป็น "ผู้ใช้ที่เป็นมิตร" หรือใช้งานง่ายดังนั้นจึงต้องมีการขุดในส่วนของคุณ

ก่อนอื่นตรวจสอบให้แน่ใจว่าคุณได้ติดตั้ง auditd แล้วทำงานอยู่และเคอร์เนลของคุณรองรับ
สำหรับ Ubuntu คุณสามารถติดตั้งapt-get install auditdตัวอย่างได้

จากนั้นคุณเพิ่มนโยบายสำหรับการตรวจสอบเพื่อติดตามconnectsyscalls เช่นนี้ทั้งหมด:

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

หากคุณใช้การติดตั้ง Linux แบบ 32 บิตคุณต้องเปลี่ยน b64 เป็น b32

คำสั่งนี้จะแทรกนโยบายไปยังเฟรมเวิร์กการตรวจสอบและการเชื่อมต่อ () syscalls ใด ๆ จะถูกบันทึกลงในไฟล์บันทึกการตรวจสอบของคุณ (โดยปกติ/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 เริ่มต้นการเชื่อมต่อ () ถ้าคุณได้รับสายเชื่อมต่อจำนวนมากและต้องการที่จะ grep out ip หรือพอร์ตที่คุณต้องทำการแปลง บรรทัด SOCKADDR มีอาร์กิวเมนต์ saddr ซึ่งเริ่มต้นด้วย 0200 ตามด้วยหมายเลขพอร์ตเป็นเลขฐานสิบหก (0050) ซึ่งหมายถึง 80 และจากนั้น IP เป็นฐานสิบหก (AE84E16A) ซึ่งเป็น IP ของ news.ycombinator.com ที่ 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

แปลงที่อยู่ IP เป็น / จาก hex, dec, binary และอื่น ๆ ได้ที่:
http://www.kloth.net/services/iplocate.php

ตัวแปลง hex / dec ทั่วไป:
http://www.statman.info/conversions/hexadecimal.html

บทนำบทสรุปเกี่ยวกับ auditd จาก IT Security Stack Exchange 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แต่ต้องระวังการบันทึกที่กว้างขวางหากเป็นเครื่องที่ใช้งานหนัก แก้ไขตามต้องการ!


ขอขอบคุณสำหรับคำตอบอย่างละเอียด ฉันจะใช้คำพูดของคุณสำหรับวิธีการตรวจสอบ auditd เพราะโฮสต์เคอร์เนลไม่สนับสนุนและฉันไม่มีเวลาที่จะหาหนึ่งที่เหมาะสำหรับการทดลอง แต่ฉันจะจำไว้ว่า สำหรับวิธีการสำรวจฉันเริ่มทำสิ่งที่คล้ายกับ lsof แต่หยุดค่อนข้างเร็วเนื่องจากไม่ได้ ... พอใจ
pmezard

2
คุณยังสามารถใช้ausearch -iเพื่อsaddrถอดรหัสสตริง hex เหล่านั้นโดยอัตโนมัติสำหรับคุณ
sch

ss พอใจมากกว่า lsof เพราะเร็วกว่าและมีกฎการกรองที่ดี - ไม่จำเป็นต้องใช้ grep ฉันขอขอบคุณปัญหาที่เกิดขึ้นกับการสนับสนุน: Systemtap เป็นเครื่องมือที่ยอดเยี่ยมอีกอย่างหนึ่ง แต่การทำให้มันทำงานบนเซิร์ฟเวอร์ที่ใช้งานจริงนั้นสามารถทำได้ ... ไม่พอใจ
Max Murphy

1

คุณสามารถ grep บันทึกขนาดใหญ่ที่คุณได้รับจาก "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.