SELinux “training” (registros de modo permissivo)

3

Tudo bem, eu tenho visto vários artigos e vídeos. Todos dizem a mesma coisa básica: comece com a política padrão, seja permissivo para ver o que precisa ser corrigido. Em seguida, modifique suas políticas para corrigir possíveis problemas. Em seguida, reinicie a aplicação estrita.

Nessas referências, eles sugerem que eu execute ausearch para obter uma versão mais simplificada do audit.log. Então eu tentei um desses relatórios:

type=PROCTITLE msg=audit(03/27/2015 02:58:34.764:439) : proctitle=/bin/sh 
type=SYSCALL msg=audit(03/27/2015 02:58:34.764:439) : arch=x86_64 syscall=getxattr success=no exit=-61(No data available) a0=0x1fef030 a1=0x7fc0dbf2ef9f a2=0x7fff6aaa1da0 a3=0x84 items=0 ppid=1 pid=3861 auid=unset uid=root gid=root euid=root suid=root fsuid=root egid=root sgid=root fsgid=root tty=(none) ses=unset comm=systemd-logind exe=/lib/systemd/systemd-logind subj=system_u:system_r:system_dbusd_t:s0-s0:c0.c1023 key=(null) 
type=AVC msg=audit(03/27/2015 02:58:34.764:439) : avc:  denied  { getattr } for  pid=3861 comm=systemd-logind name=kvm dev="devtmpfs" ino=11755 scontext=system_u:system_r:system_dbusd_t:s0-s0:c0.c1023 tcontext=system_u:object_r:kvm_device_t:s0 tclass=chr_file permissive=1 

É difícil descobrir o que a mensagem está dizendo, especialmente quando me deparo com centenas delas.

Eu vi alguns artigos em que ele fala sobre os resultados de ausearch to audit2allow . Este parece ser o equivalente cli de empurrar aceitar toda vez que uma caixa de confirmação aparecer. Também supõe que a mensagem foi causada por um erro e não por algum hacker tentando invadir.

Então, alguém pode sugerir uma maneira racional de analisar a "saída" do modo permissivo do SELinux?

    
por Mouse.The.Lucky.Dog 27.03.2015 / 16:04

1 resposta

1

Muitas vezes, você será presenteado com informações e espera-se que escolha os bits que são relevantes para seus propósitos. Por exemplo, quando você usa strace de um programa, você terá uma carga grande de saída e estará focando apenas nas partes que parecem relacionadas a porque você está olhando para strace output.

Os registros de auditoria seguem um raciocínio similar. Vamos ver o seu:

type=PROCTITLE msg=audit(03/27/2015 02:58:34.764:439) : proctitle=/bin/sh

Não é demais explodir. Ele fornece um timestamp e o valor do proctitle do executável, que geralmente é o nome do processo. Não tenho certeza porque logind tem isso como um proctitle, no entanto.

type=AVC msg=audit(03/27/2015 02:58:34.764:439) : avc: denied { getattr } for pid=3861 comm=systemd-logind name=kvm dev="devtmpfs" ino=11755 scontext=system_u:system_r:system_dbusd_t:s0-s0:c0.c1023 tcontext=system_u:object_r:kvm_device_t:s0 tclass=chr_file permissive=1

Esta é a mensagem de erro do SELinux e a coisa com a qual você deve se preocupar mais. O type=AVC é o que dá isso. AVC significa access vector cache que é um componente do SELinux .

As partes importantes a serem observadas são o que está na sub-rotina denied (nesse caso, getattr ), que informa o que o programa estava fazendo especificamente para ser negado. Depois disso, analisamos o contexto de origem (também conhecido como scontext ), que lhe dará uma ideia do que a categoria geral do componente ofensivo estava executando. Nesse caso, o contexto completo é system_u:system_r:system_dbusd_t que encurtou para a única parte que é substantivamente significativa (99% do tempo) apenas system_dbusd_t . Fazendo a mesma coisa no contexto de destino, obtemos kvm_device_t . Os campos comm e pid são importantes e óbvios. A exceção aconteceu com systemd-logind que estava sendo executado com um PID de 3861.

Portanto, juntando , temos systemd-logind sendo executado como system_dbusd_t e tentando fazer algum tipo de getattr em um arquivo com um contexto de kvm_device_t .

Saber o que isso significa que você deve fazer é com o administrador. Para a parte do SELinux, tudo o que se sabe é que tal coisa não é permitida por sua política, então ela lhe dá os detalhes para que você possa fazer sua própria ligação.

type=SYSCALL msg=audit(03/27/2015 02:58:34.764:439) : arch=x86_64 syscall=getxattr success=no exit=-61(No data available) a0=0x1fef030 a1=0x7fc0dbf2ef9f a2=0x7fff6aaa1da0 a3=0x84 items=0 ppid=1 pid=3861 auid=unset uid=root gid=root euid=root suid=root fsuid=root egid=root sgid=root fsgid=root tty=(none) ses=unset comm=systemd-logind exe=/lib/systemd/systemd-logind subj=system_u:system_r:system_dbusd_t:s0-s0:c0.c1023 key=(null)

Isso é um pouco fora de seqüência em termos de como você o apresentou, mas eu o coloco desde então, o que torna mais fácil entender como você deve lê-lo. O type=AVC é a parte importante, mas geralmente registra o syscall que falhou, para que você possa obter mais detalhes.

Por exemplo, dado o nome do programa, sabemos o que é systemd-logind , mas se ele for mais ambíguo, o exe=/lib/systemd/systemd-logind poderá identificar qual programa causou o erro. Coisas como auid (o loginuid do processo) ou uid também podem ser informações úteis se você não tivesse certeza do motivo pelo qual o executável em questão estava sendo expulso.

Espero que ajude. Se você tiver alguma dúvida, atualizarei minha resposta.

EDIT: Outra coisa no seu último ponto. Normalmente, você pode ver a política que o audit2allow gera e o tipo de alteração que está sendo feita. Na verdade, não aplica as alterações até você inserir o módulo de política. Então, você ainda pode gerá-lo e examiná-lo em um editor de texto para ver se é o tipo de coisa que você gostaria de permitir que acontecesse. Pode ser mais rápido do que rastrear os detalhes lendo audit.log diretamente.

    
por 27.03.2015 / 16:26

Tags