13 Juni 2014

Access Control List (ACL) pada Linux

Access Control List merupakan permission tambahan di linux. Dengan ACL kita dapat memberikan permission khusus kepada user atau group tertentu secara spesifik. Dalam permission dasar, sebuah file atau direktori memiliki permission untuk user pemilik, group, dan other. Masalah akan terjadi ketika kita ingin memberikan ijin (misalnya) baca sebuah file kepada 2 user yang berada dalam group yang berbeda, tetapi tidak kepada user lain dalam sistem. Ada workarround untuk hal semacam ini, kita bisa membuat group baru khusus untuk ijin baca pada file tersebut. Akan tetapi, apabila kita punya banyak file dengan pengaturan permission seperti file tadi, kita akan memiliki (terlalu) banyak group dalam sistem kita. Untuk mengatasi masalah tersebut, digunakanlah ACL. Dalam praktik di tulisan ini saya menggunakan CentOS, jika distro yang anda gunakan tidak sama, beberapa hasil terminal mungkin berbeda.
Intro
Filesystem yang support untuk ACL yaitu, ReiserFS, Ext2, Ext3, Ext4, JFS, dan XFS. Jika sistem linux anda menggunakan salah satu filesystem tersebut, anda bisa menggunakan ACL. Sebelum menggunakan ACL, periksa apakah ACL sudah di-enable atau belum, gunakan command mount sebagai root.
[root@santos ~]# mount | grep root
/dev/mapper/vg_livecd-lv_root on / type ext4 (rw)
tmpfs on /dev/shm type tmpfs (rw,rootcontext="system_u:object_r:tmpfs_t:s0")
Dari hasil di atas, ternyata ACL tidak diaktifkan. Tapi meskipun tidak diaktifkan, belum tentu filesistem anda tidak support untuk ACL. Untuk memeriksa apakah filesystem yang digunakan support ACL, gunakan command tune2fs.
[root@santos ~]# tune2fs  -l /dev/mapper/vg_livecd-lv_root 
tune2fs 1.41.12 (17-May-2010)
Filesystem volume name:   _CentOS-6.4-x86_
Last mounted on:          /
Filesystem UUID:          04382f72-6626-456e-8693-ae54ed0030d0
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery extent flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize
Filesystem flags:         signed_directory_hash 
Default mount options:    user_xattr acl
Ternyata filesystem yang saya gunakan support ACL. Untuk mengaktifkan ACL setiap booting, editlah /etc/fstab pada bagian partisi yang akan digunakan ACL. Jika sebelumnya partisi root adalah
/dev/mapper/vg_livecd-lv_root /                       ext4    defaults        1 1
Editlah menjadi
/dev/mapper/vg_livecd-lv_root /                       ext4    acl,defaults     1 1
Setelah mengedit, mount ulang partisi / agar ACL aktif.
[root@santos ~]# mount -o remount /
[root@santos ~]# mount | grep root
/dev/mapper/vg_livecd-lv_root on / type ext4 (rw,acl)
tmpfs on /dev/shm type tmpfs (rw,rootcontext="system_u:object_r:tmpfs_t:s0")
Dengan mengedit /etc/fstab seperti di atas, secara otomatis ACL akan diaktifkan pada / setiap kali anda reboot.
Penggunaan ACL
Untuk dapat menggunakan ACL, anda harus menginstall package acl.
yum install acl
Setelah mengaktifkan ACL, sekarang kita mulai penggunaan ACL. Agar tidak merusak sistem, saya akan melakukan praktik di dalam directory /tmp. Pertama, buatlah directory acldir untuk bahan percobaan.
[root@santos tmp]# mkdir acldir
[root@santos tmp]# ls -la | grep acldir
drwxr-xr-x.  2 root root     4096 Jun  5 10:54 acldir
Seperti yang terlihat, acldir memiliki permission drwxr-xr-x., tanda titik di akhir menunjukan bahwa acldir tidak menggunakan ACL. Sekarang kita gunakan ACL untuk memberikan permission rwx khusus untuk user1 pada acldir. Untuk menggunakan ACL, gunakan command setfacl.
[root@santos tmp]# setfacl -m u:user1:rwx acldir/
Mari kita uraikan perintah di atas.
  • setfacl, adalah command yang digunakan untuk memberikan permission ACL kepada user atau group tertentu. Dengan kata lain setfacl adalah versi ACL dari command chmod.
  • -m, adalah argument dari setfacl untuk memodifikasi atau menambahkan permission ACL pada suatu file.
  • u:user1:rwx, merupakan argument yang menandakan permission seperti apa yang akan diterapkan pada suatu file atau directory. Huruf u berarti ACL ini akan diberikan untuk user. user1 adalah nama user yang akan diberikan ACL. rwx adalah permission yang diberikan.
  • acldir, adalah nama directory (atau file) yang menjadi target ACL.

Setalah kita terapkan ACL pada file, mari kita periksa hasilnya.
[root@santos tmp]# ls -la | grep acldir
drwxrwxr-x+  2 root root     4096 Jun  5 10:54 acldir
Seperti yang terlihat, setelah diterapkan ACL, suatu file atau directory akan memberikan tanda '+' pada akhir permission. Akan tetapi, command ls hanya dapat memberitahu kita bahwa acldir memiliki permission ACL, tapi tidak dapat memberitahu secara detail seperti apa ACL yang diterapkan. Untuk mengetahui detail ACL pada suatu file, gunakan command getfacl.
[root@santos tmp]# getfacl acldir/
# file: acldir/
# owner: root
# group: root
user::rwx
user:user1:rwx
group::r-x
mask::rwx
other::r-x
Seperti yang terlihat di atas, kita berhasil menerapkan permission rwx untuk user1 pada acldir. Setelah mengetahui pengaturan awal dan penggunaan ACL, berikutnya akan kita lanjutkan dengan penggunaan lain ACL secara bertahap.
Memberikan ijin ACL kepada user
root akan membuat sebuah file, kemudian user1 akan diberikan akses menggunakan acl.
[root@santos tmp]# echo "dono" > warkop
[root@santos tmp]# ls -l
-rw-r--r--. 1 root root        5 Jun 11 23:21 warkop

[user1@santos tmp]$ echo "Dono Kasino Indro" > warkop 
-bash: warkop: Permission denied

[root@santos tmp]# setfacl -m u:user1:rwx warkop
[root@santos tmp]# ls -l
-rw-rwxr--+ 1 root root        5 Jun 11 23:21 warkop

[user1@santos tmp]$ echo "Dono Kasino Indro" > warkop 
[user1@santos tmp]$ cat warkop 
Dono Kasino Indro
Seperti yang terlihat, sebelum diberikan ijin menggunakan acl, user1 tidak dapat mengedit file warkop, tetapi setelah diberikan ijin, user1 dapat mengedit file warkop.
Memberikan ijin ACL kepada group
root akan membuat file lagi. user1 dan user2 berada dalam satu group, acluser. Sedangkan user3 tidak berada dalam group acluser.
[root@santos tmp]# echo "miing" > bagito
[root@santos tmp]# setfacl -m g:acluser:rwx bagito
[root@santos tmp]# getfacl bagito 
# file: bagito
# owner: root
# group: root
user::rw-
group::r--
group:acluser:rwx
mask::rwx
other::r--

[user1@santos tmp]$ echo "miing didin" > bagito

[user2@santos tmp]$ echo "miing didin unang" > bagito

[user3@santos tmp]$ echo "miing didin unang dodit" > bagito
-bash: bagito: Permission denied
Ternyata hanya anggota aclgroup (user1 & user2) yang memiliki akses ke file bagito. user3 tidak dapat mengedit file tersebut karena tidak memiliki ijin.
Menambahkan ijin ACL pada file
File yang sudah diberi ijin ACL, bisa ditambahkan ijin lagi. Sebelumnya user3 tidak memiliki ijin edit, sekarang kita berikan ijin edit khusus untuk user3.
[root@santos tmp]# setfacl -m u:user3:rwx bagito
[root@santos tmp]# getfacl bagito 
# file: bagito
# owner: root
# group: root
user::rw-
user:user3:rwx
group::r--
group:acluser:rwx
mask::rwx
other::r--

[user3@santos tmp]$ echo "miing didin unang dodit" > bagito
Setelah diberikan ijin ACL, user3 dapat mengedit file bagito meskipun user3 tidak masuk ke group acluser.
Menghapus salah satu perijinan ACL
File bagito sudah memiliki 2 perijinan ACL, untuk user3 dan group acluser. Kita akan menghapus salah satu ijin ACL, yaitu ijin untuk group acluser.
[root@santos tmp]# setfacl -x g:acluser bagito
[root@santos tmp]# getfacl bagito
# file: bagito
# owner: root
# group: root
user::rw-
user:user3:rwx
group::r--
mask::rwx
other::r--

[user1@santos tmp]$ echo "miing didin" > bagito 
-bash: bagito: Permission denied

[user2@santos tmp]$ echo "miing didin unang" > bagito
-bash: bagito: Permission denied
Terlihat bahwa setelah ijin ACL group acluser dihapus, maka anggota group tersebut tidak dapat lagi mengedit file bagito.
Menghapus seluruh perijinan ACL
Contoh di atas menunjukan cara menghapus ijin ACL satu-persatu. Berikut ini adalah cara untuk menghapus seluruh perijinan yang diberikan dengan ACL.
[root@santos tmp]# setfacl -b bagito
[root@santos tmp]# ls -l
-rw-r--r--. 1 root  root        24 Jun 12 21:09 bagito
Seperti yang terlihat, file bagito tidak lagi memiliki tanda '+' di perijinannya. Jadi seluruh perijinan acl dari file bagito sudah terhapus.
Memberikan ijin acl kepada direktori
Pemberian ijin ACL pada direktori sama dengan pada file.
[root@santos tmp]# mkdir acldir
[root@santos tmp]# ls -l
drwxr-xr-x. 2 root root     4096 Jun 12 23:49 acldir

[user1@santos tmp]$ touch acldir/mamalia
touch: cannot touch `acldir/mamalia': Permission denied

[root@santos tmp]# setfacl -m u:user1:rwx acldir
[root@santos tmp]# ls -l
total 32044
drwxrwxr-x+ 2 root root     4096 Jun 12 23:51 acldir

[user1@santos tmp]$ touch acldir/mamalia
Sebelum user1 diberi ijin acl, dia tidak dapat membuat file di direktori acldir. Setelah diberikan ijin acl, barulah dia dapat membuat file dalam direktori acldir.
Memberikan ijin ACL secara recursive
Apabila menggunakan setafcl seperti biasa pada sebuah direktori, kita hanya akan memberikan ijin acl kepada direktori tersebut. File dan subdirektori yang berada dalam direktori tersebut tidak terkena dampaknya.
[root@santos tmp]# mkdir acldir2
[root@santos tmp]# touch acldir2/file1
[root@santos tmp]# touch acldir2/dir1
[root@santos tmp]# ls -l
drwxr-xr-x. 2 root root     4096 Jun 13 09:22 acldir2
[root@santos tmp]# ls -l acldir2
-rw-r--r--. 1 root root 0 Jun 13 09:22 dir1
-rw-r--r--. 1 root root 0 Jun 13 09:22 file1

[root@santos tmp]# setfacl -R -m g:acluser:rwx acldir2
[root@santos tmp]# ls -l acldir2
total 8
-rw-rwxr--+ 1 root root 0 Jun 13 09:22 dir1
-rw-rwxr--+ 1 root root 0 Jun 13 09:22 file1
[root@santos tmp]# ls -l
total 32052
drwxrwxr-x+ 2 root root     4096 Jun 13 09:22 acldir2
[root@santos tmp]# getfacl acldir2
# file: acldir2
# owner: root
# group: root
user::rwx
group::r-x
group:acluser:rwx
mask::rwx
other::r-x

[root@santos tmp]# getfacl acldir2/file1 
# file: acldir2/file1
# owner: root
# group: root
user::rw-
group::r--
group:acluser:rwx
mask::rwx
other::r--

[root@santos tmp]# getfacl acldir2/dir1 
# file: acldir2/dir1
# owner: root
# group: root
user::rw-
group::r--
group:acluser:rwx
mask::rwx
other::r--
Dengan menambahkan option -R, kita bisa membuat perijinan acl pada sebuah direktori sekaligus dengan seuluruh isinya.
Membuat perijinan sebuah direktori menjadi default
Option -R akan memberikan perijinan secara recursive pada direktori dan seluruh isinya, akan tetapi file atau dirketori yang baru dibuat tidak akan memiliki acl. File atau direktori baru harus diatur lagi perijinan aclnya. Agar file dan direktori baru yang dibuat didalamnya langsung memiliki perijinan acl, kita gunakan option -d.
[root@santos tmp]# setfacl -d -m g:acluser:rwx acldir2
[root@santos tmp]# getfacl acldir2
# file: acldir2
# owner: root
# group: root
user::rwx
group::r-x
group:acluser:rwx
mask::rwx
other::r-x
default:user::rwx
default:group::r-x
default:group:acluser:rwx
default:mask::rwx
default:other::r-x
[root@santos tmp]# touch acldir2/file2
[root@santos tmp]# getfacl acldir2/file2
# file: acldir2/file2
# owner: root
# group: root
user::rw-
group::r-x   #effective:r--
group:acluser:rwx  #effective:rw-
mask::rw-
other::r--
Dengan option -d, semua file atau direktori baru yang dibuat, secara default akan memiliki perijinan acl. Dan hasil dari command getfacl terhadap acldir2 pun sudah berbeda dari sebelumnya.
Menghapus pengaturan defaul ACL
Untuk menghapus setting ACL default tidak sama dengan menghapus setting biasa. Option yang digunakan untuk menghapus setting acl default pada sebuah direktori adalah dengan option -k.
[root@santos tmp]# setfacl -k acldir2
[root@santos tmp]# touch acldir2/file3
[root@santos tmp]# ls -l acldir2
total 12
-rw-rwxr--+ 1 root root 0 Jun 13 09:22 dir1
-rw-rwxr--+ 1 root root 0 Jun 13 09:22 file1
-rw-rw-r--+ 1 root root 0 Jun 13 10:07 file2
-rw-r--r--. 1 root root 0 Jun 13 13:22 file3
Setelah setting default dihapus dengan option -k, file3 yang baru dibuat tidak memiliki perijinan acl.
Semoga penjelasan singkat saya dapat membantu dalam memahami acl. Untuk mengetahui lebih banyak tentang acl, silakan baca manual dari setfacl dan getfacl.
Referensi
http://bencane.com/2012/05/27/acl-using-access-control-lists-on-linux/

Tidak ada komentar:

Posting Komentar