sudo

Eskalasi hak istimewa yang terkendali dan filosofi berkas sudoers.

Daftar isi

Perintah sudo menjalankan satu perintah dengan identitas pengguna lain, lazimnya root, setelah kebijakan pemberian izinnya diperiksa. Mekanisme inilah yang membuat pekerjaan administratif tetap bisa dilakukan tanpa berganti akun secara penuh. Topik ini membahas alasan desainnya, cara kerja autentikasi dan pencatatannya, struktur berkas kebijakan sudoers beserta peralatan penyuntingannya, cara memberi hak sudo kepada pengguna, dan ragam pemakaiannya di terminal. Setelah menyelesaikannya, setiap baris konfigurasi sudoers dapat dibaca dan ditafsirkan, serta keputusan tentang kapan sudo dipakai dapat diambil dengan dasar yang jelas.

Mengapa sudo dipakai alih-alih login root#

Akun root memegang UID 0, dan kernel membebaskan UID 0 dari pemeriksaan izin berkas biasa. Identitas tersebut dapat dilihat langsung dengan id.

bash
# akun root menurut sistem
id root
text Keluaran
uid=0(root) gid=0(root) groups=0(root)

Bekerja terus-menerus sebagai root berarti setiap kesalahan ketik berakibat penuh, misalnya rm yang salah jalur menghapus berkas sistem tanpa peringatan apa pun. Selain itu, sesi root tidak mencatat siapa manusia di baliknya, sehingga jejak audit (audit trail) hilang ketika lebih dari satu administrator memakai mesin yang sama. Dengan sudo, sesi harian tetap berjalan sebagai pengguna biasa. Hanya perintah tertentu yang berjalan sebagai root, dan perintah tersebut tercatat atas nama pengguna yang menjalankannya. Pencatatan itu ditulis ke log sistem melalui journald atau syslog, sehingga pertanyaan siapa mengubah apa dan kapan dapat dijawab dari log, bukan dari ingatan.

Ubuntu dan Debian memperkuat pola ini secara bawaan. Kata sandi root dikunci, sehingga login langsung sebagai root tidak dapat dilakukan, dan seluruh pekerjaan administratif diarahkan melalui sudo.

Cara kerja sudo#

Ketika sebuah perintah dijalankan dengan sudo, terjadi empat langkah berurutan. Pertama, sudo membaca kebijakannya dari berkas sudoers untuk memeriksa apakah pengguna tersebut boleh menjalankan perintah itu dengan identitas yang diminta. Kedua, pengguna diminta memasukkan kata sandinya sendiri, bukan kata sandi root, sehingga tidak ada rahasia bersama yang dibagikan antaradministrator. Ketiga, keberhasilan autentikasi disimpan dalam cache selama waktu singkat, biasanya sekitar 15 menit, sehingga beberapa perintah berurutan hanya meminta kata sandi sekali. Keempat, perintah dijalankan dengan identitas tujuan dan kejadian itu dicatat dalam log. Cache tersebut berlaku per terminal, dan bila mesin ditinggalkan, opsi sudo -k menghapusnya sehingga perintah berikutnya meminta kata sandi lagi.

bash
# tidak-dijalankan
# sudo meminta kata sandi pengguna sendiri lalu menjalankan perintah sebagai root
sudo apt update

Konsekuensi kegagalannya juga terdefinisi rapi. Pengguna yang tidak tercantum dalam kebijakan menerima pesan User is not in the sudoers file, dan percobaan itu tetap tercatat. Perilaku yang sama berlaku untuk sesi sandbox ini, yaitu pengguna z yang tidak terdaftar dalam kebijakan sudo sehingga setiap perintah sudo ditolak.

Berkas sudoers dan visudo#

Kebijakan sudo disimpan dalam /etc/sudoers, ditambah berkas potongan di dalam /etc/sudoers.d. Berkas ini dimiliki root dengan mode 440, sehingga pengguna biasa bahkan tidak dapat membacanya.

bash
# izin berkas kebijakan sudo beserta foldernya
stat -c '%A %a %U:%G %n' /etc/sudoers /etc/sudoers.d
text Keluaran
-r--r----- 440 root:root /etc/sudoers
drwxr-xr-x 755 root:root /etc/sudoers.d

Setiap baris kebijakan menetapkan siapa boleh menjalankan apa, di host mana, dengan identitas siapa. Contoh berikut memperlihatkan dua bentuk yang paling umum dijumpai.

text Contoh: baris kebijakan pada /etc/sudoers.d/demo
# grup sudo memperoleh hak root penuh
%sudo   ALL=(ALL:ALL) ALL

# budi hanya boleh memperbarui paket tanpa kata sandi
budi    ALL=(root) NOPASSWD: /usr/bin/apt update, /usr/bin/apt upgrade

Kolom pertama menyebut pengguna, atau grup bila diawali %. Bagian ALL=(ALL:ALL) ALL berarti anggota grup sudo boleh menjalankan semua perintah pada semua host, sebagai pengguna dan grup mana pun. Baris untuk budi membatasi perintahnya secara eksplisit, dan opsi NOPASSWD menghilangkan permintaan kata sandi untuk perintah tersebut saja.

bash
# tidak-dijalankan
# visudo memeriksa sintaks sebelum berkas kebijakan dipasang
sudo visudo -f /etc/sudoers.d/demo

Pemecahan kebijakan ke dalam /etc/sudoers.d menjaga berkas utama tetap bawaan distro, sehingga pembaruan sistem tidak bertabrakan dengan kebijakan lokal. Satu berkas potongan untuk satu tujuan membuat penonaktifan aturan cukup dilakukan dengan menghapus berkasnya.

Memberi hak sudo kepada pengguna#

Pada Ubuntu dan Debian, delegasi hak root penuh dilakukan melalui keanggotaan grup sudo, karena baris %sudo dalam kebijakan bawaan merujuk pada grup tersebut. Menambahkan pengguna ke grup sudo jauh lebih aman daripada menambah aturan per pengguna pada berkas kebijakan, sebab keanggotaan grup mudah dicabut kembali.

bash
# grup sudo dan keanggotaannya pada sistem latihan ini
grep '^sudo:' /etc/group
# pengguna z tidak termasuk anggota grup sudo
id
text Keluaran
sudo:x:27:
uid=1001(z) gid=1001(z) groups=1001(z)

Grup sudo ada dengan GID 27, tetapi kolom anggotanya kosong, dan id mengonfirmasi bahwa pengguna z tidak termasuk di dalamnya. Inilah sebabnya setiap perintah sudo pada sandbox ini ditolak.

bash
# tidak-dijalankan
# menambahkan budi ke grup sudo membutuhkan hak root
sudo usermod -aG sudo budi

Opsi -a pada -aG menambahkan keanggotaan baru tanpa menghapus keanggotaan grup lain. Tanpa -a, opsi -G mengganti seluruh daftar grup pelengkap dengan nilai yang ditulis, sehingga keanggotaan lama yang tidak ikut disebut justru terhapus. Perubahan keanggotaan baru berlaku setelah pengguna masuk kembali, karena daftar grup dibaca saat sesi dibuat. Pencabutan haknya sama sederhananya, yaitu mengeluarkan pengguna dari grup tersebut dengan gpasswd -d atau deluser, dan kebijakan bawaan tidak perlu disentuh sama sekali. Status keanggotaan kapan pun dapat diperiksa dengan id nama-pengguna sebelum menyimpulkan konfigurasinya.

sudo command, sudo -s, dan sudo -i#

Tiga bentuk pemakaian sudo yang paling sering dijumpai memiliki cakupan yang berbeda. Bentuk sudo perintah mengangkat satu perintah saja, sehingga perintah berikutnya kembali berjalan sebagai pengguna biasa. Bentuk inilah yang menjadi kebiasaan kerja harian yang disarankan.

Bentuk sudo -i membuka shell login penuh sebagai root, dengan lingkungan dan direktori kerja milik root. Bentuk ini cocok untuk rangkaian administrasi yang panjang, misalnya menyunting beberapa berkas konfigurasi sistem sekaligus. Bentuk sudo -s juga membuka shell root, tetapi shell tersebut mewarisi lingkungan sesi sekarang, sehingga variabel seperti PATH tetap milik pengguna.

bash
# tidak-dijalankan
# sesi kerja penuh sebagai root dengan lingkungan login root
sudo -i
# kembali ke sesi pengguna biasa
exit

Semakin lama sebuah sesi berjalan sebagai root, semakin besar kesempatan kesalahan ketik menjadi kecelakaan. Prinsip yang dipegang dokumentasi resmi adalah mengangkat hak selama yang diperlukan saja, kemudian kembali. Untuk kebutuhan khusus menyunting berkas milik root, dokumentasi sudo merekomendasikan sudoedit alih-alih membuka editor sebagai root, karena editor berjalan sebagai pengguna biasa dan hanya berkas tujuan yang ditulis dengan hak terangkat.

Kesalahan umum#

  • Menyunting /etc/sudoers dengan editor teks biasa. Kesalahan sintaks yang tersimpan langsung dapat menutup akses root bagi semua orang. Gunakan visudo yang memeriksa berkas sebelum memasangnya.
  • Membayangkan pengalihan keluaran ikut terangkat oleh sudo. Perintah sudo perintah > berkas-root menjalankan pengalihan sebagai pengguna biasa, sehingga tetap ditolak. Bentuk yang benar adalah sudo sh -c 'perintah > berkas'.
  • Mengira keanggotaan grup sudo berlaku seketika. Daftar grup sesi dibaca saat login, sehingga pengguna yang baru ditambahkan masih ditolak sampai masuk kembali. Periksa dengan id sebelum menyimpulkan ada kesalahan konfigurasi.
  • Memakai sudo untuk setiap perintah dari kebiasaan. Hak istimewa yang diangkat tanpa keperluan akan memperbesar cakupan kerusakan bila perintahnya salah, dan menutupi penyebab error yang sebenarnya berupa masalah izin biasa.
  • Menebak bahwa kata sandi yang diminta sudo adalah kata sandi root. Yang diminta adalah kata sandi pengguna yang sedang menjalankan sudo, dan pada mesin dengan kata sandi root yang dikunci seperti Ubuntu, kata sandi root memang tidak tersedia untuk login.

Ringkasan#

  • sudo menjalankan perintah dengan identitas lain setelah memeriksa kebijakan di /etc/sudoers dan /etc/sudoers.d, mengautentikasi dengan kata sandi pengguna sendiri, dan mencatat kejadian tersebut dalam log.
  • Berkas kebijakan dimiliki root dengan mode 440, dan penyuntingannya hanya sah melalui visudo karena alat itu memeriksa sintaks sebelum berkas dipasang.
  • Ubuntu mendelegasikan hak root penuh melalui keanggotaan grup sudo, yang berlaku pada sesi berikutnya, sedangkan baris kebijakan dapat membatasi perintah secara eksplisit.
  • sudo perintah mengangkat satu perintah, sudo -i membuka sesi root penuh, dan hak istimewa sebaiknya diangkat selama yang diperlukan saja.

Referensi#