Cegah sudo dari meminta kata sandi saat menjalankan perintah yang tidak diizinkan


15

Saya telah memberikan izin grup untuk menjalankan perintah tertentu tanpa kata sandi melalui sudo. Ketika salah satu pengguna membuat kesalahan ketik atau menjalankan perintah yang salah, sistem meminta mereka untuk kata sandi mereka dan kemudian mereka mendapatkan kesalahan. Ini membingungkan bagi pengguna jadi saya hanya ingin menampilkan kesalahan daripada meminta mereka untuk kata sandi. Apakah ini mungkin?

Ini adalah contoh file sudoers saya:

%mygroup ALL=(ALL) NOPASSWD:/usr/local/bin/myscript.sh *

Contoh ketika mereka menjalankan skrip yang salah:

# sudo /usr/local/bin/otherscript.sh
[sudo] password for user:
Sorry, user user is not allowed to execute '/usr/local/bin/otherscript.sh' as root on <hostname>.

Output yang diinginkan:

Sorry, user user is not allowed to execute '/usr/local/bin/otherscript.sh' as root on <hostname>. Please check the command and try again.

Perhatikan kurangnya prompt kata sandi.

Google-fu telah gagal saya dan hanya mengembalikan hasil pada tidak meminta password ketika pengguna yang diizinkan untuk menjalankan perintah.


8
Jika itu mungkin, itu bisa membuka lubang keamanan (kecil). Jika Anda membiarkan diri Anda login dan saya "meminjam" keyboard Anda, saya tidak bisa melihat perintah apa yang sudoakan Anda jalankan tanpa memasukkan kata sandi Anda. Dengan fitur yang Anda inginkan, saya bisa mendapatkan informasi itu untuk perintah tertentu.
Keith Thompson

4
Ini adalah masalah keamanan yang cukup besar. Anda sebaiknya tidak menggunakan sudo dengan skrip sebagai perintah. Orang hanya dapat mengedit skrip dan menjalankan apa pun yang mereka inginkan sepenuhnya menutupinya dari audit. Alih-alih menambahkan panggilan ke sudo di dalam skrip.
coteyr

1
@coteyr menjalankan file biner sudosama besarnya dengan masalah, jika pengguna memiliki akses tulis ke file-file ini.
Dmitry Grigoryev

1
@CarlWitthoft itu sebabnya Anda menggunakan jalur absolut untuk menentukan program yang diizinkan dalam sudoers.
Dmitry Grigoryev

1
@ DmitryGrigoryev, ya, tetapi jika Anda akan menggunakan sed atau semacamnya hanya untuk satu file maka tidak ada manfaat untuk sudo. Mengizinkan pengguna mengubah file adalah alasan file memiliki izin. Anda tidak perlu menemukan kembali roda. Jika Anda ingin pengguna dapat memodifikasi file, maka biarkan mereka. Tidak perlu, atau manfaat untuk melompati lingkaran dengan sudo untuk memungkinkan pengguna untuk memodifikasi file, tanpa kata sandi. Anda selalu bisa membiarkannya. Alat yang tepat untuk pekerjaan yang tepat.
coteyr

Jawaban:


25

Dari membaca cepat sudo(8)

   -n          The -n (non-interactive) option prevents sudo from
               prompting the user for a password.  If a password is
               required for the command to run, sudo will display an error
               message and exit.

Dan untuk yang ragu:

# grep jdoe /etc/sudoers
jdoe    ALL=(ALL) NOPASSWD: /bin/echo
#

Diuji demikian:

% sudo echo allowed
allowed
% sudo -n ed             
sudo: a password is required
% sudo ed               

We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

    #1) Respect the privacy of others.
    #2) Think before you type.
    #3) With great power comes great responsibility.

Password:

Jadi aliasbagi sudoorang-orang ini kemungkinan akan melakukan trik, untuk mencegah prompt kata sandi. Sekarang mengapa ini memerlukan kompilasi khusus sudo, saya tidak tahu, saya baru saja membaca manual.


Memang. Saya akan meletakkan sesuatu seperti alias sudo="$(which sudo) -n"di / etc / bashrc, kemudian gunakan sudo(perilaku yang disesuaikan) atau command sudo(perilaku default) seperti yang diinginkan.
CVn

7

Satu hal yang berhasil bagi saya, (Sudo versi 1.8.17p1), tetapi hanya memenuhi sebagian dari masalah Anda, adalah mengatur jumlah kata sandi yang mencoba menjadi 0.

Defaults:%mygroup passwd_tries = 0

Ini membuat sudo keluar dengan kode 1 ketika perintah apa pun yang membutuhkan kata sandi dicoba. Namun, itu tidak menghasilkan pesan kesalahan apa pun.


Ini juga merupakan jawaban yang valid tetapi kurangnya pesan kesalahan mungkin membingungkan. Kesalahan yang benar namun tidak terduga dari jawaban di atas juga membingungkan. Kurasa itu lemparan. Terima kasih telah memberikan jawaban alternatif, opsi selalu dihargai!
user184982

2

Kamu tidak bisa.

Tidak ada cara untuk mengetahui siapa Anda sampai Anda mengotentikasi, dan, secara default Anda tidak dapat mengautentikasi tanpa kata sandi.

Anda dapat mengubah otentikasi untuk menggunakan kunci USB, pemindai sidik jari, otentikasi suara, pengenalan wajah, atau banyak hal lainnya, tetapi intinya sama.

Anda tidak dapat mengautentikasi, tanpa mengautentikasi DAN sebelum Anda mengotentikasi sudo, tidak ada bisnis yang memberi tahu Anda apa yang dapat atau tidak dapat Anda jalankan.


2
Mengetikkan kata sandi saat Anda menjalankan sudo bukanlah identifikasi ("beri tahu siapa Anda"). Sudo tahu siapa kamu. Mengetik kata sandi Anda adalah konfirmasi keberadaan.
Gilles 'SANGAT berhenti menjadi jahat'

Saya menganggap konfirmasi keberadaan sebagai "otentikasi". Seperti dalam Otentikasi, lalu Otorisasi.
coteyr

2
Jawabannya mengatakan "otentikasi" bukan "identifikasi". Sementara sudo tidak tahu siapa Anda mengaku sebagai, berdasarkan pengguna yang login pada itu terminal, tidak tahu siapa Anda adalah sampai Anda telah dikonfirmasi identitas itu.
Dave Sherohman

2

@StrongBad membuat komentar yang layak menjadi jawaban:

Saya pikir solusi terbaik adalah dengan menulis skrip wrapper yang selalu memanggil sudodengan parameter yang benar. (Termasuk -n)

Skrip wrapper dapat melakukan parsing argumen, dll. Sehingga skrip sudo yang dipanggil menjadi sekecil mungkin dan karenanya cenderung memiliki bug.


1

Ini tidak mungkin. Satu-satunya cara adalah mengubah kode sumber dan kompilasi garpu Anda sendirisudo


Anda benar, tetapi saya rasa saya tidak akan mendapatkan izin untuk memuat versi kustom sudo di semua server produksi kami. hah
user184982
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.