linux - 获取内核中套接字事件的通知

标签 linux sockets audit selinux

我需要为本地 tcp-connections/Unix-domain-connections 找到以最有效的方式启动连接的客户端进程。

我目前有一个在驱动程序中实现的解决方案,它拦截接受和连接系统调用,匹配它们,并找出客户端进程。

现在,我尝试在没有自己的驱动程序的情况下实现相同的效果。

我尝试过的不同方法:

  • Linux 审计系统插件,拦截适当的系统调用并以类似方式解析客户端。这种方法有3个问题:
    1. 每个截获的事件都从内核流向 auditd 进程,再流向其他一些中间进程,并且只流向我的插件。
    2. 审核规则适用于所有插件和审核日志——我无法定义自己的过滤规则集。 - 这可能会导致使用审计系统的机器效率极低。
    3. 它要求在机器上安装审计(这对于许多 Linux 发行版来说不是默认的)。
  • 模仿 netstat/lsof - 为了找到持有连接的进程,它们迭代整个 procfs 挂载 - 这是有道理的,因为在连接建立后,每个连接可能属于多个进程。 如果我想对每个连接建立都这样做,这种方法是极其无效的。
  • 我想尝试其中一种 LSM(Linux 安全模块)解决方案 - 但我目前不熟悉它 - 他们的 LSM 是否可以传递正在运行的应用程序的内核事件以进行“决策”?

我很乐意听到建议和其他评论,这些建议和评论可以引导我找到实现我最初目标的合理解决方案。

最佳答案

找到了一个仅适合我对 Unix 域套接字需求的选项 - 如果可以在服务器端运行代码(如我的情况),则可以按以下方式使用 getsockopt:

getsockopt(fd, SOL_SOCKET, SO_PEERCRED, &cr, &len)

更多详情请参见 http://welz.org.za/notes/on-peer-cred.html

关于linux - 获取内核中套接字事件的通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43435556/

相关文章:

linux - 如何监控进程工作目录的变化?

c - 如何检查套接字上是否有数据可用?

c - 无效的读写valgrind

azure - 90 天后访问 Azure B2C 登录日志

c# - Entity Framework 创建审计表/历史表?

python - 从 Python 运行 bash 脚本

linux - 防止 rpmbuild 读取 ~/.rpmmacros

linux - 从 Linux 机器中存在的 Web 应用程序访问 MS SQL Server?

Android 蓝牙 socket.connect() 失败

sql-server - 如何自定义 Visual Studio 生成的 SQL 脚本