Bagaimana cara selalu menegakkan kata sandi sudo untuk perintah tertentu?

12

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

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

sudo rm -rf /*

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

Untungnya, saya punya cadangan dan sayangnya, saya harus menghabiskan dua jam lagi untuk memperbaiki kesalahan yang luar biasa ini. Tapi sejak itu, saya bertanya-tanya:

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

Jika server meminta saya kata sandi, saya akan menyelamatkan diri dari banyak masalah. Tidak, karena saya menjalankan sekitar 5 sudoperintah sebelum kesalahan besar ini.

Jadi, adakah cara untuk melakukannya? Saya hanya perlu kata sandi dengan rmperintah untuk selalu ditegakkan. Perintah lain yang saya gunakan biasanya nanoatau cpyang keduanya (sampai batas tertentu) dapat dikembalikan.

Pavel Janicek
sumber
2
@solsTiCe /*diperluas sebelum diteruskan ke perintah rm. Jadi perintah tidak melihat argumen tunggal, tetapi daftar argumen ( /bin /boot /cdrom /dev /etc /home...)
Dan
3
Satu pelajaran penting untuk diambil dari hal ini adalah Anda tidak boleh menjalankan sesuatu dengan sudo kecuali Anda memang perlu melakukannya. Saya tahu itu tidak menjawab apa yang Anda tanyakan di sini, tetapi pertanyaan mendasarnya adalah bagaimana (semoga) mencegah diri Anda menghapus server Anda lagi, dan menghindari sudo harus menjadi garis pertahanan pertama Anda terhadap hal itu.
David Z
2
Kemungkinan duplikat dari Bagaimana saya mengatur kata sandi untuk perintah 'rm'?
WinEunuuchs2Unix
2
@ WinEunuuchs2Unix Itu bukan pertanyaan duplikat sama sekali, op di sini tidak ingin rmperintah memiliki kata sandi. Mereka hanya ingin sudomeminta satu setiap kali perintah rm digunakan. Solusi untuk pertanyaan yang Anda tautkan akan menjadi sedikit mengganggu ketika perintah pertama Anda sudo rm. Karena akan meminta dua kata sandi, satu untuk sudosatu kata sandi rm.
Dan

Jawaban:

17

Anda dapat mengatur timestamp_timeoutuntuk 0untuk perintah tertentu dalam /etc/sudoers. Buat file visudo -f /etc/sudoers.d/pduckdengan konten berikut:

Cmnd_Alias DANGEROUS = /bin/rm

Defaults!DANGEROUS timestamp_timeout=0

pduck ALL = (ALL:ALL) DANGEROUS

Sekarang pengguna pduckselalu dimintai kata sandi saat menjalankan sudo rm(tidak peduli apa pun parameter tambahan yang diberikan) meskipun pengguna adalah anggota sudogrup dan sudomengingat kata sandinya untuk perintah lain.

Kelemahannya adalah Anda tidak dapat dengan mudah menambahkan parameter ke /bin/rmbaris dalam file untuk lebih lanjut membatasi ini. Ya… Anda bisa, seperti:

Cmnd_Alias DANGEROUS = /bin/rm -f

tetapi kemudian Anda hanya diminta untuk tepat sudo rm -fdan tidak (lagi) untuk sudo rm -rf, misalnya.

PerlDuck
sumber
9

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

Mencegah penghapusan file penting secara tidak disengaja

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

Pengguna yang mencoba menghapus salah satu file atau direktori yang dilindungi ini tidak akan dapat melakukannya dan akan ditampilkan pesan peringatan:

$ rm -rf /usr   
Skipping /usr

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

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

masukkan deskripsi gambar di sini

Rinzwind
sumber
Terpilih untuk safecow
Michael Fulton
3

sudomemberikan 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 kredensial yang di-cache pengguna. Akibatnya, sudo akan meminta kata sandi (jika diperlukan oleh kebijakan keamanan) dan tidak akan memperbarui kredensial yang di-cache pengguna.

Anda bisa menulis bungkus sederhana untuk sudopengujian rm -rf /*dan menjalankan

sudo -k rm -rf /*

sebagai gantinya, misal seperti ini:

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

Contoh penggunaan

Menguji dengan echo asini.

$ 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 kali Anda menjalankannya rmsecara umum, Anda dapat menyesuaikan fungsi di atas sebagai berikut:

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

Jika Anda ingin menggabungkan kedua panggilan perintah umum dan baris perintah tertentu yang saya sarankan gunakan 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 menjalankan sudodengan opsi - solusi yang mungkin adalah [[ "$*" =~ " rm " ]]memeriksa string "rm" yang dikelilingi oleh spasi atau *" rm "*)dengan casemenangkap baris perintah yang berisi "rm".

pencuci mulut
sumber
[[ "$1" == "rm" ]] && opt="-k";dan bagaimana /bin/rm?
Rinzwind
@Rinzwind Saya pikir fungsinya mudah beradaptasi dengan kebutuhan spesifik, terutama casependekatannya.
hidangan penutup
1

Jawaban ini tidak membahas sudobagian dari pertanyaan Anda, tetapi di sisi lain itu membahas cara untuk mengurangi bahaya rmpemanggilan yang tidak disengaja bagi setiap pengguna.

Anda bisa alias rmuntuk rm -Iyang

  • meminta konfirmasi segera setelah itu akan menghapus direktori atau lebih dari 3 file
  • selama Anda meninggalkan-f yang mengabaikan -Iopsi sebelumnya .

--one-file-systemadalah kemungkinan perlindungan lain terhadap penghapusan yang tidak diinginkan yang saya gunakan di rmalias saya .

Mempersiapkan

Untuk membuat alias seperti itu gunakan perintah:

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

Anda dapat memasukkannya ke ~/.bashrcatau bahkan Anda /etc/bash.bashrc.

Pemakaian

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

Untuk mengonfirmasi jenis yesatau terjemahannya ke lokal Anda atau huruf pertama dari salah satu kata dan tekan Enter. Input lain apa pun termasuk tidak ada yang membatalkan operasi.

David Foerster
sumber