Pertanyaan Bagaimana cara selalu menegakkan kata sandi sudo untuk perintah tertentu?


Suatu hari saya melakukan beberapa tugas pemeliharaan di server web saya. Saya terburu-buru dan mengantuk, jadi saya melakukan semuanya menggunakan sudo perintah.

Dan kemudian, saya tidak sengaja menekan Ctrl+V, mengirim perintah ini ke server web saya:

sudo rm -rf /*

Bagi mereka yang bertanya-tanya apa yang dilakukan oleh perintah di atas: Ini menghapus saya seluruh server web

Untungnya, saya memiliki backup dan sayangnya, saya harus menghabiskan dua jam lebih terjaga untuk memperbaiki kesalahan yang luar biasa ini. Tapi sejak itu, saya bertanya-tanya:

Apakah ada cara untuk selalu menegakkan kata sandi sudo untuk perintah tertentu?

Jika server meminta saya kata sandi, saya akan menyelamatkan diri dari banyak masalah. Itu tidak, karena saya berlari sekitar 5 sudo perintah sebelum kesalahan megah ini.

Jadi, adakah cara untuk melakukannya? Saya hanya perlu kata sandi dengan rm perintah untuk selalu diberlakukan. Perintah lain yang saya gunakan biasanya nano atau cp yang keduanya (sampai batas tertentu) dapat dikembalikan.


12
2018-05-11 07:28


asal


Terkait: Cara mendapatkan sudo untuk meminta kata sandi setiap kali - Melebius
@titik balik matahari /* diperluas sebelum diteruskan ke perintah rm. Jadi perintah tidak melihat satu argumen, tetapi daftar argumen (/bin /boot /cdrom /dev /etc /home ...) - Dan
Satu pelajaran penting untuk mengambil dari ini adalah bahwa Anda tidak harus menjalankan hal-hal dengan sudo kecuali Anda benar-benar perlu. Saya tahu itu tidak menjawab apa yang Anda minta di sini, tetapi pertanyaan utamanya adalah bagaimana (semoga) mencegah diri Anda dari menghapus server Anda lagi, dan menghindari sudo harus menjadi garis pertahanan pertama Anda melawan itu. - David Z
Kemungkinan duplikat dari Bagaimana saya bisa membuat kata sandi untuk perintah 'rm'? - WinEunuuchs2Unix
@ WinEunuuchs2Unix Itu bukan pertanyaan duplikat sama sekali, op di sini tidak menginginkan rm perintah untuk memiliki kata sandi. Mereka hanya menginginkan sudo untuk meminta satu kali setiap kali perintah rm digunakan. Solusi untuk pertanyaan yang Anda tautkan akan menjadi sedikit menjengkelkan ketika perintah pertama Anda sudo rm. Karena akan meminta Anda untuk dua kata sandi, satu untuk sudo untuk satu rm. - Dan


Jawaban:


Anda dapat mengatur timestamp_timeout untuk 0 untuk perintah tertentu /etc/sudoers. Buat file visudo -f /etc/sudoers.d/pduck dengan konten berikut:

Cmnd_Alias DANGEROUS = /bin/rm

Defaults!DANGEROUS timestamp_timeout=0

pduck ALL = (ALL:ALL) DANGEROUS

Sekarang pengguna pduck selalu dimintai kata sandi saat menjalankan sudo rm (tidak peduli apa parameter tambahan yang diberikan) meskipun pengguna adalah anggota sudo grup dan sudo ingat kata sandinya untuk perintah lain.

Kekurangannya adalah Anda tidak dapat dengan mudah menambahkan parameter ke /bin/rm baris dalam file untuk lebih membatasi ini. Yah ... Anda bisa, seperti:

Cmnd_Alias DANGEROUS = /bin/rm -f

tetapi kemudian Anda diminta untuk melakukannya sudo rm -f dan tidak (lagi) untuk sudo rm -rf, sebagai contoh.


17
2018-05-11 11:28





Satu metode akan digunakan aman-rm. Ini HANYA akan menunjukkan penggunaan "rm" dan mencegah versi "rm" tertentu untuk dijalankan. Itu termasuk menghapus sistem root Anda, tetapi juga dapat digunakan untuk mencegah penghapusan direktori terkait sistem seperti "/ usr /" atau "/ var /". Dari tautan:

Menciptakan penghapusan file penting secara tidak sengaja

Safe-rm adalah alat keamanan yang dimaksudkan untuk mencegah penghapusan tidak disengaja   file penting dengan mengganti /bin/rm dengan pembungkus, yang memeriksa   argumen yang diberikan terhadap daftar hitam file yang dapat dikonfigurasi dan   direktori yang tidak boleh dihapus.

Pengguna yang mencoba untuk menghapus salah satu dari file yang dilindungi ini atau   direktori tidak akan dapat melakukannya dan akan diperlihatkan peringatan   pesan sebagai gantinya:

$ rm -rf /usr   
Skipping /usr

(Jalur yang dilindungi dapat diatur baik di situs dan tingkat pengguna.)

Memulihkan file penting yang Anda hapus secara tidak sengaja bisa sangat sulit.   Lindungi diri Anda hari ini dengan memasang safe-rm dan mengurangi kemungkinan   Anda perlu menghubungi layanan pemulihan data!

enter image description here


9
2018-05-11 07:45



Upvoted untuk safecow - Michael Fulton


sudo memberikan opsi -k, --reset-timestamp, Lihat man sudo:

Ketika digunakan bersama dengan perintah atau opsi yang mungkin memerlukan kata sandi, opsi ini akan menyebabkan sudo mengabaikan pengguna                    kredensial cache. Akibatnya, sudo akan meminta kata sandi (jika diperlukan oleh kebijakan keamanan) dan tidak akan diperbarui                    kredensial cache pengguna.

Anda bisa menulis pembungkus sederhana untuk sudo pengujian untuk rm -rf /* dan berlari

sudo -k rm -rf /*

sebagai gantinya, mis. seperti ini:

sudo ()                                                                                                                                                 
{ 
    [[ "$*" == "rm -rf /*" ]] && opt="-k";
    /usr/bin/sudo $opt "$@"
}

Contoh penggunaan

Pengujian dengan echo a sini.

$ sudo echo
[sudo] password for dessert: 

$ sudo echo

$ sudo echo a
[sudo] password for dessert: 
a
$ sudo echo a
[sudo] password for dessert: 
a

Jika Anda ingin ditanya setiap waktu Anda berlari rm secara umum, Anda dapat menyesuaikan fungsi di atas sebagai berikut:

sudo () 
{ 
    [[ "$1" == "rm" ]] && opt="-k";
    /usr/bin/sudo $opt "$@"
}

Jika Anda menghendaki menggabungkan baik panggilan perintah umum dan baris perintah khusus yang saya sarankan untuk digunakan case, misalnya:

sudo () 
{ 
    case "$*" in 
        rm*)            opt="-k" ;;
        "mv /home"*)    opt="-k" ;;
        "ln -s /usr/bin/fish /bin/sh") opt="-k" && echo "Don't you dare!" ;;
        *)              opt="" ;;
    esac;
    /usr/bin/sudo $opt "$@"
}

Perhatikan bahwa pendekatan ini tidak akan berfungsi jika Anda menjalankannya sudo dengan opsi - solusi yang memungkinkan [[ "$*" =~ " rm " ]] untuk memeriksa string "rm" yang dikelilingi oleh spasi atau *" rm "*) dengan case untuk menangkap baris perintah apa pun yang berisi "rm".


3
2018-05-11 08:01



[[ "$1" == "rm" ]] && opt="-k"; dan bagaimana /bin/rm? - Rinzwind
@ Rickzwind Saya pikir fungsi ini mudah beradaptasi dengan kebutuhan khusus, terutama case pendekatan. - dessert


Jawaban ini tidak menjawab sudo bagian dari pertanyaan Anda tetapi di sisi lain itu membahas cara untuk mengurangi bahaya tidak disengaja rm panggilan untuk apa saja pengguna.

Anda bisa alias rm untuk rm -I yang

  • meminta konfirmasi segera setelah itu akan menghapus direktori atau lebih dari 3 file
  • selama kamu pergi -f yang menimpa sebelumnya -I pilihan.

--one-file-system adalah kemungkinan perlindungan lain terhadap penghapusan tidak sengaja yang saya gunakan dalam rm alias.

Mempersiapkan

Untuk membuat alias seperti itu, gunakan perintah:

alias rm='rm -I --one-file-system'

Anda bisa memasukkannya ke dalam Anda ~/.bashrc atau bahkan /etc/bash.bashrc.

Pemakaian

$ sudo rm -r /etc/apt/sources.list.d /*
rm: remove all arguments?

Untuk mengonfirmasi jenis yes atau terjemahannya ke lokal Anda atau huruf pertama dari salah satu kata dan tekan Memasukkan. Masukan lainnya termasuk tidak ada yang membatalkan operasi.


1
2018-05-12 07:12