permissão OpenDKIM negada

3

Instalei o opendkim no CentOS 6 e defina o TemporaryDirectory para /var/tmp no arquivo de configuração opendkim.conf . Depois de reiniciar o serviço e tentar enviar um email, recebo um erro no log de postagem que lê

opendkim[27392]: F2C3E20509: dkim_eoh(): resource unavailable: can't create temporary file at /var/tmp/dkim.F2C3E20509.FiOvYB: Permission denied

Então, olhei para as permissões da pasta tmp ( ls -l /var/ ) e elas são

drwxrwxrwt.  2 root root 4096 Nov 23 20:42 tmp

Pelo que entendi, todo mundo deveria poder escrever na pasta /var/tmp . Por que uma mensagem de erro Permission denied é retornada?

    
por seyfe 23.11.2015 / 22:45

3 respostas

0

Da minha experiência, isso é causado por uma falta da política do SELinux. Você pode obter o erro detalhando as permissões ausentes do log de auditoria e usá-lo para gerar um pacote do módulo SELinux com:

grep opendkim /var/log/audit/audit.log | audit2allow -M opendkim

A opção -M designa o nome do pacote do módulo, você pode nomear outra coisa, se quiser. Esse comando gerará dois arquivos: opendkim.pp, que é o pacote de módulos selinux atual, e opendkim.te, um arquivo de texto mostrando quais políticas o pacote de módulos contém.

Se a política estiver boa, importe o pacote do módulo com:

semodule -i opendkim.pp
    
por 22.12.2015 / 16:43
0

A questão já tinha uma solução aqui

Não há necessidade de permitir que o OpenDKIM grave em outros diretórios. Basta escrever no diretório temporário padrão, / var / run / opendkim, que já deve existir e ter o contexto SELinux correto para permitir que ele seja gravado.

(E aqui é uma solução para evitar este problema no modo SELinux.)

Tópico muito antigo que desafia a resolução. E há alguns dias atrás, eu encontrei este segmento desde ive tenho um mesmo problema e resolvido por usar a solução de Dedgar.

E você pode tentar abaixo e se realmente quiser definir Temporary para /var/tmp

log se parece com:

opendkim[46233]: E9A563F480: dkim_eoh(): resource unavailable: can't create temporary file at /var/tmp/dkim.E9A563F480.IjgWhi: Permission denied

E como Chloe disse. é um erro do SELinux porque everbody should be able to write into the /var/tmp folder

Verifique o arquivo de log %código% Tem:

...
type=SYSCALL msg=audit(1484968513.231:1415886): arch=c000003e syscall=2 success=no exit=-13 a0=7fc21e6e4910 a1=c2 a2=180 a3=0 items=0 ppid=46231 pid=14906 auid=500 uid=497 gid=497 euid=497 suid=497 fsuid=497 egid=497 sgid=497 fsgid=497 tty=(none) ses=3274 comm="opendkim" exe=2F7573722F7362696E2F6F70656E646B696D202864656C6574656429 subj=unconfined_u:system_r:dkim_milter_t:s0 key=(null)
type=AVC msg=audit(1484968573.318:1415887): avc:  denied  { write } for  pid=14916 comm="opendkim" name="tmp" dev=dm-0 ino=129564 scontext=unconfined_u:system_r:dkim_milter_t:s0 tcontext=system_u:object_r:tmp_t:s0 tclass=dir
...

Como Dedgar disse, parece que o opendkim está faltando uma política que pode criar arquivos do arquivo # grep opendkim /var/log/audit/audit.log . Então, primeiro, verifique o tipo dir

# ll -Zd /var/tmp/
drwxrwxrwt. root root system_u:object_r:tmp_t:s0       /var/tmp/

verifique se tmp tem permissão para acessar opendkim

# ll -Z /usr/sbin/opendkim 
-rwxr-xr-x. root root system_u:object_r:dkim_milter_exec_t:s0 /usr/sbin/opendkim
# sesearch -A -s dkim_milter_t| grep tmp_t

A saída pode se parecer com:

   allow daemon puppet_tmp_t: arquivo {ioctl ler gravação getattr lock append};    permitir dkim_milter_t tmp_t: arquivo {gravar criar desvincular aberto};    allow dkim_milter_t tmp_t: dir {escreve add_name remove_name};    permitir domínio tmp_t: dir {getattr search open};    ...

Aviso da linha

allow dkim_milter_t tmp_t : file { write create unlink open } ; 
allow dkim_milter_t tmp_t : dir { write add_name remove_name } ; 

Ele quase diz ao uso /var/tmp tem permissão para acessar diretórios com o tipo dkim_milter_t como tmp_t ,

Mas, na maioria dos casos, não temos essa saída de linha ou esse conf não funciona em nenhum outro caso ...

Portanto, precisamos adicionar uma política que conceda permissão à política /var/tmp , que dkim_milter_t use para acessar o arquivo ou dirs que tenham opendkim type . E a maneira mais simples é usar audit2allow como Dedgar colocou:

grep opendkim /var/log/audit/audit.log | audit2allow -M opendkim
semodule -i opendkim.pp

gerará uma política do SELinux para fazer as coisas antes. Mas certamente não sabe que não funcionará no caso de Chloe. Coloque o meu opendkim.te:

module opendkim 1.0;

require {
        type tmp_t;
        type dkim_milter_t;
        class dir { write remove_name add_name };
        class file { write create unlink open };
}
allow dkim_milter_t tmp_t:dir { write remove_name add_name };
allow dkim_milter_t tmp_t:file { write create unlink open };

E se você precisar de um arquivo regenerado (opendkim.pp para isso) manualmente.

checkmodule -M -m -o opendkim.mod opendkim.te
semodule_package -o opendkim.pp -m opendkim.mod

E tmp_t para o que você precisa.

    
por 21.01.2017 / 08:43
0
  • A resposta atualizada *

Vá para /etc/opendkim.conf e altere esta linha:

TemporaryDirectory /var/tmp

para:

TemporaryDirectory /var/run/opendkim

E reinicie seus serviços de e-mail (por exemplo

# service opendkim restart
# chkconfig opendkim on
# service postfix restart
    
por 19.01.2016 / 22:29