Como executar o comando sudo sem senha?

235

Como o ubuntuusuário nas imagens da AWS para Ubuntu Server 12.04 tem senha sudopara todos os comandos quando não há configuração /etc/sudoers?

Estou usando o servidor Ubuntu 12.04 na Amazon. Quero adicionar um novo usuário que tenha o mesmo comportamento que o usuário padrão do Ubuntu. Especificamente, quero sem senha sudopara esse novo usuário.

Então, adicionei um novo usuário e fui editar /etc/sudoers(usando o visudo, é claro). Ao ler esse arquivo, parecia que o ubuntuusuário padrão estava ficando sem senha sudopor ser um membro do admingrupo. Então eu adicionei meu novo usuário a isso. O que não deu certo. Então eu tentei adicionar a NOPASSWDdiretiva para sudoers. O que também não funcionou.

Enfim, agora estou apenas curioso. Como o ubuntuusuário obtém privilégios sem senha se não estiverem definidos no /etc/sudoers. Qual é o mecanismo que permite isso?

aychedee
fonte
Relacionado: Executar sudo sem senha?
Eliah Kagan

Respostas:

332

Aprovação, eu descobri a resposta assim que pode muito bem colocá-lo aqui para ser completo. No final, /etc/sudoershá o que eu pensei que era apenas um comentário:

#includedir /etc/sudoers.d

No entanto, isso realmente inclui o conteúdo desse diretório. Dentro do qual está o arquivo /etc/sudoers.d/90-cloudimg-ubuntu. Que tem o conteúdo esperado

# ubuntu user is default user in cloud-images.
# It needs passwordless sudo functionality.
ubuntu ALL=(ALL) NOPASSWD:ALL

Então é aí que reside a configuração do sudo para o usuário padrão do ubuntu.

Você deve editar este arquivo usando o visudo. O comando a seguir permitirá editar o arquivo correto com o visudo.

sudo visudo -f /etc/sudoers.d/90-cloudimg-ubuntu

E adicione uma linha como:

aychedee ALL=(ALL) NOPASSWD:ALL

No fim.

aychedee
fonte
4
Tenho certeza de que tive que fazer uma reinicialização completa.
aychedee
2
novas regras sudo será usado para cada novo usuário conectado - então você precisa re de login pelo menos
bluszcz
32
'serviço sudo reiniciar sudo' funciona :)
Laice 11/11
4
Nas versões posteriores (14.04, por exemplo), o arquivo incluído é /etc/sudoers.d/90-cloud-init-users(para editar .. sudo visudo -f /etc/sudoers.d/90-cloud-init-users). Embora seja mais limpo criar arquivos adicionais do que editar o gerado. Observe que os arquivos contendo uma .ou termo no ~vai não ser incluído.
Molomby 27/08/2015
2
@ Phil_1984_ Provavelmente, foi adicionado como um comentário para permitir a compatibilidade com outras versões (padrão?) Do sudo, que não permitem inclusões, mas não seriam provocadas por um comentário estranho. (Padrões são difíceis ;-)!
jpaugh
94

Eu descobri que a coisa mais direta a fazer, para replicar facilmente esse comportamento em vários servidores, era a seguinte:

sudo visudo

Mude esta linha:

# Members of the admin group may gain root privileges
%admin  ALL=(ALL) ALL

para esta linha:

# Members of the admin group may gain root privileges
%admin  ALL=(ALL) NOPASSWD:ALL

E mova-o sob esta linha:

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL

agora você deve ter isso:

# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#

Defaults        env_reset
Defaults        mail_badpass
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

# Host alias specification

# User alias specification

# Cmnd alias specification

# User privilege specification
root    ALL=(ALL:ALL) ALL

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL

# Members of the admin group may gain root privileges
%admin  ALL=(ALL) NOPASSWD:ALL

# See sudoers(5) for more information on "#include" directives:

#includedir /etc/sudoers.d

então, para todos os usuários que precisam de acesso sudo COM uma senha :

sudo adduser <user> sudo

e para todos os usuários que precisam de acesso sudo SEM senha :

sudo adduser <user> admin

e, finalmente, execute o seguinte:

sudo service sudo restart

E é isso!

Editar: talvez você precise adicionar o grupo de administradores, pois acho que ele não existe por padrão.

sudo groupadd admin

Você também pode adicionar o ubuntuusuário padrão da AWS ao admingrupo por meio deste comando:

sudo usermod ubuntu -g admin

Nota: Como o @hata mencionou, pode ser necessário usar admo nome do seu grupo de administradores, dependendo da versão do Ubuntu que está sendo usada.

jiminikiz
fonte
3
Nota para si mesmo: é uma convenção mover permissões menos restritivas para baixo na pilha. Mas não fazer isso não afetará a funcionalidade.
poweratom
2
Como o jiminikiz explicou, eu tive que colocar o % admin após o % sudo no meu Ubuntu GNOME 16.04 LTS. Além disso, o ID do grupo de administradores não é exatamente admin, mas adm no meu Ubuntu. Nenhuma reinicialização foi necessária.
hata
5

Eu criaria meu próprio arquivo no diretório /etc/sudoers.d/ - o arquivo criado pelo Amazon Cloud pode ser sobrescrito em caso de qualquer atualização. Depois de criar seu arquivo em /etc/sudoers.d, adicione esta entrada,

<your user name> ALL=(ALL) NOPASSWD:ALL

Reinicie o sistema e isso funcionará.

WaughWaugh
fonte
2

Resposta curta sem usar nenhum editor (testado no bash, muito arriscado para executar em hosts remotos).

Configure o sudo para funcionar sem uma senha para o usuário atual:

echo "$USER ALL=(ALL) NOPASSWD:ALL" | sudo tee -a /etc/sudoers

Verifique a edição com:

sudo visudo -c

Verifique se você pode usar o sudo sem uma senha:

sudo cat /etc/sudoers | grep "$USER"

... ou simplesmente tente com:

sudo <anything>
user315445
fonte
21
Este é um conselho bastante perigoso ... copie e cole isso errado e você ficará fora do seu próprio servidor. Daí o conselho para usar o visudo. Ele verifica se a sintaxe está correta antes de salvar no disco. Então, para quem quer usar isso. Não faça isso em um servidor remoto de seu interesse. Você pode incluir um aviso sobre isso na sua resposta.
aychedee
8
Não usar o visudo é uma ideia horrível . Confie em mim, eu sei.
trognanders 9/09/15
1
IMHO, copiar e colar é mais seguro que uma edição manual. A simplificação menor:echo "$USER ALL=(ALL) NOPASSWD:ALL" | sudo tee -a /etc/sudoers
theartofrain
4
@theartofrain - Normalmente, eu concordo, mas visudoé particularmente bom em não permitir que você quebre o arquivo sudoers, não impedindo que você saia da sua máquina (ou pelo menos sudo).
Jon V
3
@JonV Você também pode perder os direitos de administrador visudo, mas geralmente não por acidente, porque visudoapenas salva alterações que são bem formadas de acordo com a gramática dos arquivos do sudoers . A maioria dos erros está sintaticamente errada, então eles não causam danos visudo. Se /etc/sudoersou um arquivo /etc/sudoers.d estiver mal formado, sudose recusa a elevar privilégios para qualquer pessoa como medida de segurança, e é por isso que não usar visudoé perigoso. (Embora , por vezes, pkexecpode corrigi-lo sem uma reinicialização.)
Elias Kagan
0

Foi assim que implementei o usuário não raiz e sem senha em uma imagem efêmera do Docker para uso em um pipeline do CICD:

RUN \
    groupadd -g 999 foo && useradd -u 999 -g foo -G sudo -m -s /bin/bash foo && \
    sed -i /etc/sudoers -re 's/^%sudo.*/%sudo ALL=(ALL:ALL) NOPASSWD: ALL/g' && \
    sed -i /etc/sudoers -re 's/^root.*/root ALL=(ALL:ALL) NOPASSWD: ALL/g' && \
    sed -i /etc/sudoers -re 's/^#includedir.*/## **Removed the include directive** ##"/g' && \
    echo "foo ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers && \
    echo "Customized the sudoers file for passwordless access to the foo user!" && \
    echo "foo user:";  su - foo -c id
Seth Bergman
fonte