Sudoers 1.8.12 - Parte III - Manual

Este artigo é parte de uma série de artigos sobre sudo. Nesta terceira parte tratamos de mais informações sobre a sintaxe, as regras e como escrever um sudoers eficiente. Continua na quarta parte.

[ Hits: 5.954 ]

Por: Perfil removido em 16/09/2015


SELinux_Spec



Em sistemas com suporte para SELinux, as entradas em sudoers podem opcionalmente ter uma função SELinux ou um tipo associado com o comando. Se uma função ou tipo for definido para o comando ele sobrescreverá qualquer valor padrão especificado em sudoers. Uma função ou tipo em linha de comando, entretanto, suplantará os valores em sudoers. Observe que SELinux modifica o comportamento padrão de sudo. Esteja atento.

Tag_Spec - um comando pode ter zero ou mais etiquetas (tags) associadas a ele. Existem dez possibilidades de etiquetas: NOPASSWD, PASSWD, NOEXEC, EXEC, SETENV, NOSETENV, LOG_INPUT, NOLOG_INPUT, LOG_OUTPUT e NOLOG_OUTPUT.

Uma vez que uma etiqueta é configurada em Cmnd, outras declarações Cmnd subsequentes em Cmnd_Spec_List, herdam a etiqueta, a menos que outra etiqueta sobrescreva (seja oposta) a primeira. Em outras palavas, por exemplo, PASSWD sobrescreve NOPASSWD e NOEXEC sobrepõe EXEC, assim por diante:

NOPASSWD e PASSWD - por padrão, sudo requer que um usuário se autentique antes de usar um comando. Esse comportamento pode ser modificado por uma declaração NOPASSWD (etiqueta). Como uma Runas_Spec, a etiqueta NOPASSWD define um padrão para os comandos em Cmnd_Spec_List. Inversamente, a etiqueta PASSWD pode ser utilizada para reverter coisas, por exemplo:

ray rushmore = NOPASSWD: /bin/kill, /bin/ls, /usr/bin/lprm

Essa declaração define que o usuário ray pode executar três comandos como root em na máquina rushmore sem autenticação. Uma modificação como a seguir limita os comandos com ou sem autenticação.

ray rushmore = NOPASSWD: /bin/kill, PASSWD /bin/ls, /usr/bin/lprm

Observe, entretanto, que a etiqueta PASSWD não tem nenhum efeito em usuários que são do grupo definido pela opção exempt_group.

Por padrão, se a etiqueta NOPASSWD é aplicada para qualquer uma das entradas para um usuário no host corrente, ele será capaz de executar "sudo -l" sem uma senha. Adicionalmente, um usuário pode executar "sudo -l" sem uma senha se a etiqueta NOPASSWD estiver presente para todas as entradas no host corrente. Esse comportamento pode ser modificado pelas opções verifypw e listpw.

NOEXEC e EXEC - se sudo foi compilado com suporte a noexec (e o sistema operacional dá suporte para essa opção) a etiqueta NOEXEC pode ser utilizada para previnir que executáveis ligados dinamicamente sejam executados rodando a si mesmos. No exemplo seguinte, o usuário aaron pode executar /usr/bin/more e /usr/bin/vi mas as "escapadas ao shell" são desabilitadas (isso é muito importante!).

aaron   shanty = NOEXEC: /usr/bin/more, /usr/bin/vi

SETENV e NOSETENV - essas etiquetas sobrescrevem o valor da opção setenv em uma base por comando. Observe que se SETENV foi configurada para um comando, o usuário pode desativar a opção env_reset na linha de comando com a opção "-E".

Adicionalmente, variáveis de ambiente definem como os comandos em linha estão sujeitos a restrições impostas por env_check, env_delete ou env_keep.

Somente usuários de alta confiança devem ser autorizados a utilizar variáveis desta forma. Se o comando a combinar for ALL, então SETENV é aplicada; esse comportamento padrão pode ser sobrescrito com a etiqueta NOSETENV.

LOG_INPUT e NOLOG_INPUT - essas etiquetas sobrescrevem o valor padrão em log_input em uma base por comando. Para mais informações, consulte a descrição de log_input em "Opções de SUDOERS".

LOG_OUTPUT e NOLOG_OUTPUT - essas etiquetas sobrescrevem o valor em log_output em uma base por comando. Para mais informações, consulte a descrição de log_output em "Opções de SUDOERS".

WILDCARDS - sudo permite o uso de wildcards no estilo do shell (a.k.a meta ou glob) sejam utilizados para definir nomes de hosts, nomes de caminhos e argumentos para comandos em linha no arquivo sudoers. Wildcards são combinados de acordo com as regras definidas nas funções glob(3) e fnmatch(3) definidas no padrão POSIX 1 (IEEE std 1003.1). Atenção: Wildcards não são expressões regulares.
  • (*) - combina zero ou mais caracteres, quaisquer caracteres.
  • (?) - combina um único caractere.
  • ([ . . . ]) - define uma faixa de caracteres.
  • ([! . . . ]) - define uma faixa de caracteres por negação. Qualquer caractere que não esteja nesta lista.
  • ("barra invertida + caractere") - qualquer caractere que precise ser analisado por seu valor real. Isso se chama escapar um caractere. Como dois-pontos possui significado em sudo ele SEMPRE deve ser escapado. Por exemplo:

/bin/ls [ [ /:alpha/:] ] *

É possível usar wildcards na porção referente ao caminho (path) para criar generalizações como /usr/bin/* que combina quaisquer diretórios ou arquivos em /usr/bin, mas não inclui, por exemplo, /usr/bin/X11/xterm que está um nível abaixo. O uso de wildcards em linha de comando requer muito cuidado. Em linha de comando esses argumentos são combinados como uma única cadeia de caracteres concatenados, um wildcard como (?) ou (*) pode incluir múltiplas palavras não desejadas. Um comando como:

%operator ALL = /bin/cat   /var/log/messages*

Permite um comando como:

sudo cat /var/log/messages.1

Ou ainda:

sudo cat /var/log/messages /etc/shadow

Com certeza essa não era sua intenção quando deu a permissão ao usuário.

Exceções para Wildcards

São exceções aplicadas:
  • (" ") - se uma cadeia de caracteres vazia (empty) é o único argumento para um comando em linha em uma entrada sudoers, isso significa que esse comando NÃO DEVE ser executado com qualquer argumento.
  • Sudoedit - argumentos em linha de comando para sudoedit devem sempre ser nomes de caminhos (path), deste modo uma barra não será combinada com um wildcard.

Incluindo arquivos em Sudoers

É possível fazer inclusões de arquivo em sudoers com as diretivas #include e #includedir.

Isso permite, por exemplo, manter um arquivo de regras de sudoers a parte, e adicionar regras em uma base local. Deste modo, o arquivo padrão mantido em /etc/sudoers e um com regras locais em /etc/sudoers.local.

Uma diretiva de inclusão faz com que a análise das regras seja passada para o arquivo incluído que será lido até seu fim. Após o fim, as demais regras são avaliadas. Arquivos incluídos deste modo (#include) podem incluir outros arquivos em um processo por herança de inclusões. É possível (porém não recomendado) incluir até 128 arquivos aninhados.

Se o caminho da inclusão não é totalmente qualificado (não começa com uma barra), ele deve ser localizado no mesmo diretório do arquivo sudoers que incluiu esse arquivo.

Um nome de arquivo para inclusão também pode conter um caractere especial como, por exemplo:

# A linha a seguir faz uma inclusão
#include /etc/sudoers.%h
# A linha a seguir é somente um comentário de linha.
# a diretiva %h é substituida pelo nome do host local.

A diretiva #includedir é usada para criar um tipo de diretório padrão (#includedir /etc/sudoers.d) para armazenar seus arquivos de locais de sudoers.

Arquivos neste diretório que terminem em (~) ou tenham um ponto no nome são evitados e NÃO são lidos. Os arquivos são lidos pela ordem léxica. Então, /etc/sudoersd/01_first é analisado primeiro. A ordem léxica não obedece a ordem numérica. Um arquivo como /etc/sudoers.d/1_first será lido após /etc/sudoers.d/10_second. Usar zeros à esquerda para nomear os arquivos resolve o problema.

Os arquivos em /etc/sudoers.d NÃO SÃO editados diretamente por visudo. É preciso usar a opção "-f" de visudo para editar cada um deles diretamente.

Outros caracteres especiais e palavras reservadas em sudo

O sinal de hash (#) é utilizado para indicar um comentário (a menos que esteja declarando uma diretiva como #include, por exemplo ou ocorra em um contexto de nomes de usuários, seguido por um ou mais dígitos que são tratados como um UID). Comentários são sempre de linha.

A palavra ALL é reservada como um alias built-in, ALL significa TODOS os valores possíveis.

Usar ALL é potencialmente perigoso em um contexto de comando, pois permite executar QUALQUER comando do sistema. Um operador lógico de negação pode ser utilizado para inverter o sentido de ALL para alguns itens, por exemplo, ALL, !root (todos, menos root). Um grande problema é que ALL é o valor padrão por omissão.

Por exemplo, uma declaração como !root equivale a ALL, !root.

Esteja atento, pois isso pode realmente negar root, mas por outro lado permite qualquer usuário.

Usar ALL em conjunto com outras declarações RARAMENTE funciona como imaginamos que será (consulte as notas de segurança). Linhas muito longas para caber no editor de texto podem ser quebradas pelo caractere da barra invertida como último caractere da linha anterior. Os seguintes caracteres SEMPRE devem ser escapados quando utilizados como parte de uma palavra definida pelo usuário (um nome de usuário ou de host, por exemplo):

'!', '=', ':', ',', '(', ')', '\'

Continua na Parte IV...

Referências:

[1] - http://www.sudo.ws/man/1.8.12/sudoers.man.html

Página anterior    

Páginas do artigo
   1. Valores padrão
   2. SELinux_Spec
Outros artigos deste autor

Slackware não tem gerenciador de pacotes?! Não tinha!

Configurando corretamente para o Horário de Verão

Formatação de linhas e colunas da planilha do OpenOffice

Lançamento do GFP 0.1.4.5 - Gerenciador Financeiro Pessoal

Postfix com courier-pop de forma simples

Leitura recomendada

Segurança da Informação no Brasil, qual é nossa realidade?

Gateway autenticado com Apache, Iptables e CGI em shell

Recuperação do arquivo sudoers - comandos su e sudo não funcionam mais [Resolvido]

HoneyPots em Linux

Introdução a criptografia

  
Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts