Bagaimana menjalankan perintah sudo tanpa kata sandi?

235

Bagaimana ubuntupengguna pada gambar AWS untuk Ubuntu Server 12.04 memiliki kata sandi sudountuk semua perintah ketika tidak ada konfigurasi untuk itu /etc/sudoers?

Saya menggunakan server Ubuntu 12,04 di Amazon. Saya ingin menambahkan pengguna baru yang memiliki perilaku yang sama dengan pengguna Ubuntu default. Secara khusus saya ingin kata sandi sudountuk pengguna baru ini.

Jadi saya telah menambahkan pengguna baru dan pergi untuk mengedit /etc/sudoers(menggunakan visudo tentu saja). Dari membaca file itu sepertinya ubuntupengguna default memperolehnya tanpa kata sandi sudodari menjadi anggota admingrup. Jadi saya menambahkan pengguna baru saya ke sana. Itu tidak berhasil. Kemudian saya mencoba menambahkan NOPASSWDarahan ke sudoers. Yang juga tidak berhasil.

Lagi pula, sekarang aku hanya ingin tahu. Bagaimana cara ubuntupengguna mendapatkan hak istimewa tanpa kata sandi jika mereka tidak didefinisikan dalam /etc/sudoers. Apa mekanisme yang memungkinkan ini?

aychedee
sumber
Terkait: Jalankan sudo tanpa Kata Sandi?
Eliah Kagan

Jawaban:

332

Oke, saya sudah menemukan jawabannya jadi sebaiknya letakkan di sini untuk kelengkapan. Pada akhirnya /etc/sudoersada yang saya pikir hanya komentar:

#includedir /etc/sudoers.d

Namun ini sebenarnya termasuk isi direktori itu. Di dalamnya ada file /etc/sudoers.d/90-cloudimg-ubuntu. Yang memiliki konten yang diharapkan

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

Jadi di situlah konfigurasi sudo untuk pengguna ubuntu default tinggal.

Anda harus mengedit file ini menggunakan visudo. Perintah berikut akan memungkinkan Anda mengedit file yang benar dengan visudo.

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

Dan tambahkan baris seperti:

aychedee ALL=(ALL) NOPASSWD:ALL

Pada akhirnya.

aychedee
sumber
4
Saya cukup yakin saya harus melakukan reboot penuh.
aychedee
2
aturan sudo baru akan digunakan untuk setiap pengguna yang baru masuk - jadi Anda harus masuk kembali setidaknya
bluszcz
32
'sudo service sudo restart' works :)
Laice
4
Dalam versi yang lebih baru (14,04 misalnya) file yang disertakan adalah /etc/sudoers.d/90-cloud-init-users(jadi untuk mengedit .. sudo visudo -f /etc/sudoers.d/90-cloud-init-users). Meskipun akan lebih bersih untuk membuat file tambahan daripada mengedit yang dihasilkan. Perhatikan bahwa file yang berisi .atau berakhir di ~akan tidak disertakan.
Molomby
2
@ Phil_1984_ Kemungkinan besar, itu ditambahkan sebagai komentar untuk memungkinkan kompatibilitas dengan versi (standar?) Sudo lainnya, yang tidak memungkinkan menyertakan, tetapi tidak akan tersandung oleh komentar aneh. (Standar sulit! ;-)
jpaugh
94

Saya menemukan bahwa hal paling lurus ke depan untuk dilakukan, agar mudah meniru perilaku ini di beberapa server, adalah sebagai berikut:

sudo visudo

Ubah baris ini:

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

ke baris ini:

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

Dan pindahkan di bawah baris ini:

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

Anda seharusnya sudah memiliki ini:

# 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

lalu untuk setiap pengguna yang membutuhkan akses sudo DENGAN kata sandi :

sudo adduser <user> sudo

dan untuk setiap pengguna yang membutuhkan akses sudo TANPA kata sandi :

sudo adduser <user> admin

dan akhirnya, jalankan ini:

sudo service sudo restart

Dan itu dia!

Sunting: Anda mungkin harus menambahkan grup admin karena menurut saya itu tidak ada secara default.

sudo groupadd admin

Anda juga dapat menambahkan ubuntupengguna AWS default ke admingrup melalui perintah ini:

sudo usermod ubuntu -g admin

Catatan: Seperti yang disebutkan @hata , Anda mungkin perlu menggunakan admnama grup admin Anda, tergantung pada versi Ubuntu yang digunakan.

Jiminikiz
sumber
3
Catatan untuk diri sendiri: Ini adalah konvensi untuk memindahkan izin yang kurang ketat di tumpukan. Tetapi tidak melakukannya tidak akan memengaruhi fungsionalitas.
poweratom
2
Seperti yang dijelaskan jiminikiz, saya harus menempatkan % admin setelah % sudo di Ubuntu GNOME 16.04 LTS saya. Plus, kelompok administrator id persis tidak admin tapi adm di Ubuntu saya. Tidak perlu reboot.
hata
5

Saya akan membuat file saya sendiri di bawah direktori /etc/sudoers.d/ - file yang dibuat oleh Amazon Cloud mungkin akan ditimpa jika terjadi pembaruan. Setelah membuat file Anda di /etc/sudoers.d, tambahkan entri ini,

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

Nyalakan ulang sistem dan ini akan berhasil.

WaughWaugh
sumber
2

Jawaban singkat tanpa menggunakan editor apa pun (diuji pada bash, sangat berisiko untuk dijalankan pada host jarak jauh).

Konfigurasikan sudo agar berfungsi tanpa kata sandi untuk pengguna saat ini:

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

Periksa hasil edit dengan:

sudo visudo -c

Verifikasi jika Anda dapat menggunakan sudo tanpa kata sandi:

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

... atau coba saja dengan:

sudo <anything>
pengguna315445
sumber
21
Ini saran yang sangat berbahaya ... salin dan tempel ini salah dan Anda akan mengunci diri dari server Anda sendiri. Karenanya saran untuk menggunakan visudo. Itu memeriksa bahwa sintaks sudah benar sebelum menyimpan ke disk. Jadi, bagi siapa saja yang ingin menggunakan ini. Jangan lakukan itu di server jauh yang Anda pedulikan. Anda mungkin ingin memasukkan peringatan tentang itu dalam jawaban Anda.
aychedee
8
Tidak menggunakan visudo adalah ide yang mengerikan . Percayalah, saya tahu.
trognanders
1
IMHO, copy-paste lebih aman daripada pengeditan manual. Penyederhanaan kecil:echo "$USER ALL=(ALL) NOPASSWD:ALL" | sudo tee -a /etc/sudoers
theartofrain
4
@ theartofrain - Biasanya, saya setuju, tetapi visudosangat baik tentang tidak memungkinkan Anda untuk memecahkan file sudoers, sehingga tidak mengunci Anda keluar dari mesin Anda (atau setidaknya sudo).
Jon V
3
@JonV Anda juga dapat kehilangan hak admin visudo, tetapi biasanya tidak karena kecelakaan, karena visudohanya menyimpan perubahan yang dibuat dengan baik sesuai dengan tata bahasa untuk file sudoers . Kebanyakan kesalahan secara sintaksis salah, sehingga tidak ada salahnya visudo. Jika /etc/sudoersatau file dalam bentuk /etc/sudoers.d yang buruk, sudomenolak untuk meningkatkan hak istimewa bagi siapa pun sebagai tindakan keamanan, yang mengapa tidak menggunakan visudoberbahaya. (Meskipun kadang pkexec- kadang dapat memperbaikinya tanpa reboot.)
Eliah Kagan
0

Inilah cara saya menerapkan pengguna non-root, tanpa kata sandi dalam Docker Image yang singkat untuk digunakan dalam pipa 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
sumber