Panduan

Izin akses di Linux: chmod, chown, dan sudo dengan contoh

Diperbarui: · Skillaria.Top

Izin akses di Linux ditentukan oleh tiga set rwx — untuk pemilik, grup, dan pengguna lain; diubah dengan chmod dalam bentuk simbolik (chmod u+x) atau angka (chmod 755, dengan r=4, w=2, x=1). Pemilik diubah dengan chown, dan tindakan sebagai administrator dijalankan lewat sudo; error Permission denied hampir selalu berarti pengguna Anda tidak memiliki hak yang dibutuhkan pada berkas atau pada salah satu direktori dalam path-nya.

Izin akses di Linux menjawab pertanyaan "siapa boleh melakukan apa terhadap sebuah berkas". Setiap berkas memiliki pemilik, grup, dan tiga set izin: untuk pemilik, untuk grup, dan untuk semua pihak lain. Izin diubah dengan chmod, pemilik diubah dengan chown, dan tindakan sebagai administrator dilakukan dengan sudo. Mari kita bahas cara membaca izin, mengubahnya, dan memperbaiki error Permission denied.

Cara melihat izin sebuah berkas

Izin terlihat pada keluaran ls -l:

$ ls -l
-rw-r--r-- 1 alice developers  1204 Oct 10 14:02 notes.txt
-rwxr-xr-x 1 alice developers   356 Oct 10 14:05 deploy.sh
drwxr-x--- 2 alice developers  4096 Oct 10 13:50 secrets

Sepuluh karakter pertama dibaca sebagai berikut:

  • Karakter pertama — jenis: - berkas biasa, d direktori, l tautan simbolik.
  • Karakter 2–4 — izin pemilik (user).
  • Karakter 5–7 — izin grup (group).
  • Karakter 8–10 — izin pihak lain (others).

Setelah itu ada jumlah tautan keras, pemilik (alice), grup (developers), ukuran, tanggal, dan nama. Untuk satu berkas, perintah stat juga berguna:

$ stat -c '%A %a %U:%G %n' deploy.sh
-rwxr-xr-x 755 alice:developers deploy.sh

Arti r, w, dan x

Arti izin berbeda untuk berkas dan direktori — ini sumber kebingungan utama.

IzinUntuk berkasUntuk direktori
r (read)membaca isimelihat daftar nama berkas (ls)
w (write)mengubah isimembuat, menghapus, dan mengganti nama berkas di dalamnya
x (execute)menjalankan sebagai programmasuk ke direktori (cd) dan mengakses berkas melalui path

Perhatikan: seseorang bisa menghapus berkas jika memiliki izin w dan x pada direktorinya, meskipun ia tidak boleh menulis ke berkas itu sendiri. Dan tanpa x pada direktori, berkas di dalamnya tidak bisa dibuka, walaupun izin berkasnya mengizinkan pembacaan.

Sistem memeriksa izin secara berurutan: jika Anda pemilik, berlaku izin pemilik; jika tidak, dan Anda termasuk grup berkas, berlaku izin grup; jika tidak keduanya, berlaku izin pihak lain. Pengguna root melewati pemeriksaan baca dan tulis.

Bentuk angka: 755, 644, 600

Setiap izin memiliki bobot: r = 4, w = 2, x = 1. Jumlah bobot menghasilkan angka 0 sampai 7 untuk masing-masing dari tiga set.

AngkaIzinPerhitungan
7rwx4+2+1
6rw-4+2
5r-x4+1
4r--4
0---0

Kombinasi yang umum dan sebaiknya dihafal:

ModeBentukDigunakan untuk
644rw-r--r--berkas biasa, konfigurasi, HTML
755rwxr-xr-xdirektori, skrip, dan program
600rw-------kunci privat SSH, berkas berisi kata sandi
700rwx------direktori ~/.ssh, direktori pribadi
640rw-r-----konfigurasi yang dibaca oleh grup layanan
777rwxrwxrwxsemua boleh semuanya — hampir tidak pernah dibutuhkan

Perintah chmod: mengubah izin

Mode angka

Bentuk angka menetapkan izin secara utuh:

chmod 644 index.html
chmod 755 deploy.sh
chmod 600 ~/.ssh/id_ed25519

Mode simbolik

Bentuk simbolik mengubah izin secara spesifik tanpa menyentuh yang lain. Untuk siapa: u pemilik, g grup, o pihak lain, a semua. Tindakan: + menambah, - mengurangi, = menetapkan persis.

chmod +x deploy.sh        # izinkan menjalankan
chmod u+x,g-w file        # pemilik boleh menjalankan, grup tidak boleh menulis
chmod o-rwx secrets/      # pihak lain tidak mendapat apa pun
chmod g=rx app/           # grup hanya boleh membaca dan masuk

Rekursif: berkas dan direktori diperlakukan berbeda

Opsi -R menerapkan izin ke seluruh pohon. Namun chmod -R 755 membuat semua berkas dapat dieksekusi, yang biasanya tidak diinginkan. Lebih baik pisahkan berkas dan direktori dengan find:

find /srv/site -type d -exec chmod 755 {} +
find /srv/site -type f -exec chmod 644 {} +

Ada juga cara singkat: huruf kapital X hanya menambahkan hak eksekusi pada direktori dan berkas yang sudah memilikinya.

chmod -R u=rwX,go=rX /srv/site

Perintah chown: mengubah pemilik dan grup

Hanya root yang boleh mengganti pemilik berkas, sehingga chown hampir selalu dijalankan dengan sudo.

sudo chown alice report.txt               # pemilik
sudo chown alice:developers report.txt    # pemilik dan grup
sudo chown :www-data index.html           # hanya grup
sudo chown -R www-data:www-data /var/www/site

Untuk mengganti grup saja tersedia perintah chgrp: sudo chgrp developers report.txt. Grup Anda sendiri ditampilkan oleh id atau groups.

$ id
uid=1000(alice) gid=1000(alice) groups=1000(alice),27(sudo),1001(developers)

Untuk menambahkan pengguna ke grup gunakan sudo usermod -aG developers bob. Opsi -a wajib: tanpanya, pengguna akan dikeluarkan dari semua grup tambahannya yang lain. Grup baru aktif setelah pengguna masuk kembali.

sudo: tindakan sebagai administrator

sudo menjalankan satu perintah dengan hak root (atau pengguna lain) dan meminta kata sandi Anda sendiri, bukan kata sandi root. Setiap pemanggilan dicatat dalam log, sehingga terlihat siapa melakukan apa.

sudo apt update
sudo systemctl restart nginx
sudo -u postgres psql       # sebagai pengguna postgres
sudo -i                     # shell root interaktif
sudo -l                     # apa saja yang diizinkan untuk saya

Siapa diizinkan melakukan apa diatur dalam /etc/sudoers dan berkas di direktori /etc/sudoers.d/. Ubah berkas-berkas ini hanya dengan sudo visudo: ia memeriksa sintaks, dan kesalahan dalam berkas tidak akan menghilangkan akses sudo Anda. Di Ubuntu, hak sudo diberikan dengan menjadi anggota grup sudo; di sistem keluarga RHEL, melalui grup wheel.

# /etc/sudoers.d/deploy — pengguna deploy hanya boleh me-restart nginx
deploy ALL=(root) NOPASSWD: /usr/bin/systemctl restart nginx

Mengapa sudo echo > file tidak berfungsi

Jebakan yang sering terjadi:

$ sudo echo "127.0.0.1 test.local" >> /etc/hosts
bash: /etc/hosts: Permission denied

Pengalihan >> dilakukan oleh shell Anda, bukan oleh sudo, sehingga berkas dibuka tanpa hak root. Cara yang benar adalah lewat tee:

echo "127.0.0.1 test.local" | sudo tee -a /etc/hosts

Permission denied: penyebab dan cara memperbaikinya

Error Permission denied berarti kernel menolak operasi proses Anda. Langkah diagnosisnya selalu sama: siapa saya (id), siapa pemilik dan apa izinnya (ls -l), dan apa izin pada setiap direktori di path (namei -l).

$ namei -l /srv/app/config/app.env
f: /srv/app/config/app.env
drwxr-xr-x root  root  /
drwxr-xr-x root  root  srv
drwxr-x--- deploy deploy app
drwxr-xr-x deploy deploy config
-rw-r----- deploy deploy app.env

Di sini terlihat bahwa direktori app tertutup bagi pihak lain — pengguna yang bukan anggota grup deploy tidak bisa melewatinya, berapa pun izin pada berkasnya sendiri.

Skrip tidak bisa dijalankan

$ ./deploy.sh
bash: ./deploy.sh: Permission denied

Berkas belum memiliki izin eksekusi. Solusinya chmod +x deploy.sh, atau jalankan lewat interpreter: bash deploy.sh. Jika partisi di-mount dengan opsi noexec (ini sering terjadi pada /tmp), berkas tidak bisa dijalankan langsung, dan hanya cara kedua yang berhasil.

Tidak bisa menulis ke direktori sistem

Berkas di /etc, /usr, dan /var/www dimiliki oleh root atau pengguna layanan. Gunakan sudo untuk perubahan sekali jalan, dan untuk pekerjaan rutin berikan izin kepada grup, bukan kepada semua orang.

Web server mengembalikan 403

Nginx atau Apache berjalan sebagai pengguna www-data (di Debian dan Ubuntu). Ia membutuhkan izin baca pada berkas dan x pada semua direktori di path. Perbaikannya: sudo chown -R www-data:www-data /var/www/site, atau izin 755 untuk direktori dan 644 untuk berkas.

SSH tidak menerima kunci

SSH menolak memakai kunci yang izinnya terlalu terbuka. Kunci privat harus berizin 600, direktori ~/.ssh berizin 700, dan berkas authorized_keys di server berizin 600.

chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519 ~/.ssh/authorized_keys

Tidak bisa mengakses Docker

Pesan permission denied while trying to connect to the Docker daemon socket berarti Anda tidak berada di grup docker. Jalankan sudo usermod -aG docker $USER lalu masuk ulang ke sistem. Perlu diingat, keanggotaan di grup ini pada praktiknya setara dengan hak root.

Mengapa chmod 777 adalah ide buruk

Saran "cukup jalankan chmod 777" memang menghilangkan error, tetapi membuka berkas untuk ditulis oleh setiap pengguna dan proses di sistem. Jika aplikasi web diretas, penyerang bisa mengubah berkas-berkas tersebut. Jalan yang benar adalah mencari tahu pengguna mana yang memerlukan akses, lalu memberi hak kepada pengguna itu — melalui pemilik atau grup.

umask: izin default

Berkas baru mendapat izin yang dikurangi oleh umask. Dengan nilai umum 022, berkas dibuat dengan izin 644 dan direktori dengan 755.

$ umask
0022

Kesimpulan

Izin akses di Linux terdiri dari tiga set rwx untuk pemilik, grup, dan pihak lain. chmod mengubah izin dalam bentuk angka (755, 644, 600) atau simbolik, chown mengubah pemilik, dan sudo menjalankan satu perintah sebagai root. Saat muncul error Permission denied, periksa pengguna Anda, izin berkas, dan izin setiap direktori dalam path, dan jangan menyelesaikannya dengan 777. Pengguna, grup, izin, dan sudo dibahas secara lengkap dengan praktik dalam kursus Linux.

Pertanyaan umum

Apa arti chmod 755?

Pemilik boleh membaca, menulis, dan menjalankan (7); grup dan pihak lain boleh membaca dan menjalankan (5). Ini kombinasi standar untuk direktori dan skrip.

Apa bedanya chmod dengan chown?

chmod mengubah izin (apa yang boleh dilakukan terhadap berkas), sedangkan chown mengubah pemilik dan grup (siapa pemilik izin tersebut).

Bagaimana cara memberi pengguna hak sudo?

Di Ubuntu dan Debian, tambahkan pengguna ke grup sudo dengan sudo usermod -aG sudo nama; di sistem keluarga RHEL, tambahkan ke grup wheel. Perubahan berlaku setelah pengguna masuk ulang.

Apa arti izin 4755 dan bit SUID?

Angka 4 di depan mengaktifkan SUID: program dijalankan dengan hak pemilik berkas, bukan hak orang yang menjalankannya. Contohnya passwd; di keluaran ls, huruf x pada pemilik berubah menjadi s.

Mengapa root bisa membaca berkas dengan izin 000?

Kernel tidak memeriksa izin baca dan tulis biasa untuk root. Pembatasan terhadap root hanya bisa dilakukan dengan mekanisme lain, misalnya SELinux, AppArmor, atau atribut chattr +i.

Pelajari topik ini lewat video

Topik ini dibahas mendalam dengan praktik di kursus “Linux: с нуля до уверенного администрирования”.

Ke kursus