我刚刚发现一个安全问题,我正在检查我的 IP 表规则,发现没有 DHCP 流量规则(我对所有链都有 DROP 策略),但我仍然从以下位置获取 IP 地址、子网掩码等DHCP 服务器。所以我开始研究它,在运行wireshark和一些搜索之后,我发现DHCPCD使用AF_PACKETs套接字,因此它绕过了TCP/IP堆栈(?)。
我更深入地研究了它,用 C 编写了一个简短的程序,使用 (AF_PACKET,SOCK_RAW,ETH_P_ALL) 和静态 HW、IP 和 TCP 标头(仅用于测试目的)。尝试从不在 IPTables 白名单上的服务器请求数据。当我发现 IPTables 没有机会阻止它时,我有点心跳。
我正在运行 Debian 8 «Jessie»。对于那些认为我忽略了 IPTables 规则中某些内容的人,我有非常严格的规则,其中每个目标都非常具体,通过接口、IP 地址、目标端口、协议、ctstate 等进行过滤。
还有其他人对这个问题了解更多吗?或者有什么解决方案可以阻止此流量,或者在离开主机之前强制所有流量通过 TCP/IP 堆栈和 IPTables?
答案1
您需要root权限(或至少CAP_NET_RAW)才能使用AF_PACKET。通常很难阻止根进程执行任何操作。最好的解决方案是不运行不受信任的进程。
另一种方法是在单独的网络命名空间中运行所有(根)进程,以便所有流量都必须通过主机路由。这样您就可以强制(命名空间)AF_PACKET 流量通过(主机的)IP 堆栈。
答案2
它确实有值得关注的影响。尽管这是一个相对特殊的案例,但这很令人恼火。
AF_PACKET 是一个特权操作。这意味着您的非特权用户不会因为使用它而陷入麻烦。
使用它的软件将类似于 DHCP 服务器 - 低级网络基础设施 - 否则它将能够使用正常的、更简单的界面。作为系统管理员,您肯定知道您是否安装了 DHCP 服务器。这同样适用于其他一些情况。
1. 不同区域的防火墙
您可以使用 iptables 定义具有多个“区域”或类似的防火墙,例如在 Linux 机器上充当网络和互联网之间的防火墙。在这种情况下,由于 DHCPD 等绕过此防火墙,因此您确实必须单独将策略配置到 DHCPD 等中。例如
如果系统连接了多个网络接口,但 DHCP 服务器应仅在其中一个接口上启动,请将 DHCP 服务器配置为仅在该设备上启动。在 /etc/sysconfig/dhcpd 中,将接口名称添加到 DHCPDARGS 列表中:
# Command line options here DHCPDARGS=eth0
这对于具有两个网卡的防火墙机器很有用。可以将一张网卡配置为 DHCP 客户端,以检索 Internet 的 IP 地址。另一个网卡可用作防火墙后面的内部网络的 DHCP 服务器。仅指定连接到内部网络的网卡可以使系统更加安全,因为用户无法通过互联网连接到守护程序。
--https://www.centos.org/docs/5/html/Deployment_Guide-en-US/s1-dhcp-configuring-server.html
AFAICT,ISC DHCPD 没有任何更细粒度的选项。如果您想要更细粒度的控制,您必须在网络级别实现这一点...同时使用您选择的 DHCP 中继做提供更细粒度的控制。由于初始 DHCP 接收方需要与 DHCP 客户端位于同一网络上。正如 Hauke Laging 所指出的,Linux 服务器能够以多种方式创建虚拟网络,例如,除非您确实想要,否则没有必要求助于物理上独立的防火墙盒:)。
2.数据包嗅探器
您应该害怕运行 Wireshark 数据包嗅探器,因为它正在运行一大堆用内存不安全语言编写的解析器。并且它接收的流量不会受到防火墙的限制。https://wiki.wireshark.org/Security
3. 出站防火墙
这有点含糊,但听起来像你的测试程序发送已被 iptables 防火墙阻止的数据包。即您正在过滤传出的数据包。
这不是最常见的配置。这个问题似乎并没有非常具体地说明正在使用的威胁模型,以及为什么使用这种不常见的配置,所以我不确定我可以给出什么建议。
如果您使用包含 CAP_NET_RAW 的权限运行程序,那么它能够发送不受 iptables 影响的数据包。但同样,如果您运行一个具有包含 CAP_NET_ADMIN 权限的程序,它就能够安装 iptables 规则,允许它发送它想要的任何数据包:)。