Setelah memahami permission & ownership, kini saatnya mempelajari hak akses administrator: mengapa login sebagai root itu berbahaya, perbedaan su - dan sudo, cara mengelola /etc/sudoers dengan visudo, hingga memberikan hak sudo dan NOPASSWD untuk otomatisasi dengan aman.

Setelah di episode 9 sebelumnya kita membahas file permissions & ownership — bit-bit rwx, chmod 755 vs chmod 600, chown, hingga SUID/SGID dan sticky bit di /tmp — kalian sekarang sudah paham bahwa Linux mengatur siapa yang boleh membaca, menulis, dan mengeksekusi setiap file. Namun ada satu pertanyaan besar yang menggantung: bagaimana caranya mengubah konfigurasi sistem, menginstall package, atau memanage service ketika semua file penting itu dimiliki root?
Jawabannya bukan dengan login sebagai root sepanjang waktu, melainkan dengan prinsip privilege escalation yang terkontrol: sudo. Pada episode kali ini, kita akan membedah mengapa menggunakan root secara langsung itu berbahaya, apa bedanya su - dan sudo, bagaimana struktur konfigurasi sudoers bekerja, serta bagaimana cara memberikan — dan mencabut — hak administratif kepada user dengan aman. Topik ini bukan sekadar teori; kesalahan kecil di sini bisa mengunci kalian keluar dari server sendiri. Mari kita mulai.
Bayangkan kalian mengemudikan truk pengangkut barang tanpa rem. Setiap perintah yang kalian jalankan berjalan dengan kekuasaan penuh tanpa ada konfirmasi, tanpa ada batas, dan tanpa ada jejak siapa yang melakukan apa. Itulah kira-kira pengalaman login langsung sebagai root: satu typo seperti rm -rf /var alih-alih rm -rf /var/tmp langsung menghancurkan sistem, tanpa ada yang menahan.
Ada tiga alasan teknis mengapa login sebagai root itu bahaya besar:
root, exploit di program itu otomatis memberi attacker akses penuh ke seluruh mesin. Sebaliknya, program yang berjalan sebagai user biasa hanya bisa merusak file milik user tersebut.sudo, setiap perintah yang dijalankan dicatat ke file log seperti /var/log/auth.log. Kalau sistem kalian diretas, log inilah yang menjadi barang bukti pertama. Login langsung sebagai root hampir tidak meninggalkan jejak yang bisa dihubungkan ke individu.sudo di depan perintah berbahaya memberikan "detik refleksi" — kesempatan untuk berpikir dua kali sebelum menekan Enter.Warning
Jangan pernah menjalankan aplikasi sehari-hari sebagai root — termasuk browser, editor, atau server dev. Di produksi, best practice-nya adalah mematikan PermitRootLogin di SSH dan login sebagai user biasa terlebih dahulu. Bahkan kalau kalian punya VPS pribadi, biasakan diri dengan prinsip least privilege sejak awal; ini akan menyelamatkan kalian saat menangani server milik orang lain.
Prinsip ini dikenal dengan istilah least privilege: setiap user (termasuk aplikasi) sebaiknya memiliki hak akses seminimal mungkin yang dibutuhkan untuk menjalankan tugasnya. Sudo adalah implementasi paling umum dari prinsip ini di Linux.
su - vs sudo: Dua Cara, Dua Filosofi BerbedaBanyak pemula mengira su dan sudo itu sama. Faktanya, keduanya adalah filosofi yang bertolak belakang.
su - (switch user) mengganti identitas kalian secara utuh. su - tanpa argumen berarti "pindah ke user root dengan environment yang lengkap" (tanda - membuat shell root login-like, lengkap dengan PATH dan environment variabel root). Setelah menjalankannya, setiap perintah berikutnya berjalan sebagai root sampai kalian mengetik exit. Ini seperti memberikan kunci master seluruh gedung kepada seseorang dan membiarkannya mondar-mandir.
sudo (superuser do) hanya mengeksekusi satu perintah spesifik dengan hak root, lalu kembali ke identitas semula. sudo apt update berarti "jalankan apt update sebagai root, hanya perintah ini". Kalian tetap login sebagai user biasa; tidak ada sesi root yang terbuka.
Mari lihat perbandingannya secara langsung:
# Dengan su -
$ whoami
arman
$ su -
Password:
# whoami
root
# exit
logout
$
# Dengan sudo — tetap user biasa, hanya perintahnya yang root
$ whoami
arman
$ sudo whoami
root
$ whoami
armanTip
Gunakan sudo untuk 95% kebutuhan harian. Simpan su - hanya untuk kasus emergency, misalnya saat sudo itu sendiri rusak atau file /etc/sudoers sedang bermasalah dan perlu diperbaiki dari root shell. Untuk lingkungan produksi, sangat disarankan sudo sebagai satu-satunya jalan — dan password root justru dikunci dengan passwd -l root agar tidak bisa dipakai login.
Perlu dicatat juga: su - membutuhkan password root, sedangkan sudo membutuhkan password user yang menjalankannya (password kalian sendiri). Ini perbedaan krusial — dengan sudo, password root tidak perlu pernah dibagikan ke siapa pun.
sudoersKetika kalian mengetik sudo <perintah>, sistem menanyakan: "User ini berhak mengeksekusi perintah sebagai root atau tidak?" Jawabannya ada di file konfigurasi bernama /etc/sudoers. File ini adalah satu-satunya sumber kebenaran untuk aturan sudo.
Struktur aturan dasar sudoers punya empat kolom: user/group yang diberi hak, host tempat aturan berlaku, user tujuan (run as), dan perintah yang boleh dijalankan. Contoh paling umum:
root ALL=(ALL:ALL) ALL
%sudo ALL=(ALL:ALL) ALL
%admin ALL=(ALL:ALL) ALLBacaan baris %sudo ALL=(ALL:ALL) ALL:
| Kolom | Isi | Arti |
|---|---|---|
%sudo | Nama group (awalan %) | Semua anggota group sudo |
ALL | Host | Berlaku di semua host (untuk mesin tunggal) |
(ALL:ALL) | Run as user:group | Boleh menjalankan sebagai user/group mana pun |
ALL | Perintah yang diizinkan | Boleh menjalankan perintah apa pun |
Perhatikan bahwa karakter % menandakan group. Tanpa %, itu dianggap nama user. Jadi sudo ALL=(ALL:ALL) ALL memberi hak penuh ke user bernama sudo, bukan group.
Satu hal penting: jangan pernah mengedit /etc/sudoers secara langsung dengan editor biasa. Alih-alih, gunakan visudo:
sudo visudovisudo melakukan dua hal vital: mengunci file agar tidak ada dua editor yang menimpanya, dan memvalidasi sintaks sebelum menyimpan. Kalau ada kesalahan sintaks, visudo menolak menyimpan dan memberi kesempatan memperbaikinya — inilah yang mencegah kalian mengunci diri dari akses sudo.
Direktori /etc/sudoers.d/ memungkinkan pemisahan aturan per-aplikasi atau per-user. File di direktori ini otomatis di-include oleh /etc/sudoers (baris #includedir /etc/sudoers.d), sehingga kalian bisa menaruh konfigurasi service tertentu tanpa mengotori file utama:
deploy ALL=(root) /usr/bin/systemctl restart nginx, \
/usr/bin/systemctl reload nginxImportant
Nama file di /etc/sudoers.d/ tidak boleh mengandung titik (.) atau tanda ~ — file dengan nama seperti backup.conf justru diabaikan oleh sudoers karena pola validasi default. Gunakan nama seperti deploy, backup, atau 90-nopasswd. Kalau aturan tidak kunjung berefek, cek dulu nama file-nya.
Cara terbaik memberikan akses administrator ke banyak orang bukan satu-per-satu per user, melainkan lewat group. Ini persis seperti badge akses kantor: daripada memberi kunci ke masing-masing karyawan lalu menariknya satu-satu saat mereka keluar, lebih mudah mengatur keanggotaan group. Di Debian/Ubuntu group-nya bernama sudo, di RHEL/Fedora bernama wheel.
Untuk menambahkan user ke group sudo, kita memakai usermod -aG (append ke group, jangan lupa -a!):
sudo usermod -aG sudo arman
# Verifikasi keanggotaan group
id armanSetelah perintah di atas, user arman bisa langsung menggunakan sudo — tetapi sesi login yang sedang berjalan belum mengenalinya. User harus logout lalu login ulang (atau menjalankan newgrp sudo) agar keanggotaan group-nya aktif di sesi tersebut.
Di RHEL family, perintahnya sama hanya nama group-nya wheel:
sudo usermod -aG wheel arman
id armanNote
Karena cara kerja ini berbasis group, mencabut akses semudah sudo gpasswd -d arman sudo (hapus dari group). Tidak perlu mengedit satu per satu baris sudoers per user — satu perubahan, langsung berlaku untuk semua anggota. Inilah alasan mengapa pemberian hak sudo per-user langsung umumnya dihindari di tim yang besar.
Kekurangan sudo adalah meminta password setiap kali. Untuk script otomatisasi (misal job backup yang berjalan tengah malam via cron, atau provisioning tool seperti Ansible), password interaktif tidak mungkin dimasukkan. Solusinya adalah opsi NOPASSWD — perintah tertentu boleh dijalankan tanpa password:
backup ALL=(root) NOPASSWD: /usr/local/bin/backup-db.shAturan di atas berbunyi: user backup boleh menjalankan /usr/local/bin/backup-db.sh sebagai root tanpa diminta password — dan hanya perintah itu. Ini adalah pola least privilege untuk otomatisasi yang benar.
Caution
Jangan pernah menulis NOPASSWD: ALL untuk user yang bukan dedicated service. Artinya: siapa pun yang berhasil masuk ke akun tersebut mendapat root penuh tanpa autentikasi. Kalau memang terpaksa memakai NOPASSWD, batasi ke perintah spesifik dan idealnya beri juga !/usr/bin/passwd dan larangan menjalankan shell seperti !/usr/bin/su, !/usr/bin/sudo agar haknya tidak bisa "dilebarkan" sendiri.
Perlu dipahami bahwa NOPASSWD membuat perintah tertentu menjadi pintu otomatisasi yang berharga — tetapi juga menjadi target. Sebuah script yang boleh dijalankan tanpa password harus diletakkan di path yang hanya bisa ditulis root, dan isinya harus di-review, karena eksekusi script itulah satu-satunya "kunci" yang dimiliki attacker potensial.
Mari kita rangkai semua konsep di atas dalam satu skenario nyata: kalian mengelola sebuah VPS, ingin memberi user baru reza akses administratif penuh, lalu membatasi agar user deploy hanya bisa mengedit file konfigurasi Nginx — bukan semua file.
# 1. Buat user reza dengan home dir & shell bash
sudo useradd -m -s /bin/bash reza
sudo passwd reza
# 2. Beri reza akses sudo penuh via group
sudo usermod -aG sudo reza
# 3. Buat aturan khusus untuk user deploy (hanya sudoedit Nginx)
sudo visudo -f /etc/sudoers.d/deploy-nginxIsi file /etc/sudoers.d/deploy-nginx:
deploy ALL=(root) sudoedit /etc/nginx/nginx.conf, \
/etc/nginx/sites-available/*Dengan aturan di atas, user deploy bisa menjalankan sudoedit /etc/nginx/nginx.conf untuk mengedit file Nginx melalui salinan sementara yang aman — namun tidak bisa memakai sudo cat untuk membaca, sudo rm untuk menghapus, atau sudo systemctl untuk me-restart service. Ketika perlu reload Nginx, mereka harus meminta admin. Inilah arti kontrol yang presisi.
Catatan penting soal sudoedit: berbeda dari sudo nano file, sudoedit selalu memvalidasi bahwa file yang diedit termasuk dalam daftar izin sebelum membuka editor — karena itu jauh lebih aman untuk dibagikan ke banyak user. sudo vim file tidak mengecek daftar izin dengan cara yang sama.
Untuk memverifikasi aturan berlaku, user yang bersangkutan bisa menjalankan sudo -l untuk melihat daftar hak mereka:
$ sudo -l
Matching Defaults entries for reza:
env_reset, mail_badpass, secure_path=...
User reza may run the following commands on this host:
(ALL : ALL) ALLKesalahan yang paling berbahaya di episode ini adalah mengedit /etc/sudoers dengan editor biasa tanpa visudo. Satu karakter salah — misalnya %sudo ALL=(ALL:ALL) ALL kehilangan salah satu ALL — membuat sintaks tidak valid. Karena sudo memvalidasi file ini setiap kali dijalankan, sistem akan menolak semua perintah sudo: kalian terkunci dari akses admin. Kalau file tersimpan sebelum validasi, inilah skenario "lockout" klasik.
Ada dua jalur pemulihan: dari konsol fisik/mesin virtual (masuk sebagai root via su - dari TTY), atau mem-boot dengan init=/bin/bash pada GRUB. Di lingkungan cloud, gunakan VNC console dari panel provider. Kunci dari pelajaran ini: selalu gunakan visudo, dan simpan file backup sebelum mengubah sudoers.
| Kesalahan | Gejala | Solusi |
|---|---|---|
Edit /etc/sudoers tanpa visudo | Sintaks rusak, semua sudo gagal, lockout | Boot recovery / konsol, perbaiki via su - |
Nama file di sudoers.d mengandung . | Aturan diabaikan tanpa pesan error | Rename tanpa titik, mis. deploy-nginx |
Lupa -a di usermod -G | User dikeluarkan dari semua group lain | Pakai usermod -aG (append) |
NOPASSWD: ALL untuk user biasa | Setiap sesi login = root penuh | Batasi ke perintah spesifik |
Menjalankan sudo saat bukan di sesi login | Password diminta berulang-ulang | Atur timestamp_timeout atau pakai sudo -v |
Ada juga trik kecil yang sering dipakai dan patut kalian pahami: sudo !!. Tanda !! adalah history expansion — Bash menggantinya dengan perintah terakhir. Jadi ketika kalian mengetik apt update lupa sudo dan kena permission denied, cukup ketik sudo !! untuk menjalankan ulang perintah terakhir dengan hak root. Efisien, tapi hati-hati: !! mengambil perintah terakhir di history, bukan "yang gagal" — kalau perintah terakhir sudah berganti, itu yang akan dieksekusi.
Pada episode 10 ini kita telah menutup lingkaran keamanan akses di Linux: memahami mengapa root yang tak terkontrol itu berbahaya, membedakan filosofi su - (ganti identitas penuh) vs sudo (eksekusi perintah spesifik), membaca dan mengelola /etc/sudoers dengan visudo, memberikan hak lewat group sudo/wheel, membatasi otomatisasi dengan NOPASSWD yang sempit, serta merangkai semuanya dalam praktik sudoedit yang presisi. Prinsip yang harus kalian bawa pulang: beri hak sesedikit mungkin, audit setiap perintah, dan jangan pernah menyentuh sudoers tanpa visudo.
Dengan hak admin yang sudah dimiliki, kini kalian siap melakukan hal paling mendasar seorang administrator: menginstal perangkat lunak. Di episode 11 selanjutnya kita akan membahas package management di berbagai distro — apt untuk Debian/Ubuntu, dnf untuk keluarga RHEL, pacman untuk Arch, plus format universal seperti snap, flatpak, dan AppImage. Di sanalah perbedaan "cara kalian mendapatkan software" antar distro akan benar-benar terasa. Sampai jumpa di episode berikutnya!