![使用 systemd 沙箱强化 fail2ban](https://linux22.com/image/784550/%E4%BD%BF%E7%94%A8%20systemd%20%E6%B2%99%E7%AE%B1%E5%BC%BA%E5%8C%96%20fail2ban.png)
我一直在尝试遵循 ArchWiki 关于强化 Fail2Ban 的说明:
https://wiki.archlinux.org/title/Fail2ban#Service_hardening
具体来说,我按照说明创建了一个插入文件并启动了服务。问题是我看到了如下日志条目:
fail2ban.actions [1500]: NOTICE [sshd] Ban xxx.xxx.xxx.xxx
fail2ban.utils [1500]: ERROR 7f76a9d13550 -- exec: { iptables -w -C f2b-sshd -j RETURN >/dev/null 2>&1; } || { iptables -w -N f2b-sshd || true; iptables -w -A f2b-sshd -j RETURN; }
for proto in $(echo 'tcp' | sed 's/,/ /g'); do
{ iptables -w -C INPUT -p $proto -m multiport --dports ssh -j f2b-sshd >/dev/null 2>&1; } || { iptables -w -I INPUT -p $proto -m multiport --dports ssh -j f2b-sshd; }
done
fail2ban.utils [1500]: ERROR 7f76a9d13550 -- stderr: "Fatal: can't open lock file /run/xtables.lock: Read-only file system"
fail2ban.utils [1500]: ERROR 7f76a9d13550 -- stderr: "Fatal: can't open lock file /run/xtables.lock: Read-only file system"
fail2ban.utils [1500]: ERROR 7f76a9d13550 -- stderr: "Fatal: can't open lock file /run/xtables.lock: Read-only file system"
fail2ban.utils [1500]: ERROR 7f76a9d13550 -- returned 4
fail2ban.actions [1500]: ERROR Failed to execute ban jail 'sshd' action 'iptables-multiport' info 'ActionInfo({'ip': 'xxx.xxx.xxx.xxx', 'family': 'inet4', 'fid': <function Actions.ActionInfo.<lambda> at 0x7f76b0c713f0>, 'raw-ticket': <function Actions.ActionInfo.<lambda> at 0x7f76b0c71ab0>})': Error starting action Jail('sshd')/iptables-multiport: 'Script error'
尽管systemctl show fail2ban.service | grep xtables
表明/run/xtables.lock
已在中列出ReadWritePaths
。
我推测这是因为服务启动时文件不存在,因此无法以读/写方式挂载到沙盒中。我可以通过运行以下命令来解决这个问题:
sudo touch /run/xtables.lock
并重新启动服务,但每次重新启动服务器时都必须执行此操作(/run
是tmpfs
)。
不确定修复此问题的最佳方法是什么。我以为我可以使用ExecStartPre
来运行该touch
命令,但似乎它也在沙箱中运行,因此没有写入权限/run
。
答案1
配置 tmpfiles.d(5) 以在启动时创建该文件。
f /run/xtables.lock 0644 root root
可以以 a 作为前缀来单独 ExecStartPre= 命令+
以将其排除在权限相关参数之外。