Karena sudo
memungkinkan kontrol yang jauh lebih halus daripada "masuk sebagai root lalu lakukan apa pun yang Anda inginkan." Misalnya Anda dapat mengonfigurasi sudo
sehingga beberapa pengguna hanya diperbolehkan menjalankan perintah tertentu (seperti skrip pembungkus atau binari yang "dapat diterima"). Anda khawatir tentang trojan horse yang membahayakan komputer satu pengguna, tetapi sudo
dibuat untuk mengizinkan logging dan kontrol akses pada server yang dikelola oleh banyak orang.
Tentu saja pada sistem pengguna tunggal, file penting adalah file pengguna, dan begitu Anda mendapatkan akses ke akun pengguna, Anda sudah memiliki akses ke file tersebut , jadi mendapatkan kata sandi tidak lagi penting. Bahkan jika kata sandi adalah tujuan Anda (katakanlah, Anda menyerang seseorang yang menggunakan kembali kata sandi) ada banyak cara untuk mendapatkannya tanpa melibatkan sudo
; misalnya, baru-baru ini saya menemukan 2 program yang terinstal secara default yang akan mencatat kata sandi atau kesalahan kata sandi dalam teks biasa.
Dan terakhir, disarankan untuk tidak menjalankan sebagai root bila memungkinkan karena konsekuensi dari salah ketik perintah (rm_-rf_._/
adalah contoh yang jelas) tidak separah itu. Membutuhkan langkah tambahan untuk menulis sudo
di awal perintah sebagai kebalikan dari "melupakan Anda masuk sebagai root dan melakukan sesuatu yang merusak" dapat menghindari beberapa kesalahan sederhana namun serius.
Ada penggunaan kenyamanan yang valid untuk sudo, tetapi karena sudah dijelaskan secara memadai di posting lain, saya tidak akan menjelaskannya terlalu banyak di sini. Namun saya akan mengarahkan Anda ke sudoers(5)
, yang merupakan file konfigurasi sudo. Ini menunjukkan beberapa kemungkinan konfigurasi ekstensif dengan sudo. Saya akan menjelaskan kapan dan mengapa Anda sebaiknya tidak menggunakan sudo untuk meningkatkan dari pengguna normal Anda ke root semata-mata karena alasan keamanan, selain kenyamanan.
Jawaban singkat: Tidak ada cara untuk menggunakan sudo dengan aman jika pengguna biasa Anda mungkin disusupi. Gunakan hanya untuk kenyamanan, bukan untuk keamanan. Hal yang sama berlaku untuk su dan semua program lain yang dapat digunakan untuk meningkatkan pengguna reguler Anda menjadi lebih istimewa.
Jawaban panjang: Tidak benar bahwa menggunakan jalur lengkap untuk sudo akan melindungi Anda dari lingkungan yang berbahaya. Itu adalah kesalahpahaman umum. Fungsi bash bahkan dapat membajak nama yang berisi /
pada awalnya. Coba jalankan yang berikut ini:
$ echo $SHELL
/bin/bash
$ function /usr/bin/sudo { echo "Trust me, now put in your password:"; }
$ /usr/bin/sudo id
Trust me, now put in your password:
Anda harus hanya gunakan opsi 1, alias masuk dengan agetty atau masuk pada tty yang berbeda (perhatikan bahwa pada beberapa distro, tty1 adalah tempat Xorg berjalan, seperti Fedora. Namun pada sebagian besar distro, tty1 adalah tty cadangan dan Xorg berjalan pada tty7) . Namun , Anda harus mengetahui bahwa malware dapat membajak ctrl +alt +f1 dan memberi Anda layar palsu, jadi Anda harus menggunakan kombinasi Secure Attention Key (SAK, yaitu alt +sysrq +k pada sistem Linux), yang mematikan semua proses dalam tty itu. Ini membunuh semua layar login palsu dan hanya membawa Anda ke yang asli. Jika tidak ada layar login palsu yang mencoba mencuri kata sandi root Anda (yang diharapkan demikian), maka itu hanya menyebabkan agetty untuk memulai ulang, yang seharusnya muncul tidak lebih dari prompt login yang berkedip. Pada beberapa sistem, banyak fitur SysRq yang dinonaktifkan, termasuk SAK. Anda dapat mengaktifkan semuanya untuk sementara dengan menulis bilangan bulat 1 ke /proc/sys/kernel/sysrq
. Nilai /proc/sys/kernel/sysrq
adalah bitmap, jadi lihat seperti apa saat ini dan hitung apa yang Anda perlukan untuk mengubahnya menjadi untuk menambahkan dukungan SAK sebelum menjadikannya permanen di /etc/sysctl.conf
. Menyetelnya ke 1 selamanya bisa menjadi ide yang buruk (Anda tidak ingin sembarang orang dapat alt +sysrq +e untuk membunuh xscreensaver, bukan?).
Gagasan bahwa Anda dapat melindungi pengguna biasa dan menggunakan sudo atau su dengan aman adalah gagasan yang sangat berbahaya. Bahkan jika memungkinkan, ada banyak cara untuk membajak sesi lari Anda, seperti LD_PRELOAD
, yang merupakan variabel lingkungan yang menunjuk ke objek (perpustakaan) bersama yang akan dimuat secara paksa oleh program untuk mengubah perilakunya. Meskipun tidak bekerja pada program setuid seperti su dan sudo, ia bekerja pada bash dan semua shell lainnya, yang mengeksekusi su dan sudo, dan yang melihat semua penekanan tombol Anda. LD_PRELOAD
bukan satu-satunya variabel yang dapat membajak program yang berjalan sebagai pengguna Anda. LD_LIBRARY_PATH
dapat memberi tahu program untuk menggunakan pustaka berbahaya alih-alih pustaka sistem Anda. Masih banyak lagi variabel lingkungan yang dapat digunakan untuk mengubah perilaku menjalankan program dengan berbagai cara. Pada dasarnya, jika variabel lingkungan Anda dapat disusupi, pengguna Anda, dan semua penekanan tombol yang dimasukkan sebagai pengguna tersebut, dapat disusupi.
Jika itu belum cukup, pada sebagian besar distro, pengguna Anda dapat menggunakan ptrace()
dengan GETREGS
atau PEEKTEXT/PEEKDATA
opsi untuk melihat semua memori proses yang berjalan sebagai pengguna yang sama (seperti proses bash yang menjalankan su atau sudo untuk Anda). Jika Anda menggunakan distro yang menonaktifkannya (misalnya dengan menggunakan Yama LSM), prosesnya mungkin masih dapat membaca dan menulis ke memori proses bash Anda menggunakan process_vm_readv()
dan process_vm_writev()
masing-masing. Pada beberapa kernel, Anda juga dapat menulis langsung ke memori melalui /proc/pid/mem
, selama proses penulisannya adalah pengguna yang sama. Di kernel Linux, ada pemeriksaan keamanan yang tak terhitung jumlahnya di mana-mana untuk memastikan proses tidak saling mengganggu. Namun, semuanya melibatkan inter -perlindungan pengguna, bukan intra -perlindungan pengguna. Kernel Linux berasumsi bahwa setiap hal yang dilakukan sebagai pengguna A dipercaya oleh pengguna A, jadi jika Anda ingin melakukan root sebagai pengguna A, root harus sama tepercayanya dengan pengguna tersebut.
Bahkan sebelum saya melanjutkan ke Xorg, izinkan saya memulai dengan mengatakan bahwa Xorg tidak memberikan perlindungan dari keyloggers. Ini berarti, jika Anda menggunakan sudo atau su dalam tty dengan Xorg berjalan, semua proses yang berjalan sebagai pengguna yang sama akan dapat mengendus (dan menginjeksi) penekanan tombol. Ini karena model keamanan protokol X11 mengasumsikan bahwa apa pun yang memiliki akses ke cookie X11 dapat dipercaya, dan cookie tersebut dapat diakses oleh semua yang berjalan di bawah pengguna Anda. Ini adalah batasan mendasar dari protokol X11, tertanam sedalam konsep UID di Linux. Tidak ada pengaturan atau fitur untuk menonaktifkan ini. Ini berarti bahwa apa pun yang Anda ketikkan dalam sesi Xorg, termasuk yang diketik ke dalam su atau sudo (atau frontend seperti gksu, gksudo, kdesu, kdesudo, pinentry, dll) dapat diendus oleh apa pun yang berjalan sebagai pengguna yang sama, jadi browser Anda, game Anda , pemutar video Anda, dan tentu saja semuanya bercabang dengan .bashrc Anda. Anda dapat mengujinya sendiri dengan menjalankan perintah berikut di satu terminal, lalu pindah ke terminal lain dan menjalankan perintah dengan sudo.
$ xinput list
Virtual core pointer id=2 [master pointer (3)]
↳ Virtual core XTEST pointer id=4 [slave pointer (2)]
↳ ETPS/2 Elantech Touchpad id=13 [slave pointer (2)]
Virtual core keyboard id=3 [master keyboard (2)]
↳ Virtual core XTEST keyboard id=5 [slave keyboard (3)]
↳ Power Button id=8 [slave keyboard (3)]
↳ USB Camera id=10 [slave keyboard (3)]
↳ AT Translated Set 2 keyboard id=12 [slave keyboard (3)]
↳ Video Bus id=7 [slave keyboard (3)]
↳ Sleep Button id=9 [slave keyboard (3)]
↳ Asus WMI hotkeys id=11 [slave keyboard (3)]
↳ Power Button id=6 [slave keyboard (3)]
$ xinput test 12 # replace 12 with the id number of your keyboard
key press 45
key press 44
key release 40
key press 41
key release 45
key release 44
key release 41
key press 31
^C
Perhatikan bahwa jika pengujian khusus ini tidak berhasil untuk Anda, berarti Anda tidak memiliki XTEST
ekstensi aktif. Bahkan tanpa mengaktifkannya, aktivitas keyboard masih dapat direkam menggunakan XQueryKeymap()
. Pelajaran yang harus Anda ambil adalah bahwa secara efektif tidak mungkin untuk memasukkan kata sandi Anda dengan aman menggunakan su atau sudo melalui pengguna yang disusupi. Anda benar-benar harus beralih ke tty baru dan menggunakan SAK, lalu masuk langsung sebagai root.
Selain yang disebutkan oleh pengguna lain, sudo juga menyimpan identitas asli pengguna yang menjalankan perintah. Artinya Anda dapat melacak apa yang dilakukan userid perintah. Jika Anda menggunakan root di lingkungan multipengguna, Anda tidak akan dapat melacak eksekusi perintah ke satu pengguna karena uid akan menjadi 0.