Por que o sistema tem /etc/sudoers.d? Como devo editá-lo?

Por que o sistema tem /etc/sudoers.d? Como devo editá-lo?

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.ddiretó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 visudopara editar arquivos nele. Ou seja, perdemos o direito de uso sudose 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.dpermanecerã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 sudofalha. 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 para rootmanter 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 visudocomando é padronizado apenas como /etc/sudoers. Ele editará e verificará qualquer arquivo especificado com a -fopção. Eu uso esse recurso para editar arquivos que serão instalados automaticamente como /etc/sudoersou 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 sudoo 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 visudopara editar esses arquivos. Tudo o que você precisa fazer é especificar o nome do arquivo que deseja editar com a -fopçã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:

  1. Sintaxe:Os dois visudoevisudo -f execute a mesma verificação de sintaxe.

  2. Permissões/Propriedade: Como um recurso adicionadopara auxiliar a administração de grandes sistemas, os arquivos editados em visudo -fnã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/sudoersestá 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 sudoignora um arquivo em /etc/sudoers?

Se o seu /etc/sudoersarquivo contém a linha:

#includedir /etc/sudoers.d

então sudolerá os arquivos no diretório /etc/sudoers.d.

As exceções são:

  1. Arquivos cujos nomes terminam em~
  2. 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.confou, mysudo.txtserã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.dsão (na verdade) concatenados. Você verá várias outras instâncias desse padrão em /etc, como /etc/cron.de /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.

informação relacionada