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!)
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
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
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
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) |
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
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:
- Filesystem di-mount dengan
noexec,nosuid, atauro - SELinux atau AppArmor memblokir
- 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:
- Minimal privilege - berikan permission sekecil mungkin
- 755 untuk direktori, 644 untuk file - standar yang aman
- SSH private key HARUS 600 - tidak ada toleransi
- Gunakan ACL untuk kebutuhan permission kompleks
- Special bits
(
SUID/SGID/Sticky) untuk kasus spesifik - chattr +i untuk proteksi file dari perubahan, bahkan oleh root
"If you can't explain the permissions on your file, they're probably wrong."