SELinux nega “systemctl kill” quando usado no script posttrotate do Anacron no CentOS 7

1

Estou usando o software de backup chamado UrBackup, que configurei para girar seus logs uma vez por dia através do cron.daily. Depois que os logs são girados, o software usa um script postrotate para enviar ao processo em execução um sinal HUP com "systemctl kill". No entanto, o SELinux está negando essa operação e não consigo descobrir como consertar isso.

Aqui está o arquivo de configuração do logrotate para o UrBackup em /etc/logrotate.d:

"/var/log/urbackup.log" {
        daily
        rotate 30
        missingok
        create 640 urbackup urbackup
        compress
        postrotate
                test -e /var/run/urbackupsrv.pid && kill -HUP 'cat /var/run/urbackupsrv.pid' || /bin/systemctl kill -s HUP urbackup-server.service
        endscript
}

Como descobri, o seguinte script pós-problemático problemático está sendo executado no sistema:

/bin/systemctl kill -s HUP urbackup-server.service

O SELinux está bloqueando isso. Aqui está a entrada de registro relevante de / var / log / messages:

Nov 14 03:33:33 backup4 kernel: type=1107 audit(1510648413.518:4407695): pid=1 uid=0 auid=4294967295 ses=4294967295 subj=system_u:system_r:init_t:s0 msg='avc:  denied  { stop } for auid=0 uid=0 gid=0 path="/usr/lib/systemd/system/urbackup-server.service" cmdline="/bin/systemctl kill -s HUP urbackup-server.service" scontext=system_u:system_r:logrotate_t:s0-s0:c0.c1023 tcontext=system_u:object_r:systemd_unit_file_t:s0 tclass=service#012 exe="/usr/lib/systemd/systemd" sauid=0 hostname=? addr=? terminal=?'

Nov 14 03:33:33 backup4 logrotate: ALERT exited abnormally with [1]

Como o sinal HUP não é enviado para o serviço, ele não sabe que os arquivos de log foram girados e continua gravando indefinidamente em um log antigo (girado).

Eu tentei solucionar isso usando o utilitário sealert para fornecer uma explicação de todos os erros em /var/log/audit/audit.log. No entanto, parece ignorar esse erro, mesmo que a entrada de log apareça em audit.log.

Eu também tentei executar o comando "systemctl kill" interativamente como root. Completa sem nenhum erro. O mesmo vale para uma execução manual do logrotate:

logrotate -f /etc/logrotate.d/urbackup-server

Esse comando também é executado sem problemas. A única vez que vejo a negação do SELinux é quando o logrotate é acionado pelo processo diário do Anacron.

O comando "systemctl kill" é explicitamente proibido pelo SELinux? Em caso afirmativo, por que posso executá-lo de forma interativa, mas não quando iniciado pelo cron? Existe alguma maneira que eu possa adicionar uma exceção para este caso, ou outra maneira que eu posso enviar o sinal HUP para o processo para que ele irá gravar no arquivo de log correto?

Muito obrigado por qualquer ajuda.

    
por A.J. 17.11.2017 / 11:25

1 resposta

1

Especificamente, o contexto logrotate_t não é permitido systemd_unit_file_t . Sua execução interativa está em um contexto diferente.

Curioso por ter passado pelo teste do arquivo pid. Se esse arquivo pid não existir enquanto o serviço estiver em execução, tente adicionar PIDFile=/var/run/urbackupsrv.pid à unidade urbackup-server.service .

Existem maneiras de definir a transição de domínio no SELinux, mas dê uma chance ao arquivo pid.

    
por 19.11.2017 / 19:51