Os contextos de ACLs e SELinux são totalmente diferentes. Há um bom tutorial aqui para o CentOS
Para ver se o SELinux é realmente o que está bloqueando seu acesso, use sestatus
$ sestatus
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: enforcing
Mode from config file: enforcing
Policy MLS status: enabled
Policy deny_unknown status: allowed
Max kernel policy version: 28
Enforcing
no meu resultado diz que o SELinux está bloqueando ativamente os acessos fora de contexto.
Defina temporariamente o SELinux como permissivo usando # sudo setenforce Permissive
$ sudo setenforce Permissive
[sudo] password for trogdor:
$ sestatus
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: permissive
Mode from config file: enforcing
Policy MLS status: enabled
Policy deny_unknown status: allowed
Max kernel policy version: 28
O modo permissivo ainda alertará sobre violações de contexto do SELinux, mas não as bloqueará. Esta é uma boa maneira de verificar se o SELinux é realmente o problema. Se foi, e agora tudo funciona, defina o SELinux como Enforcing com sudo setenforce Enforcing
. (como um aparte muda para o SELinux com setenforce não sobreviverá a reinicialização).
Se o SELinux é o problema, você deve encontrar o contexto correto que os scripts devem ter, ou talvez seja uma correção simples com um booleano.
Se você está no seu diretório home, pode ser tão simples quanto configurar um booleano do SELinux. Para ver booleanos, há uma descrição do aqui do aqui , mas percebo que o exemplo user_exec_content abaixo não está listado lá, é mais conveniente ferramenta para descrições booleanas é semanage boolean -l
# getsebool -a | grep exec
...
user_exec_content --> off
...
#sudo semanage boolean -l
...
user_exec_content (off , off) Allow user to exec content
...
O primeiro fora mostra seu estado atual, que está atualmente desativado; o próximo mostra o padrão, o que significa que ele ainda estará desativado após a reinicialização ou a nova marcação do sistema de arquivos.
Nesse caso, use #setsebool -P user_exec_content on
O sinalizador -P torna permanente a mudança booleana nas reinicializações
Se é um problema de contexto, bons contextos são muito mais agradáveis de se trabalhar porque são mais intuitivos. Parece ser uma tentativa, erro e experiência sobre o que realmente faz com os boleanos do SELinux, por exemplo, nenhuma ideia do que user_exec_content realmente faz.
Use o sinalizador -Z com ls para visualizar o contexto de seus arquivos, por exemplo. ls -alZ.
$ ls -alZ
-rwxrwxr-x. trogdor trogdor unconfined_u:object_r:user_home_t:s0 backup.sh
Aqui user_home_t é o contexto do backup.sh. Digamos que você tenha outro diretório que tenha os contextos corretos para executar scripts, você pode espelhar esse contexto no diretório ./scripts usando:
# chcon -R --reference /onethatworks ./scripts
Para verificar novamente a alteração, use ls -alZ ./scripts
restorecon -Rv ./scripts
deve reclassificar o sistema de arquivos, re-rotulando todos os arquivos e diretórios recursivamente para os contextos atualizados. Neste caso, é apenas o diretório de scripts e seu conteúdo.
Se isso funcionar, as alterações feitas aqui não sobreviverão à reinicialização e você poderá usar o seguinte para tornar a alteração permanente.
# semanage fcontext -a -s system_u -t <context_that_worked> "./scripts(/.*)?
Outra opção para gerenciar o SELinux é instalar o policycoreutils-gui
para que você tenha acesso a uma configuração do selinux digitando # system-config-selinux
. Ao filtrar usando 'script', descobri que muitos scripts usam bin_t como seu contexto. Você também pode alterar o modo de execução com ele. Meus scripts no meu diretório home são executados com sucesso com user_home_t
, mas eu suspeito que você esteja em outro lugar se você está tendo esses problemas.