Eu quero executar algumas análises no meu mail.log (postfix 3.2.13 no Ubuntu 20.04 LTS), incluindo a atualização de um banco de dados de e-mails não entregues, então escrevi o script, excluí mail.log do script genérico /var/log logrotate e criei um new /etc/lorotate.d/mail_log que executou o script na seção post-rotate. Embora o script estivesse sendo invocado, não foi possível gerar o arquivo db:
postfix/postmap[540039]: fatal: open /etc/postfix/bad_recipients.db: Read-only file system
Pensando que isso pode realmente ser um problema de permissões, adicionei uma regra sudoers para o usuário syslog (os arquivos /var/log/mail são de propriedade do usuário syslog) e alterei o script logrotate:
/var/log/mail.log
{
rotate 30
daily
missingok
notifempty
compress
delaycompress
sharedscripts
postrotate
/usr/lib/rsyslog/rsyslog-rotate
sudo /usr/local/sbin/mailfail.sh
endscript
}
Mas ainda recebo o mesmo erro relatado na parte superior de cada mail.log ( Read-only file system
) e o banco de dados não é atualizado.
O fato de o script estar sendo executado sugere que não é um problema de configuração incorreta de chroot ou permissões ou sudo no script. Os outros arquivos que estão sendo gravados para ter permissões para o usuário syslog (o usuário que possui os arquivos de log).
O Rsyslogd parece ser o único executável na cadeia que está sujeito a um perfil apparmor - mas adicionar o caminho /etc/postfix* (rwk) ao perfil e alternar de reforçar para reclamar não teve impacto no erro.
(executar o script a partir do comando funciona conforme o esperado)
Isso provavelmente é causado pelos recursos de proteção do systemd, que estão habilitados para
logrotate
e Postfix. Em particular,ProtectSystem
, se definido como "completo" ou "estrito", resultará em/etc
somente leitura.Você deve mover qualquer coisa que queira modificar para
var
, ou se não puder evitar alterar/etc
, substituir as unidades relevantes (systemctl edit
) para alterarProtectSystem
para “true”, que protegerá,/usr
mas não/etc
.