A ação Acpid funciona quando executada como root, mas não quando iniciada pelo systemd

4

No Fedora 23, eu queria adicionar uma ação personalizada quando a tampa do laptop é aberta. Eu instalei acpid e criei três arquivos:

/ etc / acpi / events / lidconf

event=button/lid
action=/etc/acpi/actions/lid.sh "%e"

/etc/acpi/actions/lid.sh

#!/bin/bash
/home/user/Utility/lid.sh "$1"

/home/user/Utility/lid.sh

#!/bin/bash
DISPLAY=:0.0 su user -c "echo $1 >> /home/user/lid.txt"

Funciona perfeitamente quando executo # /usr/sbin/acpid -f , mas não quando eu faço # systemctl start acpid .

Eu notei que o resultado do comando ps é um pouco diferente.

Como root:

root      3796  0.0  0.0   4344  1704 ?        Ss   22:24   0:00 /usr/sbin/acpid -f

Usando o systemd:

root      3918  0.0  0.0   4344  1780 pts/0    S+   22:25   0:00 /usr/sbin/acpid -f

Por que não funciona quando iniciado pelo systemd?

Editar: Eu habilitei o log para acpid e é isso que eu recebo:

received input layer event "button/lid LID open"
rule from /etc/acpi/events/lidconf matched
executing action "/etc/acpi/actions/lid.sh "button/lid LID open""
action exited with status 126
1 total rule matched
completed input layer event "button/lid LID open"

Editar2: ps aux -Z

Systemd:

system_u:system_r:apmd_t:s0     root      5177  0.1  0.0   4348  1756 ?        Ss   22:52   0:00 /usr/sbin/acpid -f -l -d

Ran como root:

unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 root 5341 0.0  0.0 4344 1808 pts/0 S+ 22:56   0:00 /usr/sbin/acpid -f -l -d
    
por Fenikso 09.02.2016 / 22:29

1 resposta

2

ok. Problema SELinux. Ao criar algumas coisas novas relacionadas ao serviço existente, você precisa ter certeza de que o serviço terá acesso apropriado aos seus arquivos. O log do seu arquivo propõe que ele não tem (a menos que seja executado como unconfined_t ).

executing action "/etc/acpi/actions/lid.sh "button/lid LID open""
action exited with status 126

A execução do comando acima falha (status de saída 126), o que significa que o tipo de fonte apmd_t não tem capacidade de executar seu arquivo (que possui rótulos desconhecidos para mim). Navegando pela política, como:

$ sesearch -A -s apmd_t -p execute /etc/selinux/targeted/policy/policy.*

podemos notar a linha

allow apmd_t apmd_exec_t : file { ioctl read getattr lock execute execute_no_trans entrypoint open } 

permitindo executar apmd_exec_t types. Alterar os rótulos de seu executável para esse tipo deve avançar:

# chcon -t apmd_exec_t /etc/acpi/actions/lid.sh

Mais adiante, você provavelmente terá problemas ao escrever no arquivo /home/user/lid.txt , que provavelmente está rotulado como home_t ou o que for. Seu serviço pode gravar por exemplo apmd_tmp_t :

$ sesearch -A -s apmd_t -p write /etc/selinux/targeted/policy/policy.*
allow apmd_t apmd_tmp_t : file { ioctl read write create getattr setattr lock append unlink link rename open } ; 

Portanto, se você alterar o contexto do seu arquivo de destino para apmd_tmp_t , isso deve funcionar para você:

# chcon -t apmd_tmp_t /home/user/lid.txt

Esta solução não é permanente. Mais correto seria definir sua própria política cobrindo esses arquivos e contextos, ou mover os arquivos para locais onde o contexto é por padrão. Você deve conseguir alguma ajuda da auditoria ( ausearch -m AVC e audit2allow utility). Se algo não funcionar, me avise.

    
por 10.02.2016 / 10:30