我为我的文件设置了一些特定的组/权限,fail2ban.sock
以使 Zabbix 能够按照此处所述监控 Fail2banhttps://github.com/hermanekt/zabbix-fail2ban-discovery-
我在 systemd 服务配置中添加了以下几行以确保服务重启后权限正确:
[Service]
ExecStartPost=/bin/sh -c "while ! [ -S /run/fail2ban/fail2ban.sock ]; do sleep 1; done"
ExecStartPost=/bin/chgrp fail2ban /run/fail2ban/fail2ban.sock
ExecStartPost=/bin/chmod g+w /run/fail2ban/fail2ban.sock
当我尝试使用 手动重启服务时,它运行完美systemctl restart fail2ban
。但出于某种原因,它在重启后不起作用。我尝试使用ExecStartPost
dummy添加一些调试行echo
,它们在那里,所以ExecStartPost
操作正在执行。但看起来其他东西在启动时重写了权限。关于如何排除故障有什么想法吗?
答案1
这看起来可能像一个“时间”问题 - 也许您的第一个ExecStartPost
超时或多个ExecStartPost
条目没有按顺序评估并并行运行(由于指定Type
的单位或其他设置),或者类似的东西......
您可以尝试用单行或某些脚本重写它并使用单个ExecStartPost
参数,或者......
为什么不为/run/fail2ban
目录设置默认 acl(例如,在ExecStartPre
),以便套接字最初以正确的权限创建?请参阅https://unix.stackexchange.com/a/1315/452987
因此,尝试这样的操作:
ExecStartPre=-/bin/mkdir -p /run/fail2ban && /bin/setfacl -d -m g:fail2ban:rw /run/fail2ban
另一种方法是简单地将 fail2ban 套接字的另一条路径设置为某个持久目录(例如,/opt/fail2ban
而不是/run/fail2ban
),使用systemd 单元中的参数或内的-s
参数。并持久设置权限。socket
/etc/fail2ban/fail2ban.local
答案2
由于你使用的是 systemd 服务单元,因此值得创建一个systemd 套接字单元以及。通过创建套接字单元,systemd 将管理套接字文件。所有权和权限可以使用SocketMode
、SocketUser
和来设置SocketGroup
。然后在您的服务单元中的部分[Unit]
添加Requires=yourservice.socket
。