Artikel:Mengatur permission di Unix

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 (groupadm). 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.

Resita has written 705 articles