Bismillah

Umumnya, entri sudoers yang dibahas pada tutorial-tutorial, seringnya hanya membahas penambahan entri sudoers biasa, alias memungkinkan user untuk mengeksekusi semua perintah sebagai root.

Pada artikel kali ini, saya akan menjelaskan bagaimana membuat entri sudoers untuk memungkinkan user terkait untuk bisa mengeksekusi perintah yang ditentukan sebagai user lain. Contoh kasus dimana hal ini sangat bermanfaat adalah ketika ada monitoring agent seperti Zabbix yang biasanya berjalan sebagai user tertentu (zabbix), yang memerlukan izin untuk menjalankan suatu perintah sebagai user lain tetapi tidak sampai diberi akses super user.

Sintaks Dasar File Sudoers

Pada dasarnya, file sudoers memiliki berbagai “spesifikasi” untuk berbagai tujuan seputar sudo (bisa dilihat via man sudoers). Tetapi yang akan dibahas disini hanya seputar User specification, yaitu bagian inti yang menentukan tentang siapa yang bisa menjalankan apa.

1
2
3
4
user  HOST=(user:group) LIST

# untuk grup, awali dengan %
%group HOST=(user:group) LIST

Ada 3 bagian inti:

  1. penentuan user/group
  2. host dan user dan/atau group target
  3. list perintah

Poin no.1 adalah user/group yang hendak menjalankan perintah. Kemudian no.2 adalah user/group dimana perintah tersebut akan dijalankan. Dan no.3 tentu daftar perintah yang ingin diizinkan, dipisahkan dengan koma.

Mengenai bagian HOST, pada umumnya cukup diset ke ALL, alias diizinkan dijalankan ke semua host. Kemudian pada bagian user/group target, bisa sekedar menuliskan usernya saja, groupnya saja atau keduanya.

Jika ingin menjalankan perintah terkait tanpa perlu memasukkan password, maka sebelum LIST perintah, berikan NOPASSWD:.

Contoh:

1
user ALL=(target) NOPASSWD: LIST

Yang terakhir, pada bagian LIST, perintah yang dimasukkan perlu ditulis secara lengkap full path-nya. Misal, cp harus /usr/bin/cp; rm harus /usr/bin/rm dan seterusnya. Sehingga, contoh sebelumnya menjadi:

1
user ALL=(target) NOPASSWD: /usr/bin/cp, /usr/bin/rm

Contoh kasus

Mari kita gunakan contoh skenario berikut: kita ingin memonitor sesuatu pada instance Zimbra kita menggunakan Zabix active agent. Perintah yang perlu dijalankan adalah dibawah ini:

1
zmsoap -z --json GetServiceStatusRequest

Perintah diatas hanya bisa dijalankan sebagai user zimbra saja dan monitoring agent yang digunakan, berjalan sebagai user zabbix. Sehingga, user zabbix perlu untuk bisa menjalankan perintah tersebut sebagai user zimbra. Maka, perintah yang akan dijalankan user zabbix menjadi:

1
2
3
4
5
sudo -inu zimbra zmsoap -z --json GetServiceStatusRequest

# -i   run login shell as the target user;
# -n   non-interactive mode, no prompts are used
# -u   run command (or edit file) as specified username or ID

Dengan spesifikasi diatas, maka entri sudoers yang diperlukan adalah sebagai berikut:

1
zabbix ALL=(zimbra) NOPASSWD: /bin/bash -c zmsoap -z --json GetServiceStatusRequest

Kenapa ada /bin/bash -c ?

Hal tersebut disebabkan karena ketika suatu perintah dijalankan melalui sudo, maka perintah tersebut akan dijalankan dari bash -c (atau shell lain). Pada kasus ini, shell dari user zimbra adalah bash.

Kemudian, entri tersebut disimpan pada file /etc/sudoers.d/zabbix. Untuk memverifikasinya, jalankan:

1
visudo -c -f /etc/sudoers.d/zabbix

Jika menghasilkan output: sudoers: parsed OK maka tidak ada masalah pada file sudoers tersebut.

💡

Disarankan juga untuk mengedit file sudoers tersebut menggunakan perintah: visudo -f /etc/sudoers.d/zabbix

Dengan demikian, jika terjadi kekeliruan sintaks, maka semua modifikasi akan dibatalkan agar tidak membuat fungsi sudo rusak.


Semoga bermanfaat, barakallahufiikum.