Controlling Access to Files with ACLs | RH134 (Indonesia ver.)
Tags: ramadhanbersamaredhat
Published: 2024-03-20 06:48:10

## Konsep Access Control Lists
Izin file Linux standar sudah cukup ketika file hanya digunakan oleh satu pemilik, dan satu kelompok orang yang ditunjuk. Namun, beberapa kasus penggunaan mengharuskan file diakses dengan set izin file yang berbeda oleh beberapa pengguna dan grup bernama. _Access Control Lists (ACLs)_ menyediakan fungsi ini.

Dengan ACLs, Anda dapat memberikan izin kepada beberapa pengguna dan grup, yang diidentifikasi dengan nama pengguna, nama grup, UID, atau GID, menggunakan flag izin yang sama yang digunakan dengan izin file biasa: baca(_read_), tulis(_write_), jalankan(_execute_). Pengguna dan grup yang dimaksud ini, di luar Owner/pemilik file dan afiliasi grup file, masing-masing disebut pengguna bernama dan grup bernama, karena mereka tidak diberi nama dalam daftar panjang, melainkan dalam ACL.

Pengguna dapat mengatur ACL pada file dan direktori yang mereka miliki. Pengguna yang memiliki hak istimewa, seperti root dan sudoers, dapat mengatur ACL pada file atau direktori apa pun. File dan subdirektori baru secara otomatis mewarisi pengaturan ACL dari ACL bawaan direktori induknya, jika telah ditetapkan. Mirip dengan aturan akses file normal, hirarki direktori induk membutuhkan setidaknya izin pencarian (_execute_) yang lain untuk memungkinkan pengguna bernama dan grup bernama memiliki akses.
## Melihat dan Menafsirkan Izin ACL
Perintah **ls -l** hanya mengeluarkan detail pengaturan ACL minimal:

```
[user@host content]$ ls -l reports.txt
-rwxrw----+ 1 user operators 130 Mar 19 23:56 reports.txt
```
Tanda plus (+) di akhir string izin karakter ke-10 menunjukkan bahwa struktur ACL yang diperluas dengan entri ada pada file ini.

**Melihat ACLs Pada File**
Untuk menampilkan pengaturan ACL pada file, gunakan **getfacl** _file_ :

```
[user@host content]$ getfacl reports.txt
# file: reports.txt
# owner: user
# group: operators
user::rwx
user:consultant3:---
user:1005:rwx       #effective:rw-
group::rwx          #effective:rw-
group:consultant1:r--
group:2210:rwx      #effective:rw-
mask::rw-
other::---
```
Berikut adalah tinjauan setiap bagian dari contoh diatas:

Entri Komen:
```
# file: reports.txt
# owner: user
# group: operators
```
Tiga baris pertama adalah komentar yang mengidentifikasi nama file, pemilik(_user_), dan pemilik grup(_operator_). Jika ada flag file tambahan, seperti setuid atau setgid, maka baris komentar keempat akan muncul yang menunjukkan flag mana yang ditetapkan.

Entri User:
```
user::rwx                              1.
user:consultant3:---                   2.
user:1005:rwx       #effective:rw-     3.
```
1. Izin pemilik file. _user_ memiliki _rwx_.
2. Izin pengguna bernama. Satu entri untuk setiap nama pengguna yang terkait dengan file ini. _consultant3_ tidak memiliki izin.
3. Izin pengguna bernama. UID _1005_ memiliki _rwx_, tetapi mask membatasi izin efektif hanya untuk _rw_.

Entri Grup:
```
group::rwx          #effective:rw-     1.
group:consultant1:r--                  2.
group:2210:rwx      #effective:rw-     3.
```
1. Izin pemilik grup. _operators_ memiliki _rwx_, tetapi mask membatasi izin efektif hanya untuk _rw_.
2. Izin grup bernama. Satu entri untuk setiap grup bernama yang terkait dengan file ini. _consultant1_ hanya memiliki izin _r_.
3. Izin grup bernama. GID _2210_ memiliki _rwx_, tetapi mask membatasi izin efektif hanya untuk _rw_.

Entri Mask:
```
mask::rw
```
Pengaturan mask menunjukkan izin maksimum yang memungkinkan untuk semua pengguna bernama, pemilik grup, dan grup bernama. UID _1005_, _operator_, dan GID _2210_ tidak dapat menjalankan file ini, meskipun setiap entri memiliki izin _execute_ yang telah ditetapkan.

Entri Other:
```
other::---
```
Izin _other_ atau "dunia". Semua UID dan GID lainnya yang tidak termasuk ke dalam daftar user dan grup TIDAK memiliki izin sama sekali.

**Melihat ACLs Pada Direktori**
Untuk menampilkan pengaturan ACL pada direktori, gunakan perintah **getfacl** _directory_:

```
[user@host content]$ getfacl .
# file: .
# owner: user
# group: operators
# flags: -s-
user::rwx
user:consultant3:---
user:1005:rwx
group::rwx
group:consultant1:r-x
group:2210:rwx
mask::rwx
other::---
default:user::rwx
default:user:consultant3:---
default:group::rwx
default:group:consultant1:r-x
default:mask::rwx
default:other::---
```
Berikut adalah tinjauan setiap bagian dari contoh diatas:

Entri Komen:
```
# file: .
# owner: user
# group: operators
# flags: -s-
```
Tiga baris pertama adalah komentar yang mengidentifikasi nama direktori, pemilik(_user_), dan pemilik grup(_operators_). Jika ada flag direktori tambahan(_setuid_, _setgid_, _sticky_), maka baris komentar keempat menunjukkan flag mana yang ditetapkan; dalam kasus ini, _setgid_.

Entri standar ACLs:
```
user::rwx
user:consultant3:---
user:1005:rwx
group::rwx
group:consultant1:r-x
group:2210:rwx
mask::rwx
other::---
```
Izin ACL pada direktori ini sama dengan contoh file yang ditunjukkan sebelumnya, tetapi berlaku untuk direktori tersebut. Perbedaan utamanya adalah penyertaan izin execute pada entri ini (jika sesuai) untuk mengizinkan izin pencarian direktori.

Entri Default User:

```
default:user::rwx                   1.
default:user:consultant3:---        2.
```
1. Izin ACL pemilik file default. Pemilik file akan mendapatkan rwx, membaca/menulis pada file baru dan mengeksekusi pada subdirektori baru.
2. Izin ACL pengguna bernama default. Satu entri untuk setiap pengguna bernama yang secara otomatis akan mendapatkan ACL default yang diterapkan pada file atau subdirektori baru. _consultant3_ selalu secara default tidak memiliki izin.

Entri Default Grup:

```
default:group::rwx                  1.
default:group:consultant1:r-x       2.
```
1. Izin ACL pemilik grup default. Pemilik grup file akan mendapatkan _rwx_, membaca/menulis pada file baru dan mengeksekusi pada subdirektori baru.
2. Izin ACL grup bernama default. Satu entri untuk setiap grup bernama yang secara otomatis akan mendapatkan ACL default. _consultant1_ akan mendapatkan _rx_, hanya-baca pada file baru, dan mengeksekusi pada subdirektori baru.

Entri Default Mask:

```
default:mask::rwx
```
Pengaturan mask default menunjukkan izin maksimum awal yang mungkin untuk semua file atau direktori baru yang dibuat yang memiliki ACL pengguna bernama, ACL pemilik grup, atau ACL grup bernama: baca dan tulis untuk file baru dan izin eksekusi pada subdirektori baru. File baru tidak pernah mendapatkan izin eksekusi.

Entri Default Other:

```
default:other::---
```
Izin default _other_ atau "dunia". Semua UID dan GID lain yang tidak termasuk ke dalam daftar user dan grup TIDAK memiliki izin ke file baru atau subdirektori baru.

Entri _default_ pada contoh sebelumnya tidak menyertakan pengguna bernama (UID _1005_) dan grup bernama (GID _2210_); akibatnya, entri tersebut tidak akan secara otomatis ditambahkan entri ACL awal untuk mereka pada file atau subdirektori baru. Hal ini secara efektif membatasi mereka pada file dan subdirektori yang telah memiliki ACL, atau jika pemilik file yang bersangkutan menambahkan ACL kemudian menggunakan **setfacl**. Mereka masih dapat membuat file dan subdirektori mereka sendiri.

**Mask ACL**

Mask ACL mendefinisikan izin maksimum yang dapat Anda berikan kepada pengguna bernama, pemilik grup, dan grup bernama. Ini tidak membatasi izin pemilik file atau pengguna lain (_other_). Semua file dan direktori yang menerapkan ACL akan memiliki mask ACL.

Mask ini dapat dilihat dengan **getfacl** dan secara eksplisit diatur dengan **setfacl**. Mask ini akan dihitung dan ditambahkan secara otomatis jika tidak diatur secara eksplisit, tetapi juga dapat diwarisi dari pengaturan mask default direktori induk. Secara default, mask akan dihitung ulang setiap kali ada ACL yang terpengaruh ditambahkan, dimodifikasi, atau dihapus.


## Mengamankan File dengan ACL
**Mengubah Izin File ACL**
Gunakan **setfacl** untuk menambah, memodifikasi, atau menghapus ACL standar pada file dan direktori.

ACL menggunakan representasi izin sistem file normal, "_r_" untuk izin baca, "_w_" untuk izin tulis, dan "_x_" untuk izin eksekusi. Tanda "-" (tanda strip) menunjukkan bahwa izin yang bersangkutan tidak ada. Ketika (secara rekursif) mengatur ACL, huruf besar "_X_" dapat digunakan untuk mengindikasikan bahwa izin eksekusi hanya boleh diatur pada direktori dan bukan berkas biasa, kecuali berkas tersebut sudah memiliki izin eksekusi yang relevan. Ini adalah perilaku yang sama dengan **chmod**.

**Menambahkan atau Memodifikasi ACL**
ACL dapat diatur melalui baris perintah dengan menggunakan opsi _-m_, atau dimasukkan melalui file dengan menggunakan opsi _-M_ (gunakan "-" (tanda strip) sebagai pengganti nama file untuk stdin). Kedua opsi ini adalah opsi "modify"; opsi ini menambahkan entri ACL baru atau mengganti entri ACL tertentu yang sudah ada pada file atau direktori. Entri ACL lain yang sudah ada pada berkas atau direktori tetap tidak tersentuh.

Untuk menambah atau memodifikasi pengguna atau ACL pengguna bernama:

```
[user@host ~]$ setfacl -m u:_name_:rX file
```
Jika _name_ dibiarkan kosong, maka itu berlaku untuk pemilik berkas, jika tidak, nama dapat berupa nama pengguna atau nilai UID. Pada contoh ini, izin yang diberikan adalah hanya-baca, dan jika sudah diatur, eksekusi (kecuali _file_ adalah direktori, dalam hal ini direktori akan mendapatkan izin eksekusi yang diatur untuk mengizinkan pencarian direktori).

Izin pemilik berkas ACL dan izin pemilik berkas standar adalah setara; akibatnya, menggunakan **chmod** pada izin pemilik berkas setara dengan menggunakan **setfacl** pada izin pemilik berkas. **chmod** tidak berpengaruh pada pengguna bernama.

Untuk menambah atau memodifikasi grup atau ACL grup bernama:

```
[user@host ~]$ setfacl -m g:name:rw file
```
Ini mengikuti pola yang sama untuk menambahkan atau memodifikasi entri ACL pengguna. Jika _name_ dibiarkan kosong, maka nama tersebut berlaku untuk pemilik grup. Jika tidak, tentukan nama grup atau nilai GID untuk grup bernama. Pada contoh kali ini adalah izin baca(_read_) dan tulis(_write_).

**chmod** tidak berpengaruh pada perizinan grup apa pun untuk berkas dengan pengaturan ACL, tetapi akan memperbarui mask ACL.

Untuk menambah atau memodifikasi ACL _other_:

```
[user@host ~]$ setfacl -m o::- file
```
_other_ hanya menerima pengaturan izin. Pengaturan izin yang umum untuk _other_ adalah: tidak ada izin sama sekali, diatur dengan tanda strip(-); dan izin hanya-baca yang diatur seperti biasa dengan _r_. Tentu saja, Anda dapat mengatur salah satu izin standar.

ACL _other_ dan izin standar lainnya adalah setara, sehingga menggunakan **chmod** pada izin _other_ setara dengan menggunakan **setfacl** pada izin _other_.

Anda dapat menambahkan beberapa entri dengan perintah yang sama; gunakan daftar entri yang dipisahkan dengan koma:

```
[user@host ~]$ setfacl -m u::rwx,g:consultants:rX,o::- file
```
Ini mengatur pemilik file untuk membaca(_read_), menulis(_write_), dan mengeksekusi(_execute_), mengatur grup _consultants_ menjadi hanya-baca dan megeksekusi, dan membatasi semua pengguna lain(_other_)untuk tidak memiliki izin. Pemilik grup mempertahankan izin file atau ACL yang ada dan entri _other_ "bernama" tetap tidak berubah.

**Menggunakan getfacl sebagai Input**
Anda dapat menggunakan output dari **getfacl** sebagai input ke **setfacl**:

```
[user@host ~]$ getfacl file-A | setfacl --set-file=- file-B
```
Opsi _--set-file_ menerima input dari sebuah file atau dari _stdin_. Karakter tanda strip (-) menentukan penggunaan _stdin_. Dalam kasus ini, _file-B_ akan memiliki pengaturan ACL yang sama dengan _file-A_.

**Modifikasi ACL Rekursif**
Saat menetapkan ACL pada direktori, gunakan opsi _-R_ untuk menerapkan ACL secara rekursif. Ingatlah bahwa Anda mungkin ingin menggunakan izin "_X_" (huruf besar X) dengan rekursi sehingga file dengan set izin eksekusi mempertahankan pengaturan dan direktori mendapatkan set izin eksekusi untuk mengizinkan pencarian direktori. Praktik yang baik adalah menggunakan huruf besar "_X_" saat menetapkan ACL secara non-rekursif karena hal ini mencegah administrator secara tidak sengaja menambahkan izin eksekusi ke file biasa.

```
[user@host ~]$ setfacl -R -m u:name:rX directory
```
Ini menambahkan pengguna _name_ ke direktori _directory_ dan semua file dan subdirektori yang ada, mengatur izin hanya-baca dan eksekusi bersyarat.

**Menghapus ACLs**
Menghapus entri ACL tertentu mengikuti format dasar yang sama dengan operasi modifikasi, kecuali":_izin_" tidak ditentukan.

```
[user@host ~]$ setfacl -x u:name,g:name file
```
Ini hanya menghapus pengguna bernama dan grup bernama dari file atau direktori ACL. Entri ACL lain yang ada tetap aktif.

Anda dapat menyertakan operasi hapus(_-x_) dan modifikasi(_-m_) dalam operasi **setfacl** yang sama.

Mask hanya dapat dihapus jika tidak ada ACL lain yang ditetapkan (tidak termasuk ACL dasar yang tidak dapat dihapus), sehingga harus dihapus terakhir. File tidak akan lagi memiliki ACL dan **ls -l** tidak akan menampilkan tanda plus (+) di samping string izin. Atau, untuk menghapus semua entri ACL pada berkas atau direktori (termasuk ACL _default_ pada direktori), gunakan perintah berikut:

```
[user@host ~]$ setfacl -b file
```

## Mengontrol Izin File ACL Default
Untuk memastikan bahwa file dan direktori yang dibuat di dalam direktori mewarisi ACL tertentu, gunakan ACL _default_ pada direktori. Anda dapat mengatur ACL _default_ dan pengaturan ACL standar mana pun, termasuk mask _default_.

Direktori itu sendiri masih memerlukan ACL standar untuk kontrol akses karena ACL _default_ tidak mengimplementasikan kontrol akses untuk direktori tersebut; mereka hanya menyediakan dukungan pewarisan izin ACL. Sebagai contoh:

```
[user@host ~]$ setfacl -m d:u:name:rx directory
```
Ini menambahkan pengguna bernama _default_(_d:u:name_) dengan izin hanya-baca dan izin eksekusi pada subdirektori.

**Menghapus Entri ACL Default**
Hapus ACL _default_ dengan cara yang sama seperti Anda menghapus ACL standar, diawali dengan _d:_, atau gunakan opsi _-d_.

```
[user@host ~]$ setfacl -x d:u:name directory
```
Ini akan menghapus entri ACL _default_ yang telah ditambahkan pada contoh sebelumnya.

Untuk menghapus semua entri ACL _default_ pada direktori, gunakan **setfacl -k _directory_**.