Fundo
Estou configurando um backup rsync via serviço SSH via SystemD. No fim das contas, isso não está funcionando devido ao SElinux local; exemplo mínimo reproduzível:
[Unit]
Description=Rsync backup service
[Service]
Type=oneshot
User=myuser
ExecStart=/usr/bin/ssh -vvv 192.168.1.10 "ls -lah"
Se eu, setenforce 0
antes de iniciar o serviço, tudo funciona como esperado e recebo a listagem de diretórios solicitada. Se o SElinux estiver impondo, recebo um erro do SystemD:
Starting backup.service - Rsync backup service...
backup.service: Main process exited, code=exited, status=203/EXEC
backup.service: Failed with result 'exit-code'.
Failed to start backup.service - Rsync backup service
Da mesma forma, se eu executar via SystemD com rsync, vejo o processo filho encerrado com -13:
rsync: [sender] Failed to exec /usr/bin/ssh: Permission denied (13)
Coisas que verifiquei
Todos os comandos funcionam conforme o esperado quando executados em um terminal, independentemente do estado imposto pelo SElinux.
Estou executando como meu usuário (
ExecStart=/usr/bin/whoami
):whoami[726624]: myuser
Posso acessar o binário ssh (
ExecStart=/usr/bin/which ssh
):which[727067]: /usr/bin/ssh
Posso acessar meu
.ssh
diretório de usuários (não publicarei registros disso por motivos óbvios).De acordo com esta publicação do SO, o SElinux pode bloquear portas não padrão. Eu permiti apenas a porta padrão (o rsync usa uma porta diferente?), mas isso deve funcionar, já que o caso de teste base não usa uma porta diferente:
# semanage port -l | grep ssh ssh_port_t tcp 22
Pergunta
O que faria o SElinux bloquear tentativas de SSH somente do SystemD, apesar de usar portas padrão e ter permissões totais para os arquivos envolvidos?
Edição 1
Verificando mensagens de negação explicitamente:
# ausearch -m AVC,USER_AVC,SELINUX_ERR,USER_SELINUX_ERR
...
type=AVC msg=audit(1743626691.891:17160): avc: denied { execute } for pid=728337 comm="(ssh)" name="ssh" dev="dm-0" ino=3077371 scontext=system_u:system_r:init_t:s0 tcontext=system_u:object_r:ssh_exec_t:s0 tclass=file permissive=0
# journalctl -t setroubleshoot
-- No entries --
# dmesg | grep -i -e type=1300 -e type=1400
#
Admito que meu SElinux não é dos melhores e não tenho muita certeza do que fazer com isso. Estou folheando a documentação, mas ela é... volumosa... às vezes.