SUDO é um sistema que permite a um usuário regular executar comandos como superusuário ou como outro usuário regular. SUDO é baseado em uma política de segurança que concede privilégios pontuais e possui uma arquitetura modular com o uso de plugins. Deste modo, terceiros podem adicionar funcionalidades ao sistema.
A política padrão para SUDO é definida por sudoers. Os membros dessa política são definidos via LDAP ou através do arquivo de configuração em /etc/sudoers. A política de segurança de SUDO define os privilégios que um usuário possui. O usuário deve se autenticar através de uma senha (ou outro método) para ter acesso aos privilégios. Os privilégios dados por SUDO possuem um tempo de validade, o padrão é 5 minutos.
Dentro do tempo de validade o usuário pode fazer outras utilizações de SUDO sem necessidade de reentrar a senha, pois SUDO possui um cache de credencias. Sudo tem sua sintaxe dividida em cinco blocos funcionais. As opções apresentadas em um bloco e que se repetem em outro não são explicadas novamente. Argumentos entre colchetes são opcionais e o caractere barra significa uma opção mutuamente exclusiva (uma ou outra).
Bloco 1:
-h ou --help :: Exibe na saída padrão um sumário de ajuda.
-k ou --reset-timestamp :: Esvazia o cache de credenciais do usuário que executou sudo com essa opção. Após esse comando o usuário deverá fornecer novamente a senha para ter seus privilégios. Esse comando deve ser incluído no arquivo ~/.logout dos usuários com privilégios. Nem todas as políticas de segurança suportam cache. Quando acompanhado de uma solicitação de privilégios o comportamento padrão será exigir a senha e não atualizar o cache.
-K, --remove-timestamp :: Similar a - -reset-timestamp, com a diferença que não pode ser acompanhado de nenhum comando ou opção extra.
-V, --version :: Exibe um sumário com informações relevantes sobre as configurações em tempo de compilação e em tempo de execução. Além de exibir a release da versão em uso, por exemplo, SUDO versão 1.8.12.
Bloco 2:
-v, --validate :: Atualiza o cache de credenciais do usuário, se necessário a autenticação será solicitada. Estende o tempo por novo período de 5 minutos.
-A, --askpass :: Por padrão, quando SUDO requer uma senha ele a solicita através do terminal. Quando essa opção é definida, outro programa é chamado para receber a senha (normalmente um programa gráfico) e repassar ao terminal. A rota padrão para esse programa auxiliar pode ser definida na variável de ambiente SUDO_ASKPASS ou em sudo.conf como:
# Use the OpenSSH askpass
#Path askpass /usr/X11R6/bin/ssh-askpass
#
# Use the Gnome OpenSSH askpass
#Path askpass /usr/libexec/openssh/gnome-ssh-askpass
-n, --non-interactive :: Impede que qualquer interação seja executada. Se uma interação for necessária SUDO será encerrado com uma mensagem de erro.
-S, --stdin :: Escreve o prompt na saída de erro e lê a senha na entrada padrão em vez de usar o terminal. Após a senha adicione um caractere de nova linha (newline) para efetivar a entrada da senha.
-a type, --auth-type=type :: Utiliza um tipo de autenticação específico do BSD e de acordo com a configuração em /etc/login.conf. Disponível em sistemas que suportam a autenticação do tipo BSD.
-g group, --group="group" :: Executa o comando com o valor do grupo definido em "group". São aceitos o nome ou o valor numérico do grupo (GID), desde que, prefixado por um sinal de hash (como #0, para o grupo root). Alguns interpretadores de comandos (shell) podem exigir que esse caractere seja escapado (#0) para que possa ser interpretado. Caso a opção -u não seja declarada, o comando será executado com as credenciais do usuário que executou o comando. Neste caso, é utilizado o grupo primário desse usuário.
-h host, --host="host" :: Se a política de segurança permitir a execução de comandos remotos, o comando será executado no computador definido em "host". Atualmente, sudoers não permite a execução remota. Se acompanhado da opção -l, então, lista os privilégios do usuário para o host remoto.
-p prompt, --prompt=prompt :: Personaliza um prompt para o usuário. São utilizados atualmente os seguintes caracteres de escape:
%H - O nome FQDN do host conforme definido em sudoers.
%h - O nome local do host (sem FQDN).
%p - O nome do usuário do qual a senha está sendo requisitada. (respeita as flags: rootpw, targetpw e runaspw definidas em sudores).
%U - O nome de login do usuário no qual o comando está sendo executado. A menos que a opção -u seja utilizada o padrão é root.
%u - O nome de login do usuário que invocou o comando.
%% - Dois caracteres %% são colapsados em um único %.
O prompt personalizado sobrepõe o prompt padrão em sistemas que suportam PAM a menos que a flag passprompt_override seja ativada em sudoers.
-u user, --user=user :: Executa o comando como um outro usuário diferente do root que é o padrão. São aceitos como argumento os valores numéricos (UID) ou o nome do usuário. Alguns interpretadores de comandos (shell) podem exigir que esse caractere seja escapado (#0) para que possa ser interpretado. Algumas políticas de segurança podem restringir o uso dessa opção a usuários listados na base de senhas. A política sudoers permite usuários não listados contanto, que a opção targetpw não esteja configurada. Outras políticas podem não suportar esse comportamento permissivo.
Bloco 3:
-l, --list :: Se nenhum outro comando for especificado, lista os comandos permitidos (e proibidos?) para o usuário que invocou o comando ou para o usuário definido em -U, ambos em relação ao host corrente. Se especificado mais de uma vez exibe mais detalhes sobre a política de segurança (verbose). Se um comando é especificado, e for permitido pela política de segurança, o caminho completo (path) até esse comando é exibido. Se o comando não for permitido SUDO encerra com um estado de erro de valor 1.
-U "user", --other-user="user" :: Utilizada em conjunto com a opção -l, lista os privilégios em "user" em vez do usuário que invocou o comando. A política de segurança pode restringir o acesso à listagem de privilégios de outros usuários. A política em sudoers permite que o root e usuários com todos os privilégios (ALL) utilizem essa opção.
[command] - O comando que será executado com privilégios elevados.
Bloco 4:
-b, --background :: Executa um dado comando no segundo plano (background). Observe que não é possível utilizar o controle de jobs do shell para manipular processos em segundo plano iniciados por SUDO. Comandos interativos falham em segundo plano quando iniciados por SUDO.
-E, --preserve-env :: Indica para a política de segurança que o usuário deseja preservar as variáveis existentes em seu ambiente. O usuário deve ter permissão na política para preservar seu ambiente, senão uma mensagem de erro é gerada.
-H, --set-home :: Requisita que a política de segurança configure a variável de ambiente HOME (o diretório casa) especificado como alvo no banco de dados de senhas (passwd). Dependendo da política esse é o comportamento padrão.
-P, --preserve-groups :: Preserva o vetor de grupos do usuário que invocou o comando. Por padrão, a política sudoers inicializará o vetor de grupos para a lista de grupos os quais o usuário é membro. Os IDs de grupo efetivo e real são mantidos para combinar com o usuário alvo.
-C num, - -close-from="num" :: Fecha todos os descritores de arquivo maiores ou iguais ao número dado em “num”. Valores menores que três não são permitidos. Por padrão, quando executa um comando sudo fecha todos os descritores abertos, exceto a saída de erro, a saída e a entrada padrão. A política de segurança pode restringir o uso dessa opção. A política sudoers somente permite seu uso quando o administrador ativar a opção closefrom_override.
-c class, --login-class=class :: Executa o comando que limita recursos e define prioridades de execução de acordo com a classe. O valor da classe é definido em /etc/login.conf, ou como um único caractere "-" que, neste caso, usa o login padrão da classe como um alvo que será utilizado. Entretanto, o comando deve ser executado como administrador (root); sudo deve ser executado de um shell que está com privilégios de administrador. Se o comando é executado como um shell de login, configurações adicionais em /etc/login.conf podem ser aplicadas. Essa opção somente é utilizada em sistemas do tipo BSD.
-r role, --role=role :: Executa o comando com o nível de segurança do contexto de SELinux de acordo com uma regra pré-definida.
-t type, --type=type :: Executa o comando com o nível de segurança estabelecido por SELinux em um contexto de determinado tipo. Se nenhum tipo é definido, então o tipo é derivado da função (role).
(- -) - Essa opção indica que sudo não precisa aguardar por mais argumentos em linha de comando. Atributos na forma VARIÁVEL=valor são passados diretamente para sudo. Variáveis de ambiente estão sujeitas ao controle e restrições impostos pelo plug-in de segurança. Para sudoers, por exemplo, variáveis de ambiente estão sujeitas às mesmas regras dos atributos. Uma exceção é quando a opção setenv está ativa em sudoers, neste caso, o comando deve ser executado com a etiqueta SETENV ou combinar com ALL; assim o usuário pode configurar variáveis que de outra forma estariam proibidas.
-i, --login :: Executa o shell definido para o usuário na base de dados de senhas. Isso significa que recursos específicos de login como o arquivo .profile ou .login serão lidos pelo shell. Se o comando é especificado, ele é passado para o shell para execução através da opção -c do shell. Se nenhum comando é definido, um shell interativo é executado. SUDO tenta mudar o diretório casa do usuário antes de executar o shell. O comando é executado com um ambiente similar aquele que o usuário normalmente recebe quando faz login.
-s, --shell :: Executa um shell especificado na variável de ambiente SHELL (se houver) ou o valor especificado na base de dados de senha. Se um comando é especificado, ele é passado ao shell para execução através da opção -c do shell. Se nenhum comando for passado, um shell interativo é executado.
Bloco 5:
-e, --edit ou sudoedit :: Edita arquivos com elevação de privilégios em vez de executar um comando. No lugar de um caminho (path), a cadeia "sudoedit" é utilizada quando consultando a política de segurança. Se o usuário for autorizado, os seguintes passos ocorrem:
Uma cópia temporária do arquivo a ser editado é criada; as propriedades de dono são configuradas para o usuário que invocou o comando. O editor padrão é utilizado neste caso. Esse editor pode ser definido em SUDO_EDITOR, VISUAL ou EDITOR (nesta ordem). Se nenhum destes estiver definido, será utilizado o valor definido em sudoers. Depois de modificado, o arquivo temporário é copiado sobre o original e posteriormente removido. Se não existir arquivo original, um novo será criado a partir do temporário.
[1] Comentário enviado por ghostman em 29/08/2015 - 18:38h
Olá!
Muito bom artigo! Já uso o sudo a muito tempo, como forma de auditar, visto que se somente alguns poucos escolhidos usarem a senha do root. E alguém não souber usar esse poder, já "que com grandes poderes, vem grandes responsabilidades!" Não saberia quem dos escolhidos, usou de forma errada seu poder de root.