Eu tenho vários sistemas baseados em Debian que são copiados regularmente usando arquivos rsync
. Por vários motivos, tive que implantar um pequeno servidor CentOS 7 e quero adicioná-lo ao meu agendamento de backup. Não pode ser feito backup usando rsync sobre ssh; em vez disso, preciso usar o daemon rsync.
O CentOS tem o SELinux habilitado no modo de imposição, então isso me colocou em uma curva de aprendizado íngreme.
A rsyncd
seção de configuração (simplificada)
[root]
comment = Filesystem
path = /
exclude = /proc/*** /run/*** /sys/*** [...]
read only = yes
list = yes
uid = root
secrets file = [...]
ignore errors = no
ignore nonreadable = no
refuse options = delete
Eu acredito que o processo está rotulado corretamente:
ps -eZ | grep rsync
system_u:system_r:rsync_t:s0 26020 ? 00:00:00 rsync
Inicialmente, a tentativa de backup por meio do rsync
daemon falhou com todos os tipos de erros de permissão que atribuí aos rótulos do SELinux. Cavando mais, encontrei uma referência a uma política SELinux que permite que o rsync
daemon exporte todos os arquivos somente leitura:
setsebool -P rsync_export_all_ro 1
Isso resulta neste conjunto
getsebool -a | grep '^rsync'
rsync_anon_write --> off
rsync_client --> off
rsync_export_all_ro --> on
rsync_full_access --> off
Infelizmente, isso ainda não me dá acesso a todos os arquivos no sistema. Especificamente, tenho alguns arquivos /var/spool/postfix/private
que são ilegíveis:
rsync: readlink_stat("/var/spool/postfix/private/defer" (in root)) failed: Permission denied (13)
rsync: readlink_stat("/var/spool/postfix/private/trace" (in root)) failed: Permission denied (13)
rsync: readlink_stat("/var/spool/postfix/private/verify" (in root)) failed: Permission denied (13)
rsync: readlink_stat("/var/spool/postfix/private/proxymap" (in root)) failed: Permission denied (13)
...
Uma entrada de exemplo relacionada a /var/spool/postfix/private
from audit2why -a
segue. Observe que nenhuma das entradas faz referência a rsync_export_all_ro
:
type=AVC msg=audit(1565118203.332:21775): avc: denied { getattr } for pid=26597 comm="rsync" path="/var/spool/postfix/private/scache" dev="dm-0" ino=9148374 scontext=system_u:system_r:rsync_t:s0 tcontext=system_u:object_r:postfix_private_t:s0 tclass=sock_file permissive=0
Was caused by:
The boolean rsync_full_access was set incorrectly.
Description:
Allow rsync to full access
Allow access by executing:
# setsebool -P rsync_full_access 1
Não entendo por que há uma referência a rsync_full_access
(que não quero definir e não deveria ser acionada de qualquer maneira), mas nenhuma a rsync_export_all_ro
.
No interesse de obter um backup completo, como posso adicionar esta árvore de diretórios ao conjunto de arquivos que podem ser exportados pelo rsync
daemon? (E para que essa mudança seja persistente nas reinicializações.)
Você está certo em não querer desabilitar o SELinux para o
rsync_t
domínio. Infelizmente, embora a configurabilidade da implementação do SELinux para rsync seja bastante extensa, existem casos extremos em que definir orsync_export_all_ro
boolean ainda não permitirá que o daemon rsync acesse determinados arquivos. Há uma entrada do Bugzilla que se assemelha muito aos seus problemas. A sugestão dada é usarrsync_full_access
para superar o problema, embora prejudicando a segurança (ainda é melhor do quesemanage permissive -a rsync_t
embora).Criando módulo de política personalizado
Portanto, para responder à sua pergunta, se você deseja usar a opção mais segura
rsync_export_all_ro
e permitir que o daemon rsync acesse os arquivos/diretórios "edge case", você precisa criar seu próprio módulo de política.Isso é feito deixando o daemon rsync fazer seu trabalho no modo permissivo, capturando negações de AVC à medida que avança e, em seguida, convertendo as negações de AVC em uma política, assim:
Capturando negações de AVC que não são auditadas ("dontaudit")
Se, por algum motivo, os arquivos "edge case" ainda não estiverem acessíveis e o
ausearch
comando não produzir resultados, você pode estar atingindo uma regra "dontaudit".Para reconstruir a política SELinux ignorando todas as regras "dontaudit", execute
semodule -DB
. A-D
opção desabilita as regras de "não auditoria"; a-B
opção reconstrói a política.Em seguida, tente se você pode acionar eventos de log de auditoria. Em caso afirmativo, capture-os como mostrei acima, crie o módulo SELinux e reative as regras "dontaudit" executando:
semodule -B
.Para obter uma lista completa de regras "dontaudit", execute o
sesearch --dontaudit
comando. Restrinja as pesquisas usando a-s
opção de domínio e ogrep
comando. Por exemplo:sesearch --dontaudit -s rsync_t
.