Artikel:Mengatur permission di Unix
[draft artikel untuk infolinux]
Mengatur Permission di Unix
Seorang pemula Unix/Linux umumnya cepat atau lambat akan harus
mengenali dan memahami permission filesystem di Unix. Baik lewat
perintah command-line populer "ls" ataupun lewat file manager berbasis
GUI, dalam waktu singkat ia akan mengamati adanya konsep "owner",
"group", maupun sederetan bit permission seperti "drwxr-xr-x". Artikel
ini akan menjelaskan dasar-dasar permission di Unix serta
contoh-contoh nyata pengaturan permission untuk mengimplementasi
berbagai policy keamanan. Sebagian contoh diambil dari skenario server
shared hosting, yang merupakan contoh yang baik untuk melihat
bagaimana mengatur permission di lingkungan multiple user.
Konsep dasar
Setiap file/direktori di filesystem memiliki 3 atribut: owner, group,
dan mode (atau protection, atau kadang disebut permission
juga). Ketiganya berupa angka. Untuk menyatakan permission secara
lengkap, notasinya biasanya (owner, group, mode).
Owner adalah Unix uid (bertipe uid_t, umumnya 32bit). Biasanya oleh
"ls" atau file manager yang ditampilkan adalah usernamenya (kecuali
jika username-nya tidak ada; ini mungkin terjadi jika kita mengekstrak
atau mengkopi file dari sistem lain di mana daftar user-nya tidaklah
sama).
Group adalah Unix gid (bertipe gid_t, umumnya 32bit). Sama seperti
owner, biasanya oleh "ls" atau file manager yang ditampilkan adalah
group name-nya, agar lebih manusiawi.
Mode (atau permission) adalah sederetan bit 0 dan 1 untuk menyatakan
flag akses (bertipe mode_t, umumnya berupa angka 32bit). Ada 9 bit
permission dasar, yaitu r, w, x untuk owner, rwx untuk group, dan rwx
untuk other (atau world). Flag r (read) mengatur apakah sebuah file
dapat dibaca. Flag w (write) mengatur apakah sebuah file dapat
ditulisi. Flag x (execute) mengatur apakah sebuah objek dapat
dijalankan (di-"run").
Untuk direktori, bit r artinya sebuah direktori dapat dilihat isinya
(dapat di-"ls") dan bit x artinya direktori tersebut dapat dimasuki
(dapat di-"cd"). Bit w artinya kita dapat memasukkan file atau
menghapus file di direktori tersebut.
Dengan huruf-huruf rwx, permission ditulis dengan urutan owner, group,
dan other. Contoh: rwxr-x--- artinya semua bit rwx menyala untuk owner
(rwx), hanya bit r dan x menyala untuk group (r-x), dan tidak satupun
rwx menyala untuk other (---).
Dengan bilangan basis 8 (oktal), permission ini dapat diekspresikan
dengan tiga digit. Bit r bernilai 4, w bernilai 2, x bernilai
1. Contohnya adalah 755 (kadang harus ditulis 0755 di mana prefiks "0"
menandai bahwa ini oktal). Permission 755 artinya semua bit rwx
menyala untuk owner (rwx), r dan x untuk group (r-x), dan r serta x
untuk other (r-x). Di contoh sebelumnya, rwxr-x--- ekivalen dengan
750.
Selain 9 bit permission dasar ini, ada juga beberapa bit lain seperti
setuid, setgid, sticky, dll. Sebagian dari bit-bit ini akan dijelaskan
sambil jalan.
Perlu dicatat juga bahwa user root mem-bypass hampir semua pengecekan
ini. Yang mana menjadi salah satu alasan untuk menghindari menggunakan
root untuk kegiatan sehari-hari, karena salah-salah file dan direktori
kita dapat tertimpa/terhapus oleh root walaupun permissionnya sudah
diset cukup restriktif.
Mengeset ownership
Untuk mengeset atau mengubah ownership di command line Unix, digunakan
perintah chown ("change owner") dan chgrp ("change
group"). Contoh, untuk mengubah file berkas.txt menjadi milik budi:
# chown budi berkas.txt
Untuk mengubah group menjadi group users:
# chgrp users berkas.txt
Chown memiliki sintaks shortcut untuk melakukan pengubahan owner dan
group:
# chown budi.users berkas.txt
Chown hanya dapat dilakukan oleh root. Chgrp dapat dilakukan oleh root
atau oleh user yang memiliki file/direktori. Jika dilakukan oleh si
pemilik file yang bukan root, maka pengubahan group hanya dapat
dilakukan ke salah satu group di mana si user tersebut adalah
member. Pada contoh chgrp di atas, jika perintah dieksekusi oleh user
budi, maka si budi haruslah member dari group users. User dilarang
mengubah filenya ke group asing lain.
Mengeset permission
Untuk mengeset permission di command line Unix, digunakan perintah
chmod ("change mode"). Contoh:
$ chmod 755 NAMAFILE
$ chmod 0755 NAMAFILE ; # sama saja
Perintah chmod juga mengizinkan kita menghidup-matikan bit secara
fleksibel, contoh untuk mematikan semua bit x (execute):
$ chmod -x NAMAFILE
Untuk menghidupkan bit w dan x pada other:
$ chmod o+rx NAMAFILE
Chmod hanya dapat dilakukan oleh root atau oleh si pemilik file.
Pengaturan publik dan privat
Rata-rata file di Unix umumnya bersifat publicly readable: "dapat
dibaca/dieksekusi oleh siapa saja, tapi hanya bisa dimodifikasi oleh
admin". Permissionnya adalah (root, root, 644) atau (root, root, 755)
untuk program. Contohnya amat banyak, misalnya semua file di /usr/bin,
/usr/share, dll. Semua dokumentasi, program, librari umumnya bersifat
publik di Unix. Toh semua file-file ini memang tidak berisi data
rahasia yang harus ditutup-tutupi.
Bahkan lokasi-lokasi tertentu sifatnya lebih bebas lagi, publicly
writable (atau world writable): free for all. Dapat ditulisi oleh
siapa saja. Contoh yang paling terkenal adalah /tmp. Permission
direktori ini adalah (root, root, 777). Setiap orang dapat menaruh
file di sini karena bit w pada kolom other menyala. Artinya setiap
orang memiliki akses "write" pada direktori ini.
Tapi, agar tidak terlalu "anarkis", maka ada bit permission tambahan
lain yang dihidupkan pada direktori /tmp ini yaitu bit sticky. Dengan
hidupnya bit ini, maka ada restriksi tambahan: file di dalam direktori
hanya boleh diganti nama (di-rename) atau dihapus oleh pemiliknya
sendiri. Artinya, Anda bisa saja menambah file sesuka hati ke /tmp,
tapi tidak bisa seenaknya menghapus atau mengganti nama file milik
orang lain.
Umumnya direktori-direktori free for all ditambahi bit sticky
ini. Untuk menghidupkan bit sticky di command line, dapat digunakan
perintah "chmod +t" atau mode numerik 1000, contoh: "chmod 1777". Di
perintah "ls" Anda akan melihat huruf "t" atau "T" di ujung deretan
permission mode sebagai tanda bahwa bit sticky menyala.
Oke, rata-rata file di sistem bersifat publik. Namun tentu ada pula
yang bersifat privat: hanya dapat dibaca oleh user tertentu saja (atau
bahkan hanya oleh root saja).
Contohnya direktori home user (/home/USER) diset (USER, USER,
700). Permission seperti ini berarti hanya user yang bersangkutan saja
yang dapat masuk. Catatan: ada juga distro-distro Linux yang secara
default membuka direktori home ini menjadi 755 atau 750, jadi Anda
sebagai user perlu berhati-hati dan memproteksi lagi file-file penting
dan privat di dalam home Anda dengan 600/700.
Contoh lain file privat adalah file berisi password sistem
(/etc/shadow) yang diset (root, root, 600). Hanya root saja yang dapat
melihat dan menulis isi file ini.
Contoh lain lagi, swap file. Karena dapat berisi segala macam
informasi sistem yang sensitif, maka harus diset setidaknya 600.
Pengaturan berbasis group
Untuk pengaturan yang lebih fleksibel dan di tengah-tengah spektrum
("tidak benar-benar publik, tapi tidak benar-benar privat"), digunakan
pengaturan berbasis group. Seperti diketahui, sebuah group dapat
beranggotakan lebih dari satu user dan sebuah user dapat menjadi
anggota lebih dari satu group. Dengan cara ini kita dapat memberi atau
mematikan akses pada sekelompok user tertentu.
Kita dapat membuat group-group baru dengan perintah groupadd:
# groupadd group1
Lalu menambahkan user ke dalam group ini:
# gpasswd -a budi group1
Untuk mengeluarkan sebuah user dari keanggotaan sebuah group:
# gpasswd -d budi group1
Jika sebuah group sudah tidak dibutuhkan, dapat dihapus:
# groupdel group1
Pengaturan group: inklusi
Beberapa file atau lokasi perlu dapat diakses oleh sekelompok user
saja. Untuk ini kita dapat mengeset file/direktori tersebut dengan
permission (root/USER, GROUP, 640/660/750/770). Dengan mematikan semua
bit rwx pada kolom other maka di luar anggota GROUP tidak ada yang
dapat mengakses.
Salah satu contoh adalah file-file log di bawah /var/log (seperti log
webserver /var/log/apache2 atau log FTP server /var/log/xferlog) yang
hanya diperuntukkan oleh para administrator (group adm). User
biasa tidak diperbolehkan mengintip karena log-log ini biasanya berisi
catatan untuk semua user. Yang berarti dapat membocorkan lokasi file
user-user lain.
Sebuah contoh lain, di server hosting direktori /u/USER/sites diset
(root, USER, 751). Direktori ini berisi file-file website,
masing-masing website dalam subdirektori tersendiri (contoh:
/u/USER/sites/site1.com, /u/USER/sites/site2.org, dst). Selain si
USER, user lain termasuk user www-data (webserver) juga dapat masuk
(bit x) tapi tidak dapat melihat isi website. Dengan begini, user lain
tidak dapat mengetahui (me-list) di bawah /u/USER/sites ada website
apa saja, nama masih dapat masuk lebih dalam jika ia sudah mengetahui
nama persis website tersebut.
Contoh lain lagi, di server hosting direktori /proc diset menjadi
(root, support-staff, 0550). Dengan demikian user yang bukan anggota
support-staff tidak dapat mengakses /proc. Perintah-perintah seperti
ps, top, netstat yang dijalankan non-staff menjadi
tidak berfungsi. Ini berguna untuk menjaga privasi sistem, agar user
tidak dapat mengintip terlalu banyak kondisi sistem, karena /proc
banyak berisi informasi sistem termasuk proses-proses user lain.
Catatan: Karena permission /proc ini akan tereset setiap kali boot
saat mount, maka kita perlu mengesetnya lagi setelah proses mount.
Pengaturan group: eksklusi
Kadang-kadang yang kita ingin lakukan justru sebaliknya, mengunci
akses dari sekelompok user saja. Biasanya di server hosting ini
dilakukan untuk menutup akses dari "user-user nakal". Contoh:
/usr/sbin/sendmail dapat diset menjadi (root, no-sendmail,
0705). User-user yang nakal karena sering mengirim junk email dapat
dimasukkan sementara ke dalam group no-sendmail, sehingga tidak dapat
mengakses program /usr/sbin/sendmail. Jika sudah bertobat dan mengaku
dosa, dapat dikeluarkan lagi dari group no-sendmail.
Contoh lain, /var/log diset (root, hosting-user, 0705). Semua user
hosting (yang dimasukkan ke group hosting-user, tentunya) tidak
diperbolehkan masuk melihat-lihat.
Contoh lain lagi, /bin/su dapat diset (root, no-su, 4705). Artinya
semua user kecuali yang masuk ke dalam group no-su diperbolehkan
mengakses program ini.
Apa artinya angka 4? Ini adalah bit permission mode lain yang
dinamakan setuid. Mode ini memiliki arti spesial yaitu sebuah file
setuid jika dijalankan akan berjalan bukan sebagai user yang
memanggilnya, tapi sebagai user owner file. Karena owner program
/bin/su adalah root, maka tak peduli siapapun yang memanggil program
ini, maka su akan berjalan sebagai root. Seperti kita tahu, su
("switch user") berguna untuk berganti user. Kemampuan ajaib
berganti-ganti user ini baru dapat diperoleh jika berjalan sebagai
root. Beberapa program lain juga berjalan sebagai setuid-ke-root,
contohnya /usr/bin/passwd untuk mengganti password (karena harus bisa
menulisi /etc/shadow). Membuat program setuid harus berhati-hati,
karena dapat berisiko memberi akses pada user yang tidak
seharusnya. Karenanya menutup akses program-program ini dengan mode
permission yang lebih restriktif ada bagusnya juga.
Perlu dicatat bahwa memprotek program non-setuid dengan proteksi user
(mis: 700) atau proteksi group (mis: 750 atau 705) sebetulnya untuk
tujuan pencegahan eksekusi tidaklah benar-benar efektif, karena orang
dapat saja mengupload binari sendiri yang serupa. Tapi memproteksi
program setuid dapat efektif karena bit setuid tidak dapat seenaknya
diset sendiri.
Pengaturan group: multiple group logika AND
Bagian ini hanya untuk pengguna mahir.
Dengan trik yang saya namakan direktori pembungkus, kita dapat
mengimplementasikan kebijakan keamanan menutup/membuka akses terhadap
dua atau lebih group sekaligus. Konsepnya adalah, karena sebuah
file/direktori hanya dapat diberi atribut 1 group saja, maka kita
menaruh file/direktori yang ingin kita protek tersebut di bawah satu
atau lebih subdirektori lain, dan mengenakan atribut group-group
tambahannya pada si subdirektori pembungkus tadi. Ibaratnya menaruh
pintu berlapis, seperti boneka bersusun Rusia.
Contoh, untuk 2 group:
# mengizinkan target diakses oleh anggota group A dan B:
dir/ = (x, A, 750)
dir/target = (x, B, 750)
Efek perintah di atas adalah, seorang user harus menjadi anggota kedua
group dulu sebelum bisa masuk.
# menutup akses dari anggota group A dan B:
dir/ = (x, A, 705)
dir/target = (x, B, 705)
Efek perintah di atas adalah, jika seorang user anggota salah satu
group maka tidak bisa masuk ke target. Entah terblokir di dir/ (karena
anggota group A) atau di dir/target (karena anggota group B).
Untuk tiga group atau lebih, cukup perdalam levelnya.
Pengaturan group: multiple group logika OR
Bagian ini hanya untuk pengguna mahir.
Untuk logika OR, kita dapat menggunakan fasilitas link di
Unix. Contoh, untuk 2 group:
# mengizinkan target diakses oleh anggota group A atau B:
dir1 (x, A, 750)
dir1/target
dir2 (x, B, 750)
dir2/target adalah link dari dir1/target
Efek dari perintah di atas, user anggota A dapat mengakses target
lewat dir1. Anggota B dapat mengakses via dir2.
Untuk 3 group atau lebih, cukup memperbanyak "gerbang alternatif"-nya.
Beberapa contoh lain
Beberapa contoh lain pengaturan permission di Unix.
Direktori session: /var/lib/php5 = (root, root, 1633). Direktori ini
dipakai untuk menyimpan file sementara seperti session. Semua user
dapat menaruh file di sini. Tapi karena session ID (nama file) perlu
dirahasiakan dari user lain, maka bit r dimatikan pada kolom
other. Artinya, direktori ini tidak bisa di-"ls".
Mengunci file: (root, root, 0). Dengan mematikan semua bit, maka user
selain root tidak dapat lagi mengakses file ini. Dengan tampilan "ls"
pun jadi terindikasi jelas secara visual bahwa file ini didisable
(mode-nya terlihat "---------").
File backup: chmod -w (400/440/444). Sebagian editor sengaja mematikan
permission w pada file backup. Tujuannya adalah agar file tersebut
tidak bisa diedit. Tentu saja ini bukan proteksi menyeluruh, hanya
untuk membantu saja. User masih bisa tak sengaja menghapus file
tersebut, dan jika ingin mengedit bisa saja melakukan chmod +w dulu
pada file tersebut.
Sebuah contoh lengkap
Berikut ini sebuah contoh yang agak lengkap hirarki direktori untuk
sebuah account di server shared hosting beserta penjelasannya.
/u/steven/ (root, steven, 755)
/u/steven/home/ (steven, steven, 700)
/u/steven/public/ (steven, steven, 755)
/u/steven/mysql/ (mysql, steven, 550)
/u/steven/mysql/db1/ (mysql, steven, 2750)
/u/steven/sites/ (root, steven, 751)
/u/steven/sites/site1.com/ (www-data, steven, 550)
/u/steven/sites/site1.com/www/ (steven, steven, 755)
/u/steven/sites/site1.com/syslog/ (root, steven, 750)
Direktori account teratas (/u/steven) terbuka untuk siapa saja, karena
di dalamnya berbagai user sistem (mis: apache, mysql) harus dapat
masuk. Owner diset menjadi root agar user steven tidak dapat membuat
sembarang direktori di dalam direktori ini.
Direktori home (/u/steven/home) menjadi daerah privat milik user
sepenuhnya. Tidak boleh ada user lain yang dapat masuk.
Direktori mysql (/u/steven/mysql) diset demikian agar hanya mysql (dan
user) yang dapat masuk. Direktori database (/u/steven/mysql/db1) diset
menjadi milik mysql agar hanya mysql yang dapat membuat file-file
tabel dll. Namun diset setgid (2000), yang artinya file-file yang
tercipta di bawah direktori tersebut otomatis groupnya diset menjadi
user steven. Ini berguna untuk tujuan perhitungan group quota.
Direktori sites (/u/steven/sites) perlu dapat dimasuki oleh user itu
sendiri, oleh apache, dan oleh beberapa user sistem lain. Tapi user
sistem lain atau user hosting lain tidak dapat mengintip nama-nama
situs di bawah sites/.
Permission tradisional vs ACL
Model permission yang telah dijelaskan di artikel ini sebetulnya
disebut model tradisional Unix (atau model tradisional
POSIX). Mengapa disebut tradisional? Karena telah ada sejak lama,
sejak zaman-zaman awal Unix dikembangkan, bahkan jauh sebelum Linux
lahir. Praktis semua varian Unix mendukung model ini. Alasan lain
disebut tradisional adalah karena telah dikembangkan model permission
yang lebih fleksibel seperti ACL (access control lists).
Dengan ACL, pengaturan permission bisa lebih fleksibel. Konsepnya
adalah, setiap file/direktori dapat memiliki daftar aturan
akses. Dengan aturan yang dapat lebih dari satu inilah diperoleh
fleksibilitas. User-user dan group-group yang berbeda dapat diberi
aturan akses yang berbeda-beda. Misalnya, untuk sebuah file A: user A,
B, C dapat membaca dan menulis. Group D, E juga dapat menulis, tapi
group F sama sekali tidak dapat mengakses, dst. Dengan model
tradisional POSIX, hal ini sulit dilakukan. Bisa, tapi akan melibatkan
penciptaan group-group baru, karena sebuah file/direktori hanya bisa
diasosiasikan dengan satu group saja.
Tapi kenapa sampai hari ini model tradisional POSIX tetap mendominasi
dan popular?
Alasan utama adalah karena kesederhanaannya. Karena sederhana, mudah
dimengerti. Karena sederhana, mudah ditampilkan secara ringkas. Karena
sederhana, mudah diuji/diaudit. Alasan lain adalah karena hingga hari
ini masih ada tool-tool filesystem yang belum aware terhadap
keberadaan ACL. Sehingga jika tidak hati-hati ACL ini dapat
hilang/tertinggal saat file dipindah-pindah. Dan akibatnya tentu
risiko keamanan. Di lain pihak, praktis semua tool Unix mendukung
model tradisional POSIX, dari tool sederhana seperti cp,
rsync, tar hingga tool GUI dan komersial.
Penutup
Model permission tradisional UNIX/POSIX adalah salah satu dasar
terpenting keamanan di Unix/Linux. Pastikan Anda benar-benar familiar
dan memahaminya.
|