Пошук недовговічного процесу власника TCP-з'єднань


15

Працюючи tcpdumpна локальних з'єднаннях з сервером apache, я виявив, що з'єднання TCP встановлюються та закриваються негайно кожні 2 секунди. Як я можу знайти, який процес відповідає за них? netstat -ctpне допомогло, з'єднання були занадто швидкими і ідентифікатор процесу не відображається для TIME_WAIT.

Вони виявились гапрокси-зондами, які я міг би перевірити strace, але я досі не знаю жодного способу точно визначити хапрокси в першу чергу.

Відповіді:


20

Ви можете використовувати рамку аудиту для подібних речей. Вони не дуже зручні для користувачів чи інтуїтивно зрозумілі, тому потрібно трохи копатися з вашого боку.

Спочатку переконайтеся, що ви встановили, запустили аудит і чи підтримує його ядро.
Для Ubuntu ви можете встановити його, apt-get install auditdнаприклад.

Потім ви додаєте політику для аудиту для моніторингу всіх connectподібних викликів:

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

Якщо ви використовуєте 32-бітну установку Linux, вам потрібно змінити b64 на b32.

Ця команда вставить політику до структури аудиту, і будь-які систематичні виклики connect () тепер будуть записані у ваші журнали аудиту (як правило /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 чи порт, вам доведеться виконати певну конверсію. Рядок 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-адрес у / із шістнадцяткових, розрядних, двійкових тощо тощо за адресою:
http://www.kloth.net/services/iplocate.php

Загальний шестигранний / декакторний конвертер:
http://www.statman.info/conversions/hexadecimal.html

Короткий вступ до аудиту із біржі стека безпеки ІТ. 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 / вихід для подальшої обробки / копання. Якщо він не сприймає швидке хапрокси-з'єднання, будь ласка, спробуйте видалити, sleep 1але будьте обережні до великого журналу, якщо його машина з великим використанням. Модифікуйте за потребою!


Дякую за детальну відповідь. Я візьму ваше слово для рішення аудита, оскільки ядро ​​хоста не підтримує його, і зараз не маю часу знайти те, що підходить для експериментів, але я пам’ятаю про це. Щодо рішення для опитування, я почав робити щось подібне з lsof, але зупинився досить швидко, оскільки це не було ... задоволення.
пмезард

2
Ви також можете використовувати ausearch -iці saddrшістнадцяткові рядки автоматично розшифровуватись для ваших.
sch

ss є більш задоволеним, ніж lsof, оскільки він швидший і він має хороші правила фільтрації - немає необхідності в грепі. Я можу оцінити проблеми з підтримкою: Systemtap - це ще один чудовий інструмент, але його запуск на виробничому сервері може бути ... не задовольняючим.
Макс Мерфі

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.