TDCTF Academy Logo TDCTF ACADEMY

File Permissions (Linux)

Panduan lengkap permission dan ownership file di Linux.


Dasar Permission Linux

Setiap file dan direktori di Linux memiliki 3 tipe permission untuk 3 kategori pengguna:

Kategori Keterangan
u (user) Pemilik file
g (group) Grup pemilik file
o (others) Semua pengguna lain

Tiga tipe permission:

Permission Simbol Numerik untuk File untuk Direktori
Read r 4 Membaca isi file Membaca daftar isi (ls)
Write w 2 Mengubah isi file Membuat/hapus file di dalamnya
Execute x 1 Menjalankan file Masuk direktori (cd)

Membaca Permission dengan ls -l

ls -l
# -rwxr-xr-x 1 user group 1024 Jun 22 10:00 script.sh
# ^^^^^^^^^
# |||||||||
# ||||||||+--- others: r-x (read + execute)
# |||||||+------ group: r-x (read + execute)
# ||||||+------- user: rwx (read + write + execute)
# |||||+-------- extended attribute
# ++++---------- tipe file (-=file, d=dir, l=symlink)

Mode Numerik (Octal)

Setiap permission punya nilai numerik:

Nilai Permission
0 ---
1 --x
2 -w-
3 -wx
4 r--
5 r-x
6 rw-
7 rwx

Format: chmod [user][group][others] file

chmod 755 script.sh # rwxr-xr-x
# user=7 (rwx), group=5 (r-x), others=5 (r-x)

chmod 644 index.html # rw-r--r--
chmod 700 private.key # rwx------
chmod 777 public_dir # rwxrwxrwx (tidak disarankan!)
peringatan

chmod 777 memberikan akses penuh ke semua orang. Hampir tidak pernah diperlukan dan merupakan risiko keamanan. Gunakan 755 atau 750 sebagai gantinya.

Kombinasi Umum

chmod 755 file # Script/direktori: owner bisa tulis, lainnya baca+exec
chmod 644 file # File reguler: owner bisa tulis, lainnya baca
chmod 600 file # Private: hanya owner bisa baca+tulis
chmod 700 file # Private: hanya owner bisa baca+tulis+exec
chmod 750 file # Grup bisa baca+exec, others tidak punya akses
chmod 640 file # Owner tulis, grup baca, others tidak

Mode Symbolic

Mengubah permission dengan operator + (tambah), - (hapus), = (set):

# Tambah execute untuk semua
chmod +x script.sh

# Tambah write untuk owner
chmod u+w file.txt

# Hapus write untuk group dan others
chmod go-w file.txt

# Set others hanya read
chmod o=r file.txt

# Tambah execute untuk owner dan group
chmod ug+x script.sh

# Kombinasi
chmod u+rwx,g+rx,o-rwx script.sh

Operator:

Operator Fungsi
+ Tambah permission
- Hapus permission
= Set permission tepat

chown - Mengubah Ownership

# Ubah user pemilik
sudo chown user file.txt

# Ubah user dan grup
sudo chown user:group file.txt

# Ubah grup saja
sudo chown :group file.txt

# Recursive (semua file di dalam direktori)
sudo chown -R www-data:www-data /var/www/html

# Referensi dari file lain
sudo chown --reference=source.txt target.txt
tip

Gunakan chown -R dengan hati-hati - operasi recursive bisa mengubah ribuan file sekaligus.


Special Bits

SUID (Set User ID) - 4000 / u+s

File yang di-set SUID akan dijalankan dengan privilege pemilik file, bukan pengguna yang menjalankannya.

# Set SUID
chmod u+s /usr/bin/program
chmod 4755 program # 4 = SUID

# Cari file SUID (potensial privilege escalation)
find / -perm /4000 2>/dev/null

# Contoh umum
ls -l /usr/bin/passwd # -rwsr-xr-x (s pada posisi user x)

SGID (Set Group ID) - 2000 / g+s

Untuk file: dijalankan dengan privilege grup pemilik. Untuk direktori: file baru di dalamnya mewarisi grup direktori.

# Set SGID
chmod g+s /shared/dir
chmod 2755 shared_dir # 2 = SGID

# Cek
ls -ld /shared/dir # drwxr-sr-x (s pada posisi group x)

# Berguna untuk direktori kolaborasi
sudo mkdir /project
sudo chown :developer /project
sudo chmod 2775 /project

Sticky Bit - 1000 / +t

Hanya pemilik file (atau root) yang bisa menghapus file di dalam direktori - meskipun direktori writable untuk semua.

# Set sticky bit
chmod +t /tmp
chmod 1777 /tmp # 1 = sticky bit

# Contoh klasik
ls -ld /tmp # drwxrwxrwt (t pada posisi others x)
ls -ld /var/tmp
tip

Sticky bit sangat penting untuk direktori bersama seperti /tmp dan /var/tmp - mencegah user sembarangan menghapus file milik orang lain.

Kombinasi Special Bits

chmod 6755 file # SUID + SGID + rwxr-xr-x
chmod 5777 dir # SUID + sticky + rwxrwxrwx (jarang)

Umask - Default Permission

Umask menentukan permission default untuk file/direktori baru. Ini adalah mask yang dikurangkan dari permission maksimum.

# Cek umask saat ini
umask
# Output: 0022

# File default: 666 - umask = 666 - 022 = 644 (rw-r--r--)
# Dir default: 777 - umask = 777 - 022 = 755 (rwxr-xr-x)
umask File result Dir result Use Case
0000 666 (rw-rw-rw-) 777 (rwxrwxrwx) Tidak aman
0002 664 (rw-rw-r--) 775 (rwxrwxr-x) Kolaborasi grup
0022 644 (rw-r--r--) 755 (rwxr-xr-x) Default Ubuntu
0027 640 (rw-r-----) 750 (rwxr-x---) Server ketat
0077 600 (rw-------) 700 (rwx------) Paling ketat
# Set umask untuk session ini
umask 0027

# Set permanent (tambah ke ~/.bashrc atau ~/.profile)
echo "umask 0027" >> ~/.bashrc

ACL (Access Control Lists)

ACL memberikan permission granular yang lebih detail dari rwx standar.

# Install ACL
sudo apt install acl

# Cek ACL pada file
getfacl file.txt

# Set ACL: beri user john akses baca+tulis
setfacl -m u:john:rw file.txt

# Set ACL: beri grup developer akses baca+exec
setfacl -m g:developer:rx /project

# Hapus ACL user
setfacl -x u:john file.txt

# Hapus semua ACL
setfacl -b file.txt

# Recursive
setfacl -R -m u:john:rx /shared/dir

# Default ACL (otomatis untuk file baru di direktori)
setfacl -d -m g:developer:rwx /shared/dir
tip

ACL sangat berguna untuk shared directory di server. Gunakan getfacl untuk debugging - ini menunjukkan permission yang sebenarnya, bukan hanya rwx dasar.


Atribut File (chattr / lsattr)

Atribut file adalah lapisan keamanan tambahan di level filesystem (ext4, xfs, btrfs).

# Lihat atribut
lsattr file.txt

# Buat file immutable (tidak bisa diubah/dihapus, bahkan oleh root)
sudo chattr +i /etc/important.conf

# Buat file append-only (hanya bisa ditambah, tidak diedit/dihapus)
sudo chattr +a /var/log/secure.log

# Hapus atribut immutable
sudo chattr -i /etc/important.conf

# Recursive
sudo chattr -R +i /etc/backup/
Atribut Efek
+i Immutable - tidak bisa diubah, dihapus, rename
+a Append only - hanya bisa ditambah
+u Undeletable - bisa dipulihkan setelah dihapus
+e Extent format (default di ext4)
peringatan

Atribut +i sangat kuat - bahkan root tidak bisa mengubah file. Pastikan Anda ingat sebelum menghapusnya!


Contoh Skenario

1. Web Directory (Nginx/Apache)

sudo mkdir -p /var/www/mysite
sudo chown -R www-data:www-data /var/www/mysite
sudo find /var/www/mysite -type d -exec chmod 755 {} \;
sudo find /var/www/mysite -type f -exec chmod 644 {} \;

# Upload directory (jika perlu writable)
sudo chmod 775 /var/www/mysite/uploads
sudo chown www-data:www-data /var/www/mysite/uploads

# Script executable
sudo chmod +x /var/www/mysite/deploy.sh

2. SSH Directory (Keamanan Maksimum)

# Direktori .ssh
chmod 700 ~/.ssh

# Private key (rahasia!)
chmod 600 ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_ed25519

# Public key (aman dibagikan)
chmod 644 ~/.ssh/id_rsa.pub

# Authorized keys
chmod 600 ~/.ssh/authorized_keys

# Config file
chmod 600 ~/.ssh/config
peringatan

Permission SSH yang salah adalah penyebab paling umum "SSH connection refused" atau "Permissions 0644 for 'id_rsa' are too open". Private key WAJIB 600.

3. Shared Directory dengan ACL

# Buat direktori kolaborasi
sudo mkdir -p /shared/project
sudo chown root:developers /shared/project
sudo chmod 775 /shared/project
sudo chmod g+s /shared/project

# ACL: user tertentu akses penuh
sudo setfacl -m u:alice:rwx /shared/project
sudo setfacl -m u:bob:rwx /shared/project

# ACL: user lain read-only
sudo setfacl -m u:charlie:rx /shared/project

# Default ACL untuk file baru
sudo setfacl -d -m u:alice:rwx /shared/project
sudo setfacl -d -m g:developers:rwx /shared/project

# Verifikasi
getfacl /shared/project

4. Script Executable

# Buat script
cat > backup.sh << 'EOF'
#!/bin/bash
echo "Backup running..."
EOF

# Beri execute permission
chmod +x backup.sh

# Atau untuk semua user
chmod 755 backup.sh

# Jalankan
./backup.sh

Troubleshooting

"Permission denied"

# Cek permission file
ls -la file.txt

# Cek permission direktori parent
ls -la /path/to/

# Coba dengan sudo jika file milik root
sudo cat /var/log/syslog

"Operation not permitted"

File memiliki atribut immutable atau Anda tidak punya kapabilitas:

# Cek atribut
lsattr file.txt

# Jika ada +i, hapus dulu
sudo chattr -i file.txt

# Atau file sedang digunakan
lsof file.txt

"Permission denied" meskipun chmod 777

Kemungkinan:

  1. Filesystem di-mount dengan noexec, nosuid, atau ro
  2. SELinux atau AppArmor memblokir
  3. Filesystem read-only
# Cek mount options
mount | grep /path

# Cek SELinux
ls -Z file.txt
getenforce

# Cek AppArmor
sudo aa-status

SSH Permission Error

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: UNPROTECTED PRIVATE KEY FILE! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for 'id_rsa' are too open.

Solusi:

chmod 600 ~/.ssh/id_rsa
chmod 700 ~/.ssh

Mencari File dengan Permission Spesifik

# Cari semua file SUID (potensi privilege escalation)
find / -perm /4000 -type f 2>/dev/null

# Cari semua file SGID
find / -perm /2000 -type f 2>/dev/null

# Cari file world-writable (risiko keamanan)
find / -perm /o+w -type f 2>/dev/null

# Cari direktori world-writable tanpa sticky bit
find / -perm /o+w -type d ! -perm /1000 2>/dev/null

# Cari direktori dengan permission longgar
find / -type d -perm /o+rwx 2>/dev/null

# Cari file yang bukan milik user/grup valid
find / -nouser -o -nogroup 2>/dev/null

Ringkasan Perintah Cepat

Perintah Fungsi
ls -la Lihat permission semua file
chmod 755 file Set permission numeric
chmod u+x file Tambah execute untuk owner
chown user:group file Ubah ownership
chown -R user dir Ubah ownership recursive
umask Cek default permission mask
setfacl -m u:user:rwx file Set ACL
getfacl file Lihat ACL
chattr +i file Buat file immutable
lsattr file Lihat atribut file
find / -perm /4000 Cari file SUID

Kesimpulan

Memahami file permission Linux adalah fondasi keamanan sistem. Poin-poin penting:

  1. Minimal privilege - berikan permission sekecil mungkin
  2. 755 untuk direktori, 644 untuk file - standar yang aman
  3. SSH private key HARUS 600 - tidak ada toleransi
  4. Gunakan ACL untuk kebutuhan permission kompleks
  5. Special bits (SUID/SGID/Sticky) untuk kasus spesifik
  6. chattr +i untuk proteksi file dari perubahan, bahkan oleh root

"If you can't explain the permissions on your file, they're probably wrong."

PADA HALAMAN INI