Solucionando problemas do SELinux
- O QUE É?
Um sistema com o SELinux no modo
enforcingpode causar negações de acesso que podem impedir que os aplicativos sejam executados corretamente. Você pode usaraudit2allowousetroubleshootpara analisar as mensagens de negação de uma forma amigável.- POR QUÊ?
Este artigo apresenta instruções sobre como resolver negações de acesso causadas pelo SELinux sem reduzir a segurança do seu sistema.
- DEDICAÇÃO
A leitura do artigo leva aproximadamente 30 minutos.
- META
Você poderá usar uma das ferramentas descritas a seguir para depurar negações do SELinux.
- REQUISITOS
Um sistema em execução com o SELinux habilitado.
1 O arquivo /var/log/audit/audit.log #
Por padrão, se o SELinux causar o não funcionamento de qualquer componente, uma mensagem de registro a esse respeito será enviada para o arquivo /var/log/audit/audit.log.
/var/log/audit/audit.log vazio
Se o /var/log/audit/audit.log estiver vazio, isso geralmente significa que o serviço auditd não está em execução. Nesse caso, faça o seguinte:
Inicie o serviço
auditd:>sudosystemctl start auditdHabilite o serviço nos destinos do seu sistema, usando:
>sudosystemctl enable auditd
O arquivo /var/log/audit/audit.log armazena mensagens de negações de acesso, eventos de serviço e assim por diante.
No Exemplo 1: “Exemplo de linhas do /etc/audit/audit.log”, você pode ver um exemplo parcial do conteúdo do /var/log/audit/audit.log.
/etc/audit/audit.log #type=DAEMON_START msg=audit(1348173810.874:6248): auditd start, ver=1.7.7 format=raw kernel=3.0.13-0.27-default auid=0 pid=4235 subj=system_u:system_r:auditd_t res=success
type=AVC msg=audit(1348173901.081:292): avc: denied { write } for pid=3426 comm="smartd" name="smartmontools" dev=sda6 ino=581743 scontext=system_u:system_r:fsdaemon_t tcontext=system_u:object_r:var_lib_t tclass=dir
type=AVC msg=audit(1348173901.081:293): avc: denied { remove_name } for pid=3426 comm="smartd" name="smartd.WDC_WD2500BEKT_75PVMT0-WD_WXC1A21E0454.ata.state~" dev=sda6 ino=582390 scontext=system_u:system_r:fsdaemon_t tcontext=system_u:object_r:var_lib_t tclass=dir
type=AVC msg=audit(1348173901.081:294): avc: denied { unlink } for pid=3426 comm="smartd" name="smartd.WDC_WD2500BEKT_75PVMT0-WD_WXC1A21E0454.ata.state~" dev=sda6 ino=582390 scontext=system_u:system_r:fsdaemon_t tcontext=system_u:object_r:var_lib_t tclass=file
type=AVC msg=audit(1348173901.081:295): avc: denied { rename } for pid=3426 comm="smartd" name="smartd.WDC_WD2500BEKT_75PVMT0-WD_WXC1A21E0454.ata.state" dev=sda6 ino=582373 scontext=system_u:system_r:fsdaemon_t tcontext=system_u:object_r:var_lib_t tclass=file
type=AVC msg=audit(1348173901.081:296): avc: denied { add_name } for pid=3426 comm="smartd" name="smartd.WDC_WD2500BEKT_75PVMT0-WD_WXC1A21E0454.ata.state~" scontext=system_u:system_r:fsdaemon_t tcontext=system_u:object_r:var_lib_t tclass=dir
type=AVC msg=audit(1348173901.081:297): avc: denied { create } for pid=3426 comm="smartd" name="smartd.WDC_WD2500BEKT_75PVMT0-WD_WXC1A21E0454.ata.state" scontext=system_u:system_r:fsdaemon_t tcontext=system_u:object_r:var_lib_t tclass=file
type=AVC msg=audit(1348173901.081:298): avc: denied { write open } for pid=3426 comm="smartd" name="smartd.WDC_WD2500BEKT_75PVMT0-WD_WXC1A21E0454.ata.state" dev=sda6 ino=582390 scontext=system_u:system_r:fsdaemon_t tcontext=system_u:object_r:var_lib_t tclass=file
type=AVC msg=audit(1348173901.081:299): avc: denied { getattr } for pid=3426 comm="smartd" path="/var/lib/smartmontools/smartd.WDC_WD2500BEKT_75PVMT0-WD_WXC1A21E0454.ata.state" dev=sda6 ino=582390 scontext=system_u:system_r:fsdaemon_t tcontext=system_u:object_r:var_lib_t tclass=file
type=AVC msg=audit(1348173901.309:300): avc: denied { append } for pid=1316Uma única mensagem tem a seguinte aparência:
type=AVC msg=audit(1348173901.081:299): avc: denied { getattr } for pid=3426 comm="smartd" path="/var/lib/smartmontools/smartd.WDC_WD2500BEKT_75PVMT0-WD_WXC1A21E0454.ata.state" dev=sda6 ino=582390 scontext=system_u:system_r:fsdaemon_t tcontext=system_u:object_r:var_lib_t tclass=fileCada linha da mensagem pode ser dividida em seções. Por exemplo, as seções na última linha são:
type=AVC:Todas as linhas do registro de auditoria relacionado ao SELinux começam com a identificação de tipo, por exemplo,
type=AVC. Observe que uma mensagem comtype=SYSCALLque vem depois de uma com um tipo diferente e que tem o mesmo valor demsgpode fornecer mais informações sobre o evento.msg=audit(1348173901.309:300):Trata-se da marcação de horário, que é gravada em horário de época, com o número de segundos decorridos desde 1º de janeiro de 1970. Você pode usar
date -dna parte até o ponto na notação de horário de época para descobrir quando o evento ocorreu:>date -d @1348173901Thu Sep 20 16:45:01 EDT 2012avc: denied { append }:A ação específica que foi negada. Nesse caso, o sistema negou a anexação de dados a um arquivo. Ao navegar pelo arquivo de registro de auditoria, você pode ver outras ações do sistema, como write open, getattr etc.
for pid=1316:o ID do processo do comando ou processo que iniciou a ação
comm="rsyslogd":o comando específico associado a esse PID
name="smartmontools":o nome do assunto da ação
dev=sda6 ino=582296:o dispositivo de blocos e o número de inode do arquivo envolvido
scontext=system_u:system_r:syslogd_t:o contexto de origem, que é o contexto do iniciador da ação
tclass=file:uma identificação de classe do assunto
2 Analisando /var/log/audit/audit.log com audit2allow #
Em vez de você mesmo interpretar os eventos em /var/log/audit/audit.log, é possível usar o comando audit2allow.
O comando ajuda a analisar as mensagens de registro criptografadas em /var/log/audit/audit.log. Uma sessão de solução de problemas do audit2allow sempre consiste em três comandos diferentes. Primeiro, você usa audit2allow -w
-a para apresentar as informações de auditoria de uma forma mais legível. Por padrão, o audit2allow -w -a funciona no arquivo audit.log. Para analisar uma mensagem específica no arquivo audit.log, copie-a para um arquivo temporário e analise o arquivo com:
>sudoaudit2allow -w -i FILENAME
>sudoaudit2allow -w -i testfiletype=AVC msg=audit(1348173901.309:300): avc: denied { append } for pid=1316 comm="rsyslogd" name="acpid" dev=sda6 ino=582296 scontext=system_u:system_r:syslogd_t tcontext=system_u:object_r:apmd_log_t tclass=file
- Isso foi causado por:
Uma regra de permissão de imposição de tipo (TE, Type Enforcement) ausente.
Para gerar um módulo carregável que permita esse acesso, execute:
>sudoaudit2allow
Para descobrir qual regra específica negou o acesso, você pode usar audit2allow -a para mostrar as regras de imposição de todos os eventos que foram registrados no arquivo audit.log ou audit2allow -i FILENAME para mostrar a regra para as mensagens que você armazenou em um arquivo específico:
>sudoaudit2allow -i testfile#============= syslogd_t ============== allow syslogd_t apmd_log_t:file append;
Para criar um módulo do SELinux chamado mymodule que você pode carregar para permitir o acesso que foi negado anteriormente, execute:
>sudoaudit2allow -a -R -M mymodule
Para fazer isso para todos os eventos que foram registrados no arquivo audit.log, use os argumentos de comando -a -M. Para fazer isso apenas para as mensagens específicas que estão em um determinado arquivo, use -i -M como no exemplo abaixo:
>sudoaudit2allow -i testfile -M example******************** IMPORTANT *********************** To make this policy package active, execute: semodule -i example.pp
Conforme indicado pelo comando audit2allow, agora você pode executar esse módulo usando o comando semodule -i, seguido do nome do módulo que o comando audit2allow criou para você (no exemplo acima, example.pp).
3 Analisando mensagens do AVC com setroubleshoot #
Para analisar as mensagens de negação do AVC de uma forma amigável, você pode usar a ferramenta setroubleshoot.
3.1 Visão geral do setroubleshoot #
3.1.1 O que é o comando setroubleshoot? #
setroubleshoot é uma ferramenta que coleta eventos de auditoria do SELinux do kernel e os analisa. Se esse tipo de evento ocorrer, o setroubleshoot informa o administrador.
3.1.2 Componentes do setroubleshoot #
O processo de solução de problemas do SELinux envolve os componentes a seguir, todos instalados no SUSE Linux Micro por padrão.
O
setroubleshoot-serveroferece as seguintes ferramentas:setroubleshootd: o daemon principal que processa as solicitações recebidas e as definições de plug-in. O daemon é ativado sob demanda e não requer execução por meio do serviçosystemd. Ele pode ser gerenciado apenas por um usuário com privilégios e um usuáriosetroubleshootdedicado.um banco de dados de alertas no arquivo
/var/lib/setroubleshoot/setroubleshoot_database.xml.sealert: uma interface do usuário de linha de comando para analisar o/var/log/audit.log.sedispatch: um dispatcher de auditoria que verifica as mensagens do AVC do SELinux e as transforma em uma mensagem DBus, que depois é enviada ao daemon.
setroubleshoot-plugins: os plug-ins são usados para análise de mensagens do AVC e fornecem sugestões sobre como corrigir problemas.
3.1.3 Como funciona o setroubleshoot? #
O setroubleshoot inclui um daemon e plug-ins de análise. Quando um plug-in detecta um problema, ele é relatado ao daemon, que verifica se esse é um problema conhecido. Se não for, o novo problema será adicionado ao banco de dados junto com uma solução sugerida.
3.1.4 Benefícios do setroubleshoot #
O setroubleshoot oferece as seguintes funcionalidades para ajudar você a resolver problemas em seus sistemas protegidos pelo SELinux:
Enviar alertas ao administrador quando há uma negação do AVC.
Análise automática de negações do AVC.
Sugerir possíveis correções, como ajustar a configuração do sistema ou instalar atualizações, entre outras.
Procurar alertas anteriores.
3.2 Configurando setroubleshoot #
Mesmo que a configuração do setroubleshoot não exija ajuste, talvez você encontre casos de uso específicos em que seja necessário mudar os padrões. As seções a seguir apresentam os casos de uso comuns.
O arquivo de configuração para setroubleshoot é /etc/setroubleshoot. Normalmente, você não precisa modificar a configuração além de definir as notificações por e-mail. No entanto, se você precisar mudar a configuração, poderá editar o arquivo ou usar o comando setroubleshootd para configurar um item específico. A sintaxe do comando é a seguinte:
#setroubleshootd -c SECTION.OPTION=VALUE
Por exemplo, para definir a opção from_address, execute o comando da seguinte maneira:
#setroubleshootd -c email.from_address="example@mail.com"
3.2.1 Configurando o nível de registro de setroubleshoot #
O nível de registro padrão (o valor de sealert_log e setroubleshootd_log) é definido como warning. No entanto, você pode definir o valor como um dos seguintes:
- crítico
Somente erros graves que impedem o funcionamento do sistema são registrados.
- erro
Erros graves que podem influenciar o sistema são relatados.
- aviso
Uma indicação de que algo inesperado aconteceu ou que um problema poderá ocorrer em um futuro próximo. No entanto, o sistema funciona conforme o esperado.
- info
Uma confirmação de que o sistema está sendo executado corretamente é registrada.
- depurar
Informações detalhadas para fins de depuração são registradas.
3.2.2 Configurando o setroubleshoot para enviar notificações por e-mail #
O setroubleshoot poderá enviar notificações por e-mail se houver uma negação do AVC no sistema.
Para obter essas notificações, faça o seguinte:
Abra a pasta
/etc/setroubleshoot/setroubleshoot.conf.No arquivo, ajuste os seguintes itens de configuração de acordo com as suas necessidades:
- smtp_host
Se o servidor SMTP não for executado no host local, preencha o endereço do servidor.
- smtp_port
O padrão é 25. Normalmente, esse valor não requer nenhum ajuste.
- from_address
Adicione o endereço do remetente.
- assunto
Configure um assunto genérico de todas as mensagens.
- recipients_filepath
Especifique o local da lista de destinatários da notificação.
- use_sendmail
Defina como
truese você usa SendMail.
Crie o arquivo de destinatários de e-mail no caminho definido pela opção
recipients_filepath(por padrão,/var/lib/setroubleshoot/email_alerts-recipients).Cada endereço de e-mail deve ser separado por uma linha separada. Os comentários são indicados com o símbolo #.
3.2.3 Configurando o banco de dados de setroubleshoot #
Você pode mudar a quantidade de registros no banco de dados de setroubleshootd, sua localização ou o prefixo do nome de arquivo.
-
database_dir Especifique um caminho absoluto para o diretório em que o arquivo XML do banco de dados deve residir.
-
filename Configure um prefixo personalizado do nome do arquivo de banco de dados. O nome de arquivo terá esta aparência:
FILENAME_PREFIX_database.xml.-
max_alerts Define o número máximo de registros no banco de dados. Especifique
0para um número ilimitado de registros.-
max_alert_age Os alertas mais antigos do que o limite definido serão apagados do banco de dados. Você pode usar as unidades: ano, mês, dia, hora, minuto e segundo, mesmo no plural, e usar mais de uma unidade, por exemplo,
3 weeks 2 days, que é igual a 23 dias. Se ficar em branco, não haverá limite.
3.2.4 Configurar o setroubleshoot para coletar informações de servidores remotos #
Você pode configurar o setroubleshoot para reunir dados de auditoria do SELinux de servidores remotos. Para isso, configure a lista de endereços.
- [listen_for_client] address_list
No lado do servidor.
- [client_connect_to] address_list
No lado do cliente.
Os endereços na lista estão neste formato:
[{FAMILY}]ADDRESS[:PORT_NUMBER]
Em que {FAMILY} é {inet} ou {unix}%{path}s. Se a família de endereços for inet, você poderá especificar um número de porta; do contrário, o número da porta será definido como o padrão especificado pela opção de configuração default_port. O valor padrão {unix}%{path}s hostname significa escutar no soquete de domínio do Unix local.
3.3 Executando a análise de /var/log/audit/audit.log #
Para permitir que a ferramenta setroubleshoot analise o arquivo de registro de auditoria, execute o comando:
>sudosealert -a /var/log/audit/audit.log
Na saída de exemplo a seguir, há dois valores de porta atribuídos ao serviço SSHD:
100% done
found 1 alerts in /var/log/audit/audit.log
--------------------------------------------------------------------------------
SELinux is preventing sshd from name_bind access on the tcp_socket port 2222.
***** Plugin bind_ports (92.2 confidence) suggests ************************
If you want to allow sshd to bind to network port 2222
Then you need to modify the port type.
Do
# semanage port -a -t PORT_TYPE -p tcp 2222 1
where PORT_TYPE is one of the following: ssh_port_t, vnc_port_t, xserver_port_t.
***** Plugin catchall_boolean (7.83 confidence) suggests ******************
If you want to allow nis to enabled
Then you must tell SELinux about this by enabling the 'nis_enabled' boolean.
Do
setsebool -P nis_enabled 1
***** Plugin catchall (1.41 confidence) suggests **************************
If you believe that sshd should be allowed name_bind access on the port 2222 tcp_socket by default.
Then you should report this as a bug.
You can generate a local policy module to allow this access.
Do
allow this access for now by executing:
# ausearch -c 'sshd' --raw | audit2allow -M my-sshd
# semodule -X 300 -i my-sshd.pp
Additional Information:
...
First Seen 2024-02-07 14:26:27 UTC
Last Seen 2024-02-08 03:30:12 UTC
Local ID b5cbdd75-3f8d-425d-af75-f6cbf1540ffd
Raw Audit Messages
type=AVC msg=audit(1707363012.797:25): avc: denied { name_bind } for pid=841 comm="sshd" src=2222 scontext=system_u:system_r:sshd_t:s0-s0:c0.c1023 tcontext=system_u:object_r:unreserved_port_t:s0 tclass=tcp_socket permissive=0
Hash: sshd,sshd_t,unreserved_port_t,tcp_socket,name_bind
O plug-in |
4 Informações legais #
Copyright © 2006-2025 SUSE LLC e colaboradores. Todos os direitos reservados.
Permissão concedida para copiar, distribuir e/ou modificar este documento sob os termos da Licença GNU de Documentação Livre, Versão 1.2 ou (por sua opção) versão 1.3; com a Seção Invariante sendo estas informações de copyright e a licença. Uma cópia da versão 1.2 da licença está incluída na seção intitulada “GNU Free Documentation License” (Licença GNU de Documentação Livre).
Para ver as marcas registradas da SUSE, visite https://www.suse.com/company/legal/. Todas as marcas comerciais de terceiros pertencem a seus respectivos proprietários. Os símbolos de marca registrada (®, ™ etc.) indicam marcas registradas da SUSE e de suas afiliadas. Os asteriscos (*) indicam marcas registradas de terceiros.
Todas as informações deste manual foram compiladas com a maior atenção possível aos detalhes. Entretanto, isso não garante uma precisão absoluta. A SUSE LLC, suas afiliadas, os autores ou tradutores não serão responsáveis por possíveis erros nem pelas consequências resultantes de tais erros.