Permissões SELinux para LogRotate e Apache

4

Com a estrutura de diretórios:

/www/live/website1/app/
/www/live/website1/files/
/www/live/website1/logs/

Onde o Apache precisa de pelo menos o seguinte acesso:

app: read-only access, but read-write is fine (files already chmod 0644)
files: read-write access
logs: read-write access

Onde as duas regras a seguir foram configuradas por meio de:

/usr/sbin/semanage fcontext -a -t httpd_sys_content_t "/www/live/.*/.*";
/usr/sbin/semanage fcontext -a -t httpd_log_t "/www/live/.*/logs(/.*)?";

/sbin/restorecon -vr "/www";

Quais são aplicados e parecem estar funcionando bem ... no entanto, o LogRotate não está satisfeito.

A configuração do LogRotate está atualmente:

/www/live/*/logs/*access_log /www/live/*/logs/*access_log_443 {
    weekly
    rotate 52
    missingok
    notifempty
    nodateext
    sharedscripts
    postrotate
        /usr/sbin/apachectl graceful > /dev/null
    endscript
}

No entanto, isso parece estar bloqueado pelo SELinux, com entradas aparecendo no audit.log quando ele está tentando acertar o inode relacionado à pasta /www/live (262146 no exemplo abaixo) ... como se estivesse presumivelmente tentando lista as pastas em / www / live /.

type=AVC msg=audit(1396579563.324:316060): avc:  denied  { read } for  pid=12336 comm="logrotate" name="live" dev=dm-0 ino=262146 scontext=system_u:system_r:logrotate_t:s0-s0:c0.c1023 tcontext=unconfined_u:object_r:default_t:s0 tclass=dir
type=SYSCALL msg=audit(1396579563.324:316060): arch=c000003e syscall=2 success=no exit=-13 a0=7fff2cef68b0 a1=90800 a2=7fff2cef6b5a a3=8 items=0 ppid=12334 pid=12336 auid=0 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=35531 comm="logrotate" exe="/usr/sbin/logrotate" subj=system_u:system_r:logrotate_t:s0-s0:c0.c1023 key=(null)

Então, qual contexto devo definir para esse diretório pai?

/usr/sbin/semanage fcontext -a -t default_t "/www(/.*)";

Onde eu sei default_t não funciona, nem var_t ... e para referência eu realmente não me importo com o que pode ver essas pastas, como elas já são chmod 0755.

E para pontos de bônus ... existe uma maneira fácil de ver a lista completa de permissões de um programa? Eu sei que o LogRotate deve ser capaz de acessar httpd_log_t e var_log_t .

O mais irritante é que rodar o LogRotate manualmente parece ignorar essas restrições, já que eu suponho que ele esteja herdando as permissões dos usuários (diferente de quando é executado via cron).

    
por Craig Francis 04.04.2014 / 13:11

1 resposta

8

Não confirmado se esta é a resposta certa ainda ...

/usr/sbin/semanage fcontext -a -t sysfs_t "/www(/.*)";
/usr/sbin/semanage fcontext -a -t httpd_sys_content_t "/www/live/.*/.*";
/usr/sbin/semanage fcontext -a -t httpd_log_t "/www/live/.*/logs(/.*)?";
/sbin/restorecon -vr "/www";

Lá, o sysfs_t é o bit importante.

Eu posso encontrar os domínios que o LogRotate pode usar:

sesearch -s logrotate_t -SA

Fazendo uma pesquisa rápida para a permissão "ler" (não apenas "abrir") para "dir":

sesearch -s logrotate_t -SA -c dir -p read | sort

Em seguida, digitalizando a lista, eu diria que sysfs_t é o mais adequado.

Um problema que encontrei é que, se eu executar /usr/sbin/logrotate , herda o contexto da conta root:

id -Z
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

Por isso, ele obtém automaticamente acesso "ilimitado" (ou seja, acesso total) ... então, para testar, descobri que usar o seguinte, embora não seja perfeito, funcionou:

sandbox /usr/sbin/logrotate -d /etc/logrotate.conf

Eu também descobri newrole e runcon , ambos precisam ser instalados separadamente em um sistema RedHat / CentOS via:

yum install policycoreutils-newrole

newrole -r system_r -t logrotate_t
runcon -r system_r -t logrotate_t /usr/sbin/logrotate -d /etc/logrotate.conf

Mas ambos estavam me dando permissão de erros negados (provavelmente devido à transição não ser permitida):

link

Outra coisa que achei útil:

yum install setools-console

seinfo -usystem_u -x
seinfo -rsystem_r -x
seinfo -tlogrotate_t -x

seinfo -tsysfs_t -x

E para verificar a lista de regras que criei no sistema:

cat /etc/selinux/targeted/contexts/files/file_contexts.local

Para mais informações sobre o SELinux, achei estes 17 tutoriais muito úteis:

link

Pessoalmente, eu encontrei todos esses programas muito inconsistentes, e posso entender porque a maioria das pessoas simplesmente desativam o SELinux por padrão ...

  • Você não pode ter um espaço após as opções seinfo -u / r / t
  • Você precisa instalar pacotes extras para obter seinfo e newrole
  • Você não pode executar facilmente um programa manualmente em um determinado contexto (para fins de teste).
  • O arquivo audit.log usa registros de data e hora, portanto, tente ausearch -m avc --start today .
  • Nenhuma convenção de nomenclatura com os muitos programas usados (por exemplo, matchpathcon ).
  • Eu não diria que a saída (ou operação) de audit2allow era óbvia.

O que é uma pena, já que parece ser um sistema muito poderoso em geral.

    
por 07.04.2014 / 17:56