Misalnya saya punya Ubuntu server dengan hostname ubuntu1204
. Lalu saya buat user baru dengan nama sysadmin
.
root@ubuntu1204:~# useradd -m -d /home/sysadmin -s /bin/bash sysadmin root@ubuntu1204:~# passwd sysadmin Enter new UNIX password: Retype new UNIX password: passwd: password updated successfully root@ubuntu1204:~#
Ketika saya coba login dengan user sysadmin
ternyata saya tidak bisa menggunakan perintah reboot
untuk merestart servernya :
ttirtawi@macmini:~$ ssh sysadmin@192.168.10.100 sysadmin@192.168.10.100's password: Last login: Thu Jan 2 00:15:34 2014 from macmini.local sysadmin@ubuntu1204:~$ /sbin/reboot reboot: Need to be root sysadmin@ubuntu1204:~$
Saya ingin memberi akses untuk user sysadmin
kemampuan untuk merestart server. Untuk menjawab kebutuhan ini kita perlu sedikit mengenal tentang yang namanya sudo
.
Akses kontrol di Ubuntu Linux diatur oleh perintah sudo
. sudo
dikenal sebagai akronim dari Super User Do. User yang diberi hak menggunakan perintah sudo
bisa menjalankan perintah-perintah yang tadinya hanya bisa dijalankan oleh user root
. Di Ubuntu Linux, root
tidak bisa login secara langsung. Beda dengan distro Linux lainnya seperti Debian atau RedHat/CentOS, saat instalasi Ubuntu kita tidak diminta untuk memberi password pada akun root
. Alih-alih hanya 1 user yang didefinisikan saat proses instalasi. User pertama ini langsung diberi akses penuh untuk menggunakan sudo
. Misalnya seperti contoh di bawah ini, user ttirtawi
tidak bisa login sebagai root
menggunakan perintah su - root
.
ttirtawi@ubuntu1204:~$ su - root Password: su: Authentication failure ttirtawi@ubuntu1204:~$ sudo bash [sudo] password for ttirtawi: root@ubuntu1204:~#
Untuk mengakses root
prompt digunakan perintah sudo bash
. Uniknya sudo
ini kita tidak perlu lagi repot-repot mendistribusikan password root
. User yang diberi akses sudo
cukup menggunakan password-nya sendiri.
Bila user biasa yang tidak punya akses sudo
mencoba menggunakan perintah sudo
akan muncul error seperti berikut ini :
faultmgmt@ubuntu1204:~$ sudo bash [sudo] password for faultmgmt: faultmgmt is not in the sudoers file. This incident will be reported. faultmgmt@ubuntu1204:~$
Semua percobaan akses sudo
yang gagal tadi akan disimpan dalam file /var/log/auth.log
root@ubuntu1204:~# tail -f /var/log/auth.log | grep "NOT in sudoers" Jan 2 08:36:27 ubuntu1204 sudo: faultmgmt : user NOT in sudoers ; TTY=pts/2 ; PWD=/home/faultmgmt ; USER=root ; COMMAND=/bin/bash ^C root@ubuntu1204:~#
Semua hal berkaitan dengan pengaturan sudo
disimpan dalam file /etc/sudoers
. Sangat disarankan untuk tidak mengubah file /etc/sudoers
secara langsung (dengan teks editor misalnya). Sebaiknya kita menggunakan perintah visudo
untuk mengedit file /etc/sudoers
. Perintah visudo
secara default menggunakan editor nano
. Meski menggunakan editor nano
, visudo
dilengkapi beberapa fungsi internal yang memastikan tidak ada kesalahan sintaks/format.
root@ubuntu1204:~# visudo
Ini contoh tampilan nano
yang dipakai oleh perintah visudo
:
Penjaminan akses sudo
bisa dilakukan pada level user atau group. Default-nya Ubuntu Linux menggunakan limitasi berbasis group untuk mengatur siapa-siapa yang bisa menggunakan sudo
. Ada satu group khusus dengan nama sudo
:
root@ubuntu1204:~# grep %sudo /etc/sudoers %sudo ALL=(ALL:ALL) ALL root@ubuntu1204:~#
Pengaturan akses group ditandai dengan tanda %
. Contoh di atas bisa dibaca sebagai berikut : semua user yang berada dalam group sudo
bisa mengakses semua perintah root
, tidak peduli dari mana dia mengakses mesin ini (akses remote dari komputer lain pun dibolehkan menggunakan sudo
).
User pertama yang dibuat saat instalasi, masuk dalam group sudo
:
root@ubuntu1204:~# grep sudo /etc/group sudo:x:27:ttirtawi root@ubuntu1204:~#
Artinya saya bisa menjalankan semua perintah sebagai root
, misalnya saya bisa jalankan perintah ini :
sudo reboot
sudo aptitude install ...
sudo route add ...
sudo shutdown -h now
sudo mkfs.ext3 /dev/sda3
- dsb
Balik lagi ke permasalahan di awal, bagaimana memberi akses pada perintah reboot
saja pada user biasa (sysadmin
)? Bisakah saya melakukannya hanya dengan memasukkan user sysadmin
ke dalam group sudo
? Tentu bisa, tapi dengan begitu user sysadmin
akan bisa juga mengganti pengaturan IP, mengganti static routing, memformat harddisk, dsb.
Yang lebih tepat adalah dengan memberi akses pada perintah /sbin/reboot
saja untuk user sysadmin
. Dengan menggunakan perintah visudo
saya menambahkan dua baris berikut ini ke dalam file /etc/sudoers
:
Cmnd_Alias RESTART=/sbin/reboot sysadmin ALL=(ALL) NOPASSWD: RESTART
Pertama saya membuat alias untuk perintah /sbin/reboot
, aliasnya saya beri nama RESTART
. Lalu saya beri akses kepada user sysadmin
untuk menggunakan alias RESTART
tadi. Opsi NOPASSWD:
artinya user tidak perlu lagi memasukkan password
saat mengeksekusi perintah sudo
.
Berikut ini adalah salah satu contoh hasil akhir /etc/sudoers
setelah saya menambahkan 2 baris baru tadi :
root@ubuntu1204:~# cat /etc/sudoers # # This file MUST be edited with the 'visudo' command as root. # # Please consider adding local content in /etc/sudoers.d/ instead of # directly modifying this file. # # See the man page for details on how to write a sudoers file. # Defaults env_reset Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" # Host alias specification # User alias specification # Cmnd alias specification Cmnd_Alias RESTART=/sbin/reboot # User privilege specification root ALL=(ALL:ALL) ALL # Members of the admin group may gain root privileges %admin ALL=(ALL) ALL # Allow members of group sudo to execute any command %sudo ALL=(ALL:ALL) ALL # See sudoers(5) for more information on "#include" directives: #includedir /etc/sudoers.d sysadmin ALL=(ALL) NOPASSWD: RESTART root@ubuntu1204:~#
Dengan begitu user sysadmin
sekarang bisa merestart server dengan tambahan perintah sudo
.
ttirtawi@macmini:~$ ssh sysadmin@192.168.10.100 sysadmin@192.168.10.100's password: Last login: Thu Jan 2 00:19:34 2014 from macmini.local sysadmin@ubuntu1204:~$ sudo reboot sysadmin@ubuntu1204:~$ Broadcast message from ttirtawi@ubuntu1204 (/dev/pts/2) at 0:11 ... The system is going down for reboot NOW! Connection to 192.168.10.100 closed by remote host. Connection to 192.168.10.100 closed. ttirtawi@macmini:~$
Bila banyak user dengan kebutuhan akses sudo
yang sama, lebih efisien menggunakan akses group seperti ini :
Cmnd_Alias RESTART=/sbin/reboot %sysadmin ALL=(ALL) NOPASSWD: RESTART
Saya tinggal memasukkan setiap user yang perlu hak merestart server ke dalam group sysadmin
. Misalnya seperti berikut ini :
root@ubuntu1204:~# useradd -G sysadmin -m -d /home/budi -s /bin/bash budi root@ubuntu1204:~# passwd budi Enter new UNIX password: Retype new UNIX password: passwd: password updated successfully root@ubuntu1204:~# su - budi budi@ubuntu1204:~$ budi@ubuntu1204:~$ reboot Command 'reboot' is available in '/sbin/reboot' The command could not be located because '/sbin' is not included in the PATH environment variable. This is most likely caused by the lack of administrative privileges associated with your user account. reboot: command not found budi@ubuntu1204:~$ budi@ubuntu1204:~$ /sbin/reboot reboot: Need to be root budi@ubuntu1204:~$ budi@ubuntu1204:~$ sudo /sbin/reboot budi@ubuntu1204:~$ Broadcast message from ttirtawi@ubuntu1204 (/dev/pts/2) at 9:07 ... The system is going down for reboot NOW! Connection to 192.168.10.100 closed by remote host. Connection to 192.168.10.100 closed. ttirtawi@macmini:~$
Saya membuat user baru dengan nama budi
. User budi
saya masukkan ke dalam group sysadmin
. Oleh karenanya budi
dapat merestart server dengan sudo reboot
atau sudo /sbin/reboot
.
Begitu kira-kira caranya mengatur akses pada perintah-perintah “penting” dengan menggunakan sudo
.