LSMLinux Security Module网络管控是内核级强制访问控制MAC体系通过在 socket 与协议栈关键路径植入安全钩子对进程网络行为做 “主体 — 客体 — 操作” 的精细化裁决比 Netfilter/iptables 更贴近进程语义、更难绕过。LSM 网络管控核心原理LSM 是内核轻量级安全框架核心是钩子hook 安全域 模块注册钩子机制内核在 socket 创建、连接、监听、收发等关键路径预埋回调点安全模块可注册函数拦截并裁决。安全域Security Context进程、socket、网卡、IP 等内核对象附加安全标签如 SELinux 的sid作为策略匹配依据。强制执行独立于自主访问控制DAC如 UID/GID即便进程是文件 / 网络资源属主也可被 LSM 策略拒绝。LSM 与 Netfilter 区别LSM位于 socket / 进程层按进程身份 安全标签管控适合应用级隔离如容器、进程网络权限。Netfilter位于 IP / 包层按五元组过滤适合网络层防火墙如端口封禁、NAT。关键网络钩子核心控制点LSM 网络管控覆盖 socket 全生命周期核心钩子定义于include/linux/security.h钩子函数触发时机管控能力security_socket_create创建 socketsocket()禁止进程创建 TCP/UDP/RAW 套接字security_socket_bind绑定端口bind()限制进程绑定特定端口 / 网卡security_socket_connect发起连接connect()阻断进程连接特定 IP / 端口核心管控点security_socket_listen开始监听listen()禁止进程监听敏感端口security_socket_sendmsg发送数据send()/write()拦截进程向外发数据防数据泄露security_socket_recvmsg接收数据recv()/read()阻止进程接收特定来源数据security_inet_conn_request入站连接请求控制外部连接到本机进程的权限LSM 钩子的 “三层拦截”LSM 在内核网络路径预埋钩子可在三个阶段劫持连接劫持控制层钩子security_socket_connect/security_socket_bind/security_socket_listen时机connect()/bind()调用时能力阻断、重定向目标 IP / 端口、替换 socket如转向本地 MITM 代理数据劫持数据层钩子security_socket_sendmsg/security_socket_recvmsg时机send()/recv()读写时能力捕获、篡改、丢弃数据包如解密 TLS、注入恶意载荷包劫持内核栈层钩子security_inet_conn_request/security_netif_receive_skb时机TCP 握手、网卡收包时能力拦截入站连接、修改 skb 内容、转发到其他设备传统 LSM 模块SELinux/AppArmor策略级劫持原理通过 TE 策略 / Profile 规则强制进程只能连接指定地址间接 “劫持” 到代理端口。示例AppArmor 强制 80/443→8080 代理/usr/bin/curl { network tcp, deny network tcp dest*, allow network tcp dest127.0.0.1:8080, }缺点只能控制 “允许 / 拒绝”无法动态修改流量内容。eBPF-LSM5.7 内核动态透明劫持推荐原理eBPF 程序挂载 LSM 钩子在内核态直接修改连接目标或数据包无需内核模块、不重启系统。典型场景进程级透明 MITM劫持特定进程的 HTTPS 流量到本地代理。代码示例劫持 connect 到 127.0.0.1:8080SEC(lsm/socket_connect) int BPF_PROG(hijack_connect, struct socket *sock, struct sockaddr *addr, int addrlen, int ret) { if (ret ! 0) return ret; if (addr-sa_family ! AF_INET) return 0; struct sockaddr_in *ipv4 (struct sockaddr_in *)addr; // 保存原目标IP/端口可选 __u32 orig_ip ipv4-sin_addr.s_addr; __u16 orig_port ipv4-sin_port; // 劫持到本地代理 127.0.0.1:8080 ipv4-sin_addr.s_addr htonl(0x7F000001); // 127.0.0.1 ipv4-sin_port htons(8080); bpf_printk(LSM Hijack: %pI4:%d → 127.0.0.1:8080, orig_ip, ntohs(orig_port)); return 0; // 允许修改后的连接 }关键修改struct sockaddr_in后返回 0内核会使用修改后的地址建立连接。LSMNetfilter 联动全局流量劫持组合LSM 识别进程→Netfilteriptables/nftables重定向流量。流程LSM 钩子标记目标进程如 PID1234iptables 根据 PID 匹配重定向其 OUTPUT 流量到本地代理优势LSM 负责进程精准筛选Netfilter 负责高效包转发适合大规模部署。Netfilter 如何关联 PID 与流量Netfilter 钩子OUTPUT/POSTROUTING能拿到本机发包的struct sk_buff而sk_buff包含 socket 指针socket 又绑定创建它的进程PID/UID。路径进程 → socket → sk_buff → Netfilter 钩子 → 匹配 PID/UID → 放行 / 丢弃 / 重定向限制仅对 ** 本机发出的流量OUTPUT** 有效转发流量FORWARD无进程信息无法匹配 PID。eBPF 程序挂载 Netfilter 钩子直接解析 sk_buff 拿到 PID动态匹配并劫持流量5.8 内核支持。核心代码eBPF 匹配 PID 并阻断SEC(netfilter/OUTPUT) int BPF_PROG(pid_filter, struct sk_buff *skb, const struct nf_hook_state *state) { struct sock *sk skb-sk; if (!sk) return NF_ACCEPT; // 获取进程 PID pid_t pid BPF_CORE_READ(sk, sk_socket, sk_wq, pid); // 阻断 PID 1234 if (pid 1234) return NF_DROP; return NF_ACCEPT; }优势无内核模块、动态加载、性能高、精准 PID 匹配缺点需 eBPF 环境开发成本高。劫持 vs 传统流量控制技术层级劫持粒度能否改内容绕过难度LSMeBPFsocket / 进程层进程 IP 端口✅ 可改连接 / 数据极高内核强制Netfilter/iptablesIP / 包层五元组❌ 仅转发 / 丢弃中本地代理可绕LD_PRELOAD用户态进程✅ 但易检测低可被 uname/ps 绕过主流 LSM 模块网络管控能力1. SELinuxRHEL/CentOS 默认模型标签 类型强制访问控制TE所有进程 / 资源有唯一安全上下文如system_u:system_r:httpd_t:s0。网络管控按进程类型domain 端口 / IP / 协议授权如httpd_t仅允许 80/443 端口。支持网卡、IPsec、TCP 连接的细粒度标签化管控。特点安全强度最高、粒度最细配置复杂、学习曲线陡。2. AppArmorUbuntu/Debian 默认模型路径 程序 profile基于可执行文件路径定义规则。网络管控规则语法简洁直接限制程序的网络行为如/usr/bin/curl仅允许连接*.example.com。支持network权限tcp/udp/raw、端口、主机名匹配。特点配置简单、易调试粒度较粗依赖路径安全性低于 SELinux。3. Smack简化 MAC嵌入式常用模型极简标签4 字节进程 / 资源标记单一标签规则为 “标签 A 允许 标签 B”。网络管控按标签授权进程间、进程与网络资源的访问适合物联网 / 嵌入式设备。4. eBPF-LSM5.15 内核新范式原理eBPF 程序直接挂载 LSM 钩子无需内核模块用户态可动态加载 / 卸载规则。示例阻断进程连接 1.1.1.1SEC(lsm/socket_connect) int BPF_PROG(restrict_connect, struct socket *sock, struct sockaddr *addr, int addrlen, int ret) { if (ret ! 0) return ret; // 不覆盖已有拒绝 if (addr-sa_family ! AF_INET) return 0; struct sockaddr_in *ipv4 (struct sockaddr_in *)addr; if (ipv4-sin_addr.s_addr htonl(0x01010101)) // 1.1.1.1 return -EPERM; // 阻断 return 0; }特点灵活、动态、安全eBPF 沙箱需内核 5.15 并开启CONFIG_BPF_LSM。典型应用场景容器安全隔离限制容器进程仅访问指定网络防止容器逃逸后横向移动如 Kubernetes AppArmor/SELinux 配置。进程级数据防泄露禁止敏感进程如财务软件、数据库向外网发送数据仅允许访问内网特定服务器。服务器最小权限加固Web 服务器仅开放 80/443数据库仅监听内网端口SSH 仅允许管理员 IP 连接。嵌入式 / IoT 设备管控轻量级 Smack/eBPF-LSM 限制设备仅连接指定云端防止恶意联网。HTTPS 透明 MITM劫持浏览器 / APP 的 TLS 流量解密后审计或篡改企业上网行为管理。容器流量管控劫持容器进程网络防止逃逸后横向移动K8s 网络策略增强。恶意软件流量分析隔离恶意进程劫持其 C2 通信捕获指令与数据。数据防泄露DLP劫持敏感进程如财务软件的外发流量阻断涉密数据外传。与其他网络管控技术对比技术层级管控粒度绕过难度适用场景LSMSELinux/AppArmor进程 /socket 层进程 IP 端口 协议极高内核强制容器、服务器、高安全环境Netfilter/iptablesIP / 包层五元组IP / 端口 / 协议中可通过本地代理绕过网络层防火墙、NATSeccomp系统调用层系统调用白名单高限制 syscall容器进程 syscall 过滤不直接管控网络应用层代理用户态应用 域名 / IP低可绕过代理优缺点与风险优点进程级精准只劫持目标进程不影响全局。内核级强制绕过难度远高于用户态代理。动态灵活eBPF-LSM 可热更新规则无需重启。风险与防御权限要求需CAP_BPFCAP_PERFMON或 root。检测可通过bpftool prog list查看 eBPF-LSM 程序dmesg | grep lsm查看劫持日志。防护启用 LSM Stacking如 SELinuxeBPF-LSM禁止未授权 eBPF 程序加载。总结LSM 网络管控是 Linux 内核原生、高强度的进程级网络安全机制通过钩子 安全域实现强制访问控制适合容器隔离、数据防泄露、服务器加固等场景。SELinux适合高安全企业环境AppArmor适合快速部署eBPF-LSM是未来动态管控的主流方向。