在一些服务器安全场景中,需要通过网络连接关联到相关进程。例如,在安全溯源场景中,通过威胁情报可以判断某台主机上存在恶意连接,这时就需要追查这些恶意连接是由哪个进程以及哪个可执行文件来发起的。又或者,在微隔离场景中,我们不仅仅需要知道IP:Port
与IP:Port
之间的访问关系,我们还需要额外增加进程级别的信息,也就是哪个进程通过IP:Port
在访问IP:Port
的哪个进程。
要解决这种网络连接与进程关联的问题,在用户态的可行办法主要是通过读取/proc/net/tcp
以及/proc/[pid]/fd
这两种文件来构建相应的映射结构。
通过读取文件/proc/net/tcp
可获取系统的TCP连接信息:
1 2 3 4 5 6 [root@centos3 tcpconn]# cat /proc/net/tcp sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode 0: 00000000:006F 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 13841 1 ffff9fc7da7c8000 100 0 0 10 0 1: 00000000:0016 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 16863 1 ffff9fc7da7c87c0 100 0 0 10 0 2: 0100007F:0019 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 17951 1 ffff9fc7da7c9f00 100 0 0 10 0 3: 0F02000A:0016 0202000A:F3FE 01 00000000:00000000 02:000AF352 00000000 0 0 23961 4 ffff9fc7da7c8f80 20 4 25 10 -1
从其中可获取TCP连接四元组及对应socket的inode
号。
而从/proc/[pid]/fd
中可以获取进程所有的文件描述符:
1 2 3 4 5 6 7 [root@centos3 tcpconn]# ls -l /proc/823/fd total 0 lr-x------. 1 root root 64 Jul 24 15:06 0 -> /dev/null lrwx------. 1 root root 64 Jul 24 15:06 1 -> socket:[16389] lrwx------. 1 root root 64 Jul 24 15:06 2 -> socket:[16389] lrwx------. 1 root root 64 Jul 24 15:06 3 -> socket:[16863] lrwx------. 1 root root 64 Jul 24 15:06 4 -> socket:[16939]
其中也可以获取相应的inode
号.
这样,我们就可以从/proc/net/tcp
建立起网络连接五元组->inode
的映射, 再从/proc/pid/fd
建立起连接inode->进程
的映射。从而实现网络连接关联到相应进程。
但这种方式整个映射关系的建立依赖周期性读取两种proc文件,缺乏实时性,对于瞬时连接相应的数据可以无法实时获取到,从而无法关联到进程。