Come eseguire il comando sudo senza password?


235

In che modo l' ubuntuutente sulle immagini AWS per Ubuntu Server 12.04 ha una password sudoper tutti i comandi quando non è presente alcuna configurazione /etc/sudoers?

Sto usando Ubuntu server 12.04 su Amazon. Voglio aggiungere un nuovo utente che ha lo stesso comportamento dell'utente Ubuntu predefinito. In particolare, voglio senza password sudoper questo nuovo utente.

Quindi ho aggiunto un nuovo utente e sono andato a modificare /etc/sudoers(usando visudo ovviamente). Dalla lettura di quel file sembrava che l' ubuntuutente predefinito ottenne che fosse senza password sudocome membro del admingruppo. Quindi ho aggiunto il mio nuovo utente a quello. Che non ha funzionato. Quindi ho provato ad aggiungere la NOPASSWDdirettiva a sudoers. Anche questo non ha funzionato.

Comunque, ora sono solo curioso. In che modo l' ubuntuutente ottiene i privilegi senza password se non sono definiti in /etc/sudoers. Qual è il meccanismo che lo consente?


Risposte:


332

Ok, ho scoperto la risposta, quindi potrei anche metterla qui per completezza. Alla fine /etc/sudoersc'è quello che pensavo fosse solo un commento:

#includedir /etc/sudoers.d

Tuttavia, questo include effettivamente il contenuto di quella directory. All'interno del quale è presente il file /etc/sudoers.d/90-cloudimg-ubuntu. Che ha i contenuti previsti

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

Ecco dove vive la configurazione sudo per l'utente ubuntu predefinito.

È necessario modificare questo file usando visudo. Il seguente comando ti permetterà di modificare il file corretto con visudo.

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

E aggiungi una riga come:

aychedee ALL=(ALL) NOPASSWD:ALL

Alla fine.


4
Sono abbastanza sicuro di aver dovuto eseguire un riavvio completo.
aychedee,

2
nuove regole sudo verranno utilizzate per ogni nuovo utente registrato - quindi è necessario accedere nuovamente
bluszcz

32
'sudo service sudo restart' funziona :)
Laice,

4
Nelle versioni successive (ad esempio 14.04) il file incluso è /etc/sudoers.d/90-cloud-init-users(quindi per modificare .. sudo visudo -f /etc/sudoers.d/90-cloud-init-users). Anche se sarebbe più pulito creare file aggiuntivi rispetto alla modifica di quello generato. Si noti che i file contenente una .o termina in ~sarà non essere inclusi.
Molomby,

2
@ Phil_1984_ Molto probabilmente, è stato aggiunto come commento per consentire la compatibilità con altre versioni (standard?) Di sudo, che non consentono le inclusioni, ma che non sarebbero innescate da un commento strano. (Gli standard sono difficili! ;-)
jpaugh

94

Ho scoperto che la cosa più semplice da fare, al fine di replicare facilmente questo comportamento su più server, era la seguente:

sudo visudo

Cambia questa riga:

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

a questa linea:

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

E spostalo sotto questa linea:

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

ora dovresti avere questo:

# 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

quindi per ogni utente che necessita dell'accesso sudo CON una password :

sudo adduser <user> sudo

e per ogni utente che necessita dell'accesso sudo SENZA password :

sudo adduser <user> admin

e infine, esegui questo:

sudo service sudo restart

E questo è tutto!

Modifica: potrebbe essere necessario aggiungere il gruppo admin in quanto non credo che esista per impostazione predefinita.

sudo groupadd admin

Puoi anche aggiungere l' ubuntuutente AWS predefinito al admingruppo tramite questo comando:

sudo usermod ubuntu -g admin

Nota: come accennato da @hata , potrebbe essere necessario utilizzare admcome nome del gruppo di amministratori, a seconda della versione di Ubuntu utilizzata.


3
Nota per sé: è una convenzione spostare le autorizzazioni meno restrittive più in basso nello stack. Ma non farlo non influirà sulla funzionalità.
poweratom,

2
Come ha spiegato jiminikiz, ho dovuto posizionare % admin dopo % sudo sul mio Ubuntu GNOME 16.04 LTS. Inoltre, l'id del gruppo amministratori non è esattamente admin ma adm sul mio Ubuntu. Non è stato richiesto il riavvio.
hata,

5

Vorrei creare il mio file nella directory /etc/sudoers.d/ - il file creato da Amazon Cloud potrebbe essere sovrascritto in caso di aggiornamenti. Dopo aver creato il tuo file in /etc/sudoers.d, aggiungi questa voce,

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

Riavvia il sistema e funzionerà.


2

Risposta breve senza usare alcun editor (testato su bash, molto rischioso da eseguire su host remoti).

Configurare sudo per funzionare senza una password per l'utente corrente:

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

Controlla la modifica con:

sudo visudo -c

Verifica se puoi utilizzare sudo senza password:

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

... o semplicemente provalo con:

sudo <anything>

21
Questo è un consiglio piuttosto pericoloso ... copia e incolla questo errore e ti bloccherai fuori dal tuo server. Da qui il consiglio di usare visudo. Verifica che la sintassi sia corretta prima di salvare su disco. Quindi, per chiunque voglia usarlo. Non farlo su un server remoto a cui tieni. Potresti voler includere un avviso al riguardo nella tua risposta.
aychedee,

8
Non usare visudo è un'idea orribile . Fidati di me, lo so.
Trognandro

1
IMHO, un copia-incolla è più sicuro di una modifica manuale. Una semplificazione minore:echo "$USER ALL=(ALL) NOPASSWD:ALL" | sudo tee -a /etc/sudoers
theartofrain

4
@theartofrain - Normalmente, sono d'accordo, ma visudoè particolarmente bello non permetterti di rompere il file sudoers, quindi non bloccarti fuori dalla tua macchina (o almeno sudo).
Jon V

3
@JonV Puoi anche perdere i diritti di amministratore visudo, ma di solito non per caso, perché visudosalva solo le modifiche che sono ben formate secondo la grammatica per i file sudoers . La maggior parte degli errori sono sintatticamente sbagliati, quindi non causano danni visudo. Se /etc/sudoerso in un file /etc/sudoers.d è mal formato, si sudorifiuta di elevare i privilegi per chiunque come misura di sicurezza, motivo per cui non utilizzarlo visudoè pericoloso. (Anche se a volte pkexecpuò risolverlo senza riavviare.)
Eliah Kagan,

0

Ecco come ho implementato l'utente non root, senza password in un'immagine Docker effimera per l'uso in una pipeline 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.