Da última vez, perguntei sobre o risco destes (em /etc/sudoers
):
user_name ALL=(ALL) /usr/bin/vim /etc/httpd/confs/httpd.conf
%group_name ALL=(ALL) /usr/bin/vim /etc/httpd/confs/httpd.conf
Enquanto eu estava pensando sobre esse problema, descobri/etc/sudoers.d
diretório. Os arquivos no diretório devem ter funções semelhantes /etc/sudoers
(o que significa que os scripts acima ainda são problemáticos mesmo em /etc/sudoers.d
) e, no entanto, um artigo disse que não deveríamos usar o diretório porque não podemos usá-lo visudo
para editar arquivos nele. Ou seja, perdemos o direito de uso sudo
se errarmos no diretório.
Se isso for verdade, por que temos/etc/sudoers.d
? Ou temos uma boa maneira de editar arquivos em/etc/sudoers.d
?
Responder1
As alterações feitas nos arquivos /etc/sudoers.d
permanecerão em vigor se você atualizar o sistema. Isso pode evitar bloqueios de usuários quando o sistema for atualizado. O Ubuntu tende a gostar desse comportamento. Outras distribuições também estão usando esse layout.
Pela minha experiência, as regras para arquivos neste diretório são mais flexíveis do que para arquivos /etc/sudoers
. Isso incluiu:
- Erros no arquivo não causaram
sudo
falha. No entanto, o arquivo foi ignorado. - As regras de permissão parecem menos rígidas. Ele permite que o grupo aplicável ou outro leia o arquivo. Não acredito que isso fosse possível com
/etc/sudoers
. As permissões de gravação devem ser restritas pararoot
manter a segurança. A versão atual do Sudo no Ubuntu permite permissões de leitura para grupos ou outros. (Esse recurso permite que o acesso sudo seja auditado sem a necessidade de acesso root.)
O visudo
comando é padronizado apenas como /etc/sudoers
. Ele editará e verificará qualquer arquivo especificado com a -f
opção. Eu uso esse recurso para editar arquivos que serão instalados automaticamente como /etc/sudoers
ou em arquivos /etc/sudoders.d
. No entanto, as definições de outros arquivos podem não ser encontradas. É melhor tornar o arquivo independente.
A capacidade de ter arquivos independentes torna simples para um aplicativo ativar sudo
o recurso de instalação e removê-los quando for desinstalado. Ferramentas de configuração automatizadas também podem usar esse recurso.
Usei esse recurso para isolar as alterações necessárias para conceder acesso a grupos de usuários específicos em sistemas específicos.
Responder2
Sim, você pode usar visudo
para editar esses arquivos. Tudo o que você precisa fazer é especificar o nome do arquivo que deseja editar com a -f
opção. Por exemplo:
visudo -f /etc/sudoers.d/somefilename
Ou, se necessário:
sudo visudo -f /etc/sudoers.d/somefilename
Documentação
De man visudo
:
-f sudoers
Especifique e alterne o local do arquivo sudoers. Com esta opção, o visudo irá editar (ou verificar) o arquivo sudoers de sua escolha, em vez do padrão, /etc/sudoers. O arquivo de bloqueio usado é o arquivo sudoers especificado com ".tmp" anexado a ele. Apenas no modo somente verificação, o argumento para -f pode ser "-", indicando que sudoers serão lidos a partir da entrada padrão.
Resumindo:
Sintaxe:Os dois
visudo
evisudo -f
execute a mesma verificação de sintaxe.Permissões/Propriedade: Como um recurso adicionadopara auxiliar a administração de grandes sistemas, os arquivos editados em
visudo -f
não são verificados quanto à propriedade ou permissões: isso permite a verificação de sintaxe de um arquivo offline ou como parte de um sistema de controle de revisão.
Por que usar/etc/sudoers.d/
Normalmente /etc/sudoers
está sob controle do gerenciador de pacotes da sua distribuição. Se você fez alterações nesse arquivo e o gerenciador de pacotes deseja atualizá-lo, você terá que inspecionar manualmente as alterações e aprovar como elas serão mescladas na nova versão. Ao colocar suas alterações locais em um arquivo no /etc/sudoers.d/
diretório, você evita essa etapa manual e as atualizações podem prosseguir automaticamente.
Quando sudo
ignora um arquivo em /etc/sudoers
?
Se o seu /etc/sudoers
arquivo contém a linha:
#includedir /etc/sudoers.d
então sudo
lerá os arquivos no diretório /etc/sudoers.d
.
As exceções são:
- Arquivos cujos nomes terminam em
~
- Arquivos cujos nomes contêm um
.
caractere
Isso é feito (a) para conveniência dos gerenciadores de pacotes e também (b) para que os arquivos de backup dos editores sejam ignorados.
Importante: Observe que a exceção 2 acima é bastante geral e significa que nomes de arquivos aparentemente razoáveis, como mysudo.conf
ou, mysudo.txt
serão ignorados porque .
estão no nome.
Responder3
por que temos /etc/sudoers.d?
Porque é mais fácil para ferramentas automatizadas (como Chef ou Puppet) colocar arquivos individuais neste diretório, em vez de fazer alterações em /etc/sudoers
, o que pode ser frágil.
Os arquivos /etc/sudoers.d
são (na verdade) concatenados. Você verá várias outras instâncias desse padrão em /etc
, como /etc/cron.d
e /etc/logrotate.d
.
Responder4
Apenas um pequeno complemento para qualquer resposta geral... nenhuma das outras respostas resolveu meu problema, que é a ordem que importa.
Se suas linhas funcionam em sudoers, mas não em sudoers.d, tente mover o #include ou alterar a ordem de seus arquivos sudoers.d (prefixando um número). Parece que o mais específico deve estar primeiro no arquivo.
Eu tive algo como:
somebody ALL=(ALL): somecommand
somebody ALL=(someoneelse) NOPASSWD: somecommand
E o 2º não surtiu efeito porque o primeiro já deu match. NOPASSWD não é uma condição, mas uma forma de modificar a ação.
E não era óbvio porque não estava em um único arquivo, devido ao diretório sudoers.d.