Tetapkan kata sandi sudo secara berbeda dari kata sandi masuk

30

Sebagai pengguna istimewa saya mencoba untuk mengatur sudokata sandi yang lain maka yang digunakan saat login.

Saya sudah melakukan riset tetapi belum menemukan jawaban. Apakah sudomendukung konfigurasi seperti itu?

Jika Anda kehilangan kata sandi, Anda kehilangan segalanya. Seseorang dapat masuk dan mempromosikan dirinya rootdengan kata sandi yang sama.

sudomemiliki opsi untuk meminta rootkata sandi alih-alih menggunakan kata sandi pengguna, ( rootpw), tetapi berbagi rootkata sandi jelas bukan opsi, itulah sebabnya kami mengaturnya sudo.

Saya lakukan config 2FAdi masa lalu, itu bekerja dengan baik, tetapi juga mengalahkan tujuan otomatisasi. Misalnya jika Anda ingin menjalankan perintah istimewa di selusin server dengan expectskrip, menambahkan 2FAtidak memungkinkan Anda untuk melakukan itu.

Solusi terdekat yang saya temukan adalah dengan hanya mengizinkan kunci pribadi SSH dan mengatur frasa sandi dengan kunci yang berbeda dari sudokata sandi (login). Tetap saja, ini tidak nyaman, karena dalam situasi darurat Anda tidak dapat masuk dengan PC yang tidak memiliki kunci itu.

Shâu Shắc
sumber
1
Mengapa Anda membutuhkan ini tepatnya? Mungkin masalahnya ada di tempat lain. Bukankah lebih baik memiliki otentikasi dua faktor untuk masuk ke sistem dengan akun istimewa dan kemudian memiliki 'NOPASSWD', sehingga sudo tidak meminta kata sandi? Maka tentu saja Anda harus memiliki akun lokal darurat yang terpisah dengan kata sandi yang kuat untuk dapat login ketika jaringan mati (tidak ada akses ssh).
jirib

Jawaban:

30

Jika Anda ingin meminta kata sandi root, dan bukan kata sandi pengguna, ada beberapa opsi yang bisa Anda masukkan /etc/sudoers. rootpwkhususnya akan membuatnya meminta kata sandi root. Ada runaspwdan targetpwjuga; lihat manual sudoers (5) untuk detailnya.

Selain itu, sudo melakukan otentikasi (seperti yang lainnya) melalui PAM. PAM mendukung konfigurasi per aplikasi. Konfigurasi Sudo ada di (setidaknya di sistem Debian saya) /etc/pam.d/sudo, dan terlihat seperti ini:

$ cat sudo 
#%PAM-1.0

@include common-auth
@include common-account
@include common-session-noninteractive

Dengan kata lain, secara default, ini mengotentikasi seperti yang lainnya pada sistem. Anda dapat mengubah @include common-authbaris itu, dan meminta PAM (dan dengan demikian sudo) menggunakan sumber kata sandi alternatif. Baris yang tidak dikomentari pada common-auth terlihat seperti (secara default, ini akan berbeda jika Anda menggunakan misalnya, LDAP):

auth    [success=1 default=ignore]      pam_unix.so nullok_secure
auth    requisite                       pam_deny.so
auth    required                        pam_permit.so

Anda dapat menggunakan misalnya, pam_userdb.soalih-alih pam_unix.so, dan menyimpan kata sandi alternatif di basis data Berkeley DB.

contoh

Saya membuat direktori /var/local/sudopass, pemilik / grup root:shadow, mode 2750. Di dalamnya, saya melanjutkan dan membuat file basis data kata sandi menggunakan db5.1_load(yang merupakan versi Berkeley DB yang digunakan di Debian Wheezy):

# umask 0027
# db5.1_load -h / var / local / sudopass -t hash -T passwd.db
anthony
WMaEFvCFEFplI
^D

Hash yang dihasilkan dengan mkpasswd -m desmenggunakan kata sandi "kata sandi" Sangat sangat aman! (Sayangnya, pam_userdb tampaknya tidak mendukung sesuatu yang lebih baik daripada crypt(3)hashing kuno ).

Sekarang, edit /etc/pam.d/sudodan hapus @include common-authbaris, dan alih-alih letakkan ini di tempatnya:

auth    [success=1 default=ignore]      pam_userdb.so crypt=crypt db=/var/local/sudopass/passwd
auth    requisite                       pam_deny.so
auth    required                        pam_permit.so

Perhatikan bahwa pam_userdb menambahkan .dbekstensi ke database yang diteruskan, jadi Anda harus .dbmematikannya.

Menurut dannysauer dalam komentar , Anda mungkin perlu melakukan pengeditan yang sama /etc/pam.d/sudo-ijuga.

Sekarang, untuk sudo, saya harus menggunakan passwordkata sandi login asli saya:

anthony @ sudotest: ~ $ sudo -K
anthony @ sudotest: ~ $ sudo echo -e '\ nit worked'
[sudo] kata sandi untuk anthony: passwordRETURN

itu berhasil
derobert
sumber
Pastikan juga mengkonfigurasi "sudo-i", yang mana versi sudo yang lebih baru sering digunakan untuk "sudo -i" (jika vendor belum mengubah sesuatu).
dannysauer
Bisakah Anda menguraikan konfigurasi PAM?
Shâu Shắc
@ ShâuShắc Saya telah menambahkan contoh, termasuk perubahan konfigurasi PAM.
derobert
Terima kasih. Tapi saya tidak menemukan db51-utils di Redhat / centos atau sumber, apakah hanya tersedia dalam varian Debian?
Shâu Shắc
3
"The crypt(3)hashing kuno " pada versi modern glibc memiliki dukungan untuk sha-512, misalnya. mkpasswd -m sha-512. pam_userdb.so dapat menangani ini dengan baik.
Andrew Domaszek
6

Untuk Redhat / Centos, persyaratan dapat dicapai dengan langkah-langkah berikut:

Buat pengguna khusus dan berikan:

# db_load -t hash -T /usr/local/etc/passwd.db
user
pass
^d

Edit file sudo pam.d sehingga terlihat seperti:

$ cat /etc/pam.d/sudo

auth            required        pam_userdb.so db=/usr/local/etc/passwd
account         required        pam_userdb.so db=/usr/local/etc/passwd
password        include         system-auth

session         optional        pam_keyinit.so revoke
session         required        pam_limits.so

Saya masih mencari cara untuk mengkonfigurasi, sehingga hanya pengguna / grup tertentu yang harus authen dengan metode kustom ini, yang lain masih dapat authen dengan metode sistem-auth normal. Adakah yang bisa memberi saya beberapa saran?

Shâu Shắc
sumber
Anda harus dapat melakukan ini dengan sintaks aksi penuh di PAM. mis., [user_unknown=ignore,success=ok,default=bad]... tetapi Anda harus bermain dengan itu (dan membaca dokumen PAM) untuk memperbaikinya
derobert
Ini juga dapat dilakukan menggunakan pam_succeed_ifuntuk melewati satu modul jika pengguna berada di salah satu daftar grup, atau untuk melewatkan dua modul jika tidak.
dannysauer
Jadi, sesuatu yang umumnya seperti ini: /// auth [sukses = abaikan default = 1] pam_succeed_if.so pengguna di danny: frank /// auth cukup danny_frank_module.so /// auth cukup not_danny_frank.so
dannysauer
3

Saya tidak berpikir sudo mendukung pengaturan seperti itu. Tujuan dari prompt kata sandi sudo adalah untuk memastikan bahwa orang yang mengeluarkan perintah sudo adalah orang yang sama dengan yang masuk, dan cara termudah untuk melakukannya adalah dengan meminta pengguna yang saat ini masuk untuk mengautentikasi ulang diri mereka sendiri.

Dengan kata lain, tujuan dari sudo password prompt bukanlah untuk membangun otoritas , tetapi untuk membangun identitas . Berdasarkan identitas yang ditetapkan dan konfigurasi sudo, keputusan dapat dibuat apakah pengguna tersebut memiliki wewenang atau hak akses yang diperlukan.

sebuah CVn
sumber
3
Sudo tidak (kecuali jika Anda ingin menanyakan kata sandi root, atau pengguna tertentu, atau kata sandi pengguna target), tetapi PAM melakukannya. Dan sudo menggunakan PAM.
derobert
1

Kekhawatiran Anda adalah bahwa kata sandi akun Anda dapat diungkapkan. Solusinya adalah tidak menggunakan kata sandi masuk dengan cara yang bisa diungkapkan. Dengan ssh, kata sandi dienkripsi di kabel, jadi tidak masalah. Orang mematikan kata sandi auth dengan ssh untuk mencegah serangan tebak kata sandi, bukan untuk melindungi kerahasiaan kata sandi. Jika Anda menggunakan kata sandi akun yang sama untuk hal lain, pastikan Anda menggunakan saluran yang aman dan terenkripsi untuk memberikan kata sandi. Jika Anda khawatir tentang keylogger atau apa pun, berhentilah menggunakan mesin yang tidak tepercaya untuk masuk.

Jika seseorang bisa mendapatkan kata sandi ssh Anda, mereka mungkin juga bisa mendapatkan kata sandi sudo alternatif, jadi Anda lebih baik menginvestasikan waktu untuk membuat koneksi Anda lebih aman daripada menghabiskan waktu hanya membuat segalanya lebih rumit hanya untuk ilusi keamanan yang lebih.

dannysauer
sumber
0

Saya tidak memiliki akses langsung ke sistem di mana saya dapat menguji ini dan mengetahui detailnya, tetapi saya punya ide:

  • (Asumsikan akun login normal Anda adalah shau.)
  • Buat akun kedua: shau2 . (Saya tidak yakin apakah Anda ingin memiliki UID yang sama dengan shau.)
  • Konfigurasikan shau2 untuk memiliki hak sudo dengan NOPASSWD.
  • Siapkan alias atau skrip shell untuk dilakukan su shau2 -c sudo "$@". Ini harus meminta shau2kata sandi. Jika itu dimasukkan dengan benar, itu akan berjalansudo sebagai shau2 (yang seharusnya tidak meminta kata sandi).
  • Menghapus shau hak sudo.

Sayangnya, Anda harus mengulang ini untuk setiap pengguna yang memiliki hak sudo.

Scott
sumber
0

Terima kasih @ Shâu Shắc atas jawabannya ! Solusi itu juga berfungsi untuk LinuxMint 17.1 Cinnamon 32bit (Saya hanya menginstal db-utilpaket untuk menjalankannyadb_load ).

Tapi saya sangat bingung dengan passwd.dbfile yang dihasilkan . Saya telah melakukan hal yang sama seperti pada jawaban Anda (tetapi menggunakan david dan jones , mereka terlihat lebih menarik):

# db_load -t hash -T /usr/local/etc/passwd.db
david
jones
^d

Tetapi kredensial yang dimasukkan disimpan di dalam file hash sebagai teks biasa:

# grep 'jones.*david'  /usr/local/etc/passwd.db
Binary file /usr/local/etc/passwd.db matches

Anda juga dapat melihat david dan jones melalui mcedit :

masukkan deskripsi gambar di sini

Ya, dimungkinkan untuk membatasi izin /usr/local/etc/passwd.db. Tapi bagaimanapun, nama pengguna dan kata sandi yang disimpan sebagai teks biasa buruk.


Bahkan dengan kata sandi sudo yang terpisah ada beberapa lubang keamanan potensial (dengan pengaturan distro default). Dengan demikian, kata sandi terpisah tidak berlaku untuk su (sehingga dimungkinkan untuk memulai sesi root menggunakan sudan kata sandi masuk). Selain itu, kata sandi terpisah tidak dihormati oleh Kit Kebijakan (dimungkinkan untuk memulai Synaptic menggunakan synaptic-pkexecdan login kata sandi. Kemudian hapus paket ...). Masalah-masalah ini dapat dihilangkan dengan penyetelan file konfigurasi tambahan.

Secara umum tampaknya amankan kata sandi sudo yang terpisah hanya dapat dicapai dengan bantuan modul PAM khusus (mungkin, modul tersebut akan membandingkan kata sandi dan SHA-512 hash read from file) atau fungsi SELinux.

PS: maaf itu harus komentar. Tapi itu berjalan sebagai jawaban karena format teks. Terima kasih atas pengertian.

flaz14
sumber