7.2. Criação e aplicação de uma política SELinux para uma aplicação personalizada
Este procedimento de exemplo fornece passos para confinar um simples daemon pela SELinux. Substitua o daemon por seu aplicativo personalizado e modifique a regra de exemplo de acordo com as exigências daquele aplicativo e sua política de segurança.
Pré-requisitos
-
O pacote
policycoreutils-devel
e suas dependências estão instalados em seu sistema.
Procedimento
Para este procedimento de exemplo, prepare um daemon simples que abra o arquivo
/var/log/messages
para escrita:Crie um novo arquivo e abra-o em um editor de texto de sua escolha:
vi mydaemon.c
$ vi mydaemon.c
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Insira o seguinte código:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Compilar o arquivo:
gcc -o mydaemon mydaemon.c
$ gcc -o mydaemon mydaemon.c
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Crie um arquivo de unidade
systemd
para seu daemon:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Instale e inicie o daemon:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Verifique se o novo daemon não está confinado pela SELinux:
ps -efZ | grep mydaemon
$ ps -efZ | grep mydaemon system_u:system_r:unconfined_service_t:s0 root 4117 1 0 16:56 ? 00:00:00 /usr/local/bin/mydaemon
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Gerar uma política personalizada para o daemon:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Reconstruir a política do sistema com o novo módulo de política usando o script de configuração criado pelo comando anterior:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Observe que o script de configuração reescreve a parte correspondente do sistema de arquivos usando o comando
restorecon
:restorecon -v /usr/local/bin/mydaemon /usr/lib/systemd/systemd
restorecon -v /usr/local/bin/mydaemon /usr/lib/systemd/systemd
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Reinicie o daemon, e verifique se ele agora funciona confinado pela SELinux:
systemctl restart mydaemon ps -efZ | grep mydaemon
# systemctl restart mydaemon $ ps -efZ | grep mydaemon system_u:system_r:mydaemon_t:s0 root 8150 1 0 17:18 ? 00:00:00 /usr/local/bin/mydaemon
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Como o daemon agora está confinado pela SELinux, a SELinux também o impede de acessar
/var/log/messages
. Exibir a mensagem de negação correspondente:ausearch -m AVC -ts recent
# ausearch -m AVC -ts recent ... type=AVC msg=audit(1590247112.719:5935): avc: denied { open } for pid=8150 comm="mydaemon" path="/var/log/messages" dev="dm-0" ino=2430831 scontext=system_u:system_r:mydaemon_t:s0 tcontext=unconfined_u:object_r:var_log_t:s0 tclass=file permissive=1 ...
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Você pode obter informações adicionais também usando a ferramenta
sealert
:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Use a ferramenta
audit2allow
para sugerir mudanças:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Como as regras sugeridas por
audit2allow
podem ser incorretas para certos casos, use apenas uma parte de sua produção para encontrar a interface política correspondente:grep -r "logging_write_generic_logs" /usr/share/selinux/devel/include/ | grep .if
$ grep -r "logging_write_generic_logs" /usr/share/selinux/devel/include/ | grep .if /usr/share/selinux/devel/include/system/logging.if:interface(logging_write_generic_logs',
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Verifique a definição da interface:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Neste caso, você pode usar a interface sugerida. Adicione a regra correspondente ao seu tipo de arquivo de aplicação da lei:
echo "logging_write_generic_logs(mydaemon_t)" >> mydaemon.te
$ echo "logging_write_generic_logs(mydaemon_t)" >> mydaemon.te
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Alternativamente, você pode adicionar esta regra em vez de usar a interface:
echo "allow mydaemon_t var_log_t:file { open write getattr };" >> mydaemon.te
$ echo "allow mydaemon_t var_log_t:file { open write getattr };" >> mydaemon.te
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Reinstalar a política:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Etapas de verificação
Verifique se sua aplicação funciona confinada pela SELinux, por exemplo:
ps -efZ | grep mydaemon
$ ps -efZ | grep mydaemon system_u:system_r:mydaemon_t:s0 root 8150 1 0 17:18 ? 00:00:00 /usr/local/bin/mydaemon
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Verifique se sua aplicação personalizada não causa nenhuma negação da SELinux:
ausearch -m AVC -ts recent
# ausearch -m AVC -ts recent <no matches>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Recursos adicionais
-
Para mais informações, consulte as páginas de manual
sepolgen(8)
,ausearch(8)
,audit2allow(1)
,audit2why(1)
,sealert(8)
, erestorecon(8)
.