У меня есть определенная группа/разрешения, установленные для моего fail2ban.sock
файла, чтобы Zabbix мог контролировать Fail2ban, как описано здесь.https://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
with dummy echo
, и они там есть, так что ExecStartPost
действия выполняются. Но похоже, что что-то еще перезаписывает разрешение при загрузке. Есть идеи, как устранить неполадку?
решение1
Возможно, это похоже на проблему «времени» — возможно, первая из ваших ExecStartPost
истекших по времени или нескольких ExecStartPost
записей не оценивается последовательно и выполняется параллельно (из-за указанного Type
устройства или какой-то другой настройки), или что-то подобное...
Вы можете попробовать переписать его в одну строку или в какой-нибудь скрипт и использовать один ExecStartPost
параметр, или...
Почему бы просто не установить acl по умолчанию для /run/fail2ban
каталога (например, в 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
) либо с -s
параметром в модуле systemd, либо с параметром socket
внутри /etc/fail2ban/fail2ban.local
. И установить разрешения постоянно.
решение2
Поскольку вы используете сервисный модуль systemd, стоит создатьсокет systemdа также. Создав модуль сокета, systemd будет управлять файлом сокета. Владение и разрешения можно задать с помощью SocketMode
, SocketUser
, и SocketGroup
. Затем в вашем модуле службы в разделе [Unit]
add Requires=yourservice.socket
.