Sekilas Tentang SUDO

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 :

Visudo Dengan Editor NANO photo nano-visudo_zps7e2c2e15.jpg

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.

Selamat Tahun Baru 2014

Selamat Tahun Baru 2014 photo photo_2_zpsbf21d7f3.jpg

Sebelum terlambat saya ingin mengucapkan Selamat Tahun Baru 2014. Tahun 2013 berlalu begitu cepat, rasanya baru kemarin saya merefresh kembali blog ini. Tahun 2013 saya cuma bisa membuat posting sebanyak 191, itupun sebagian besar berupa foto. Sulit memang berkomitmen 1 posting per hari. Saya selalu salut pada orang-orang yang bisa rajin mengupdate blognya. Misalnya Pak Budi Rahardjo, saya kagum pada beliau meskipun sibuk bisa rajin sekali menulis di blognya. Saya perlu belajar banyak pada beliau,  kita lihat apakah tahun 2014 ini saya bisa lebih produktif menulis di blog ini.

Sekilas Tentang RBAC

Misalkan saya punya sebuah server dengan Solaris 11 sebagai sistem operasinya (hostname-nya oraclesolaris11). Pada sistem tadi saya punya user operator.

ttirtawi@macmini:~$ ssh operator@192.168.10.70
Password: 
Last login: Wed Jan  1 18:12:26 2014 from 192.168.10.13
Oracle Corporation      SunOS 5.11      11.1    September 2012
operator@oraclesolaris11:~$

Sebagai user biasa tentu operator tidak bisa merestart sistem :

ttirtawi@macmini:~$ ssh operator@192.168.10.70
Password: 
Last login: Wed Jan  1 18:12:26 2014 from 192.168.10.13
Oracle Corporation      SunOS 5.11      11.1    September 2012
operator@oraclesolaris11:~$ reboot
reboot: permission denied
operator@oraclesolaris11:~$

Ok tentu ini normal karena user operator adalah normal user bukan root user. Biasanya user bisa login sebagai root (selama tahu password root) untuk kemudian merestart sistem. Asumsi user operator tahu password root sistem ini :

operator@oraclesolaris11:~$ su - root
Password: 
Roles can only be assumed by authorized users
su: Sorry
operator@oraclesolaris11:~$

Upss ternyata di Solaris 11 user biasa tidak bisa login sebagai root. Tidak seperti Linux atau Solaris versi sebelumnya, root user di dalam Solaris 11 didefinisikan sebagai role, Sederhananya dalam Bahasa Indonesia kita bisa terjemahkan roles sebagai “peran”. Untuk bisa login sebagai root, user biasa perlu diberi “peran” sebagai root.

operator@oraclesolaris11:~$ roles
No roles
operator@oraclesolaris11:~$

Ok mari kita beri peran root kepada user operator. Saya punya user lain yaitu ttirtawi yang memiliki roles sebagai root.

ttirtawi@oraclesolaris11:~$ su - root
Password: 
Oracle Corporation      SunOS 5.11      11.1    September 2012
root@oraclesolaris11:~#
root@oraclesolaris11:~# usermod -R+"root" operator
UX: usermod: operator is currently logged in, some changes may not take effect until next login.
root@oraclesolaris11:~#

Setelah diberi roles, user operator perlu melakukan login ulang.

ttirtawi@macmini:~$ ssh operator@192.168.10.70
Password: 
Last login: Wed Jan  1 18:12:47 2014 from 192.168.10.13
Oracle Corporation      SunOS 5.11      11.1    September 2012
operator@oraclesolaris11:~$ roles
root
operator@oraclesolaris11:~$

Perintah roles berguna untuk melihat peran apa saja yang dimiliki oleh user. Karena sekarang user operator bisa berperan sebagai root, tentu mudah bagi user operator untuk merestart sistem :

operator@oraclesolaris11:~$ su - root
Password: 
Oracle Corporation      SunOS 5.11      11.1    September 2012
root@oraclesolaris11:~# reboot
Connection to 192.168.10.70 closed by remote host.
Connection to 192.168.10.70 closed.
ttirtawi@macmini:~$

Oh ya tadi lupa disebutkan tidak cukup diberi role sebagai root, user operator perlu tahu juga password root.

Tapi tentu ini cukup berbahaya karena sekarang user operator bisa melakukan segala hal yang tadinya hanya root yang bisa melakukan. operator sekarang memiliki akses yang berlebihan dari sekadar kebutuhan awalnya untuk merestart sistem.

Lalu pertanyaan selanjutnya bagaimana caranya memberi akses pada user biasa hanya untuk merestart sistem? Caranya dengan mendefinisikan sebuah role baru.

  • membuat role baru atau sederhananya membuat “peran” baru.
  • membuat profil untuk role tersebut.
  • mengisi profil tadi dengan perintah-perintah yang ingin diberikan
  • memberi kuasa pada user tertentu untuk bisa memainkan “peran” baru tadi.

Kita perlu membuat role baru lalu mendefinisikan profilenya supaya hanya bisa mengakses perintah reboot. Misalkan kita sebut peran baru ini sebagai restart

root@oraclesolaris11:~# roleadd -m -d /export/home/restart restart    
80 blocks
root@oraclesolaris11:~# 
root@oraclesolaris11:~# passwd restart
New Password: 
Re-enter new Password: 
passwd: password successfully changed for restart
root@oraclesolaris11:~#

Menambah role sama prinsipnya sama dengan menambah user biasa. Karena mirip seperti user biasa, maka role yang tadi sudah kita buat juga terdaftar pada file /etc/passwd & /etc/shadow :

root@oraclesolaris11:~# grep restart /etc/passwd 
restart:x:54325:10::/export/home/restart:/usr/bin/pfbash
root@oraclesolaris11:~# 
root@oraclesolaris11:~# grep restart /etc/shadow 
restart:$5$lRko9uVR$P7Z3KkcPPnKC19oNHH.TjMKI7aMiF55ZI4PNUi/scdB:16071::::::11376
root@oraclesolaris11:~#

Yang membedakan hanyalah kita tidak bisa login langsung sebagai role tersebut.

Setelah kita punya role baru, kita perlu membuat profil baru untuk role tersebut. Misalnya kita buat profil dengan nama RESTART :

root@oraclesolaris11:~# vi /etc/security/prof_attr
root@oraclesolaris11:~# 
#
# The system provided entries are stored in different files
# under "/etc/security/prof_attr.d".  They should not be
# copied to this file.
#
# Only local changes should be stored in this file.
# This line should be kept in this file or it will be overwritten.
#
RESTART:::profile untuk restart sistem:help=restart.html
root@oraclesolaris11:~#

Setelah kita punya profile RESTART tadi, lalu kita berikan profil tadi kepada role restart dengan menggunakan perintah rolemod seperti contoh berikut ini :

root@oraclesolaris11:~# rolemod -P+"RESTART" restart

Daftar profil yang sudah diberikan pada suatu role bisa dilihat pada file /etc/user_attr :

root@oraclesolaris11:~# grep restart /etc/user_attr 
restart::::type=role;profiles=RESTART;roleauth=role
root@oraclesolaris11:~#

Langkah selanjutnya kita harus mendefinisikan perintah apa saja yang bisa dijalankan oleh profil RESTART. Caranya adalah dengan menambah definisi baru pada file /etc/security/exec_attr (untuk restart sistem profil ini perlu diberi akses pada perintah reboot) :

root@oraclesolaris11:~# vi /etc/security/exec_attr
#
# The system provided entries are stored in different files
# under "/etc/security/exec_attr.d".  They should not be
# copied to this file.
#
# Only local changes should be stored in this file.
# This line should be kept in this file or it will be overwritten.
#
RESTART:suser:cmd:::/usr/sbin/reboot:euid=0
root@oraclesolaris11:~#

Sampai di sini role baru kita tadi sudah bisa melakukan restart sistem. Tapi seperti tadi sudah dijelaskan kita tidak bisa langsung login sebagai role. Yang bisa dilakukan adalah memberi kuasa pada user tertentu untuk bisa memainkan role baru tadi.

Jadi langkah terakhir adalah memberi kuasa baru pada user operator untuk bisa memainkan “peran” restart :

root@oraclesolaris11:~# usermod -R+"restart" operator
UX: usermod: operator is currently logged in, some changes may not take effect until next login.
root@oraclesolaris11:~#

Setelah user operator melakukan login ulang sekarang operator sudah memiliki “peran” baru :

ttirtawi@macmini:~$ ssh operator@192.168.10.70
Password: 
Last login: Wed Jan  1 19:31:20 2014 from 192.168.10.13
Oracle Corporation      SunOS 5.11      11.1    September 2012
operator@oraclesolaris11:~$ roles
restart
operator@oraclesolaris11:~$

Mari kita coba untuk merestart sistem dengan menggunakan role tadi :

operator@oraclesolaris11:~$ reboot
reboot: permission denied
operator@oraclesolaris11:~$ su - restart
Password: 
Oracle Corporation      SunOS 5.11      11.1    September 2012
restart@oraclesolaris11:~$ reboot
Connection to 192.168.10.70 closed by remote host.
Connection to 192.168.10.70 closed.
ttirtawi@macmini:~$

Berhasil, dengan adanya role restart maka user operator bisa mengakses perintah reboot tanpa bisa mengakses perintah-perintah penting lainnya; seperti misalnya mematikan network interface :

restart@oraclesolaris11:~$ ipadm down-addr net0/v4
ipadm: cannot mark the address down: Insufficient user authorizations
restart@oraclesolaris11:~$

Manajemen akses pada perintah-perintah penting jadi lebih mudah dengan adanya role. Kita tinggal menambahkan perintah-perintah yang dibutuhkan pada role yang bersangkutan. Konsep inilah yang dikenal dengan nama RBAC singkatan dari Role Based Access Control.