Нахождение недолговечного владельца соединений TCP процесс

Если Вы открыты в возвращении к fail2ban, можно всегда использовать ignoreip директива в jail.conf. Например:

ignoreip = 127.0.0.1 192.168.1.0/32

Таким образом, Вы не становитесь заблокированными со своим неаккуратным вводом ;-) Это также означает, что люди не могут заблокировать Вас путем спуфинга IP (Хотя с любым трафиком TCP, который не является к большому из беспокойства).

14
задан 21 January 2012 в 17:54
3 ответа

Для такого рода вещей вы можете использовать структуру auditd. Они не очень "удобны для пользователя" или интуитивно понятны, поэтому с вашей стороны нужно немного покопаться.

Сначала убедитесь, что Auditd установлен, запущен и его поддерживает ядро.
For Ubuntu you can install it with apt-get install auditd for example.

Then you add a policy for audit to monitor all connect syscalls like this:

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

If you are using a 32-bit installation of Linux you have to change b64 to b32.

This command will insert a policy to the audit framework, and any connect() syscalls will now be logged to your audit logfiles (usually /var/log/audit/audit.log) for you to look at.

For example, a connection with netcat to news.ycombinator.com port 80 will result in something like this:

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

Here you can see that the /bin/nc.openbsd application initiated a connect() call, if you get lots of connect calls and only want to grep out a certain ip or port you have to do some conversion. The SOCKADDR line contains a saddr argument, it begins with 0200 followed by the port number in hexadecimal (0050) which means 80, and then the IP in hex (AE84E16A) which is news.ycombinator.com's IP of 174.132.225.106.

The audit framework can generate a lot of logs, so remember to disable it when you've accomplished your mission. To disable the above policy, simply replace -a with -d as such:

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

Good documentation on the auditd framework:
http://doc.opensuse.org/products/draft/SLES/SLES-security_sd_draft/part.audit.html

Convert IP adresses to/from hex, dec, binary, etc at:
http://www.kloth.net/services/iplocate.php

General hex/dec converter:
http://www.statman.info/conversions/hexadecimal.html

A Brief Introduction to auditd, from the 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 , но будьте осторожны с обширным журналированием, если это сильно загруженная машина. При необходимости измените!

18
ответ дан 2 December 2019 в 21:08

Вы также можете использовать 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
1
ответ дан 2 December 2019 в 21:08

На самом деле многое изменилось с тех пор, как был задан этот вопрос. Большинство современных Linux-систем имеют расширенные возможности трассировки, которые можно использовать для этой цели.

Например: bcc (в некоторых дистрибутивах это называется bpfcc-tools) есть утилита tcpconnect, которая делает именно это. Вот фрагмент из официального примера:

TIME(s)  PID    COMM         IP SADDR            DADDR            DPORT
31.871   2482   local_agent  4  10.103.219.236   10.251.148.38    7001
31.874   2482   local_agent  4  10.103.219.236   10.101.3.132     7001
31.878   2482   local_agent  4  10.103.219.236   10.171.133.98    7101
90.917   2482   local_agent  4  10.103.219.236   10.251.148.38    7001
90.928   2482   local_agent  4  10.103.219.236   10.102.64.230    7001
90.938   2482   local_agent  4  10.103.219.236   10.115.167.169   7101

Еще один вариант — это утилита bpftrace, которая имеет аналог tcpconnect.

Или вы даже можете использовать простой ftrace (но в этом случае вам придется сделать скрипт, который будет декодировать структуру sockaddr или делать это вручную). Например:

# Enable probe
echo 'p:tcp/connect tcp_connect sock=+0(%di):x8[32] prog=$comm' > /sys/kernel/debug/tracing/kprobe_events
echo 1 > /sys/kernel/debug/tracing/events/tcp/connect/enable

# Wait time till connect would be called by apps and check trace buffer
cat /sys/kernel/debug/tracing/trace # note sockaddr data will be encoded here
# disable tracepoint when it's done
echo 0 > /sys/kernel/debug/tracing/events/tcp/connect/enable
echo '-:tcp/connect' >  /sys/kernel/debug/tracing/kprobe_events

Примечание: в некоторых случаях вам может понадобиться монтировать debugfs/tracefs.

3
ответ дан 12 August 2020 в 21:12

Теги

Похожие вопросы