ntpd 以非 root 身份运行,但传出的数据包与 uid 0 匹配

ntpd 以非 root 身份运行,但传出的数据包与 uid 0 匹配

我将默认的 iptables OUTPUT 链设置为 DROP 数据包。然后我创建了一条防火墙规则,只允许 ntp 用户发送 ntp 数据包:

iptables -A OUTPUT -m owner --uid-owner ntp -p udp --dport 123 -j ACCEPT

然而,每隔 10-20 分钟我就会看到:

ntpd[27769]: sendto(<snip>) (fd=22): Operation not permitted

然后我删除了-m owner --uid-owner ntp该规则的一部分并在其之前添加了一条日志规则:

iptables -A OUTPUT -p udp --dport 123 -j LOG --log-level debug \
    --log-prefix "Spotted a NTP packet: " --log-uid

ntpd再次开始工作,在内核环缓冲区中,我看到:

Spotted a NTP packet: <snip> PROTO=UDP SPT=123 DPT=123 LEN=56 UID=0

我正在使用--log-uid交换机到LOG目标,并ntpd以 ntp 用户(uid=38)的身份运行:

# ps auxf | grep ntpd
ntp      27769  0.0  1.0   4512  4508 ?        SLs  Jan04   0:00 ntpd -u ntp:ntp -p /var/run/ntpd.pid

但日志显示UID=0。我确信系统上没有其他任何东西在发送 ntp 数据包,而且由于我不再收到Operation not permitted,我确信事实上是ntpd它发送了数据包。

我想我可以不匹配这些数据包的 ntp 用户;然而,有人能解释一下为什么 iptables 没有显示 UID=38 这些数据包?

答案1

如果某个程序要使用小于 1024 的端口,则必须以 root 身份运行。许多应用程序(如 NTP)将启动并以 root 身份打开端口,然后将其他所有权限移交给某个已定义的帐户。

答案2

您的 iptables 规则有错误:

iptables -A OUTPUT -m owner --uid-owner ntp -p udp --dport 123 -j ACCEPT

如果你使用--uid 所有者有必要定义用户ID- 数字值。
对于程序名称,您需要另一个选项:--cmd 所有者。正确的规则是:

iptables -A OUTPUT -m owner --cmd-owner ntp -p udp --dport 123 -j

详细解释您可以阅读经过奥斯卡·安德烈森

相关内容