SSD Nodes Learn Hosting plans →
Panduan Matt ConnorOleh Matt Connor

Arti drwxr-xr-x di Linux dan Mode 755

Pahami drwxr-xr-x satu karakter demi satu hingga menjadi 755, arti x pada direktori sebagai akses lintas, dan mengapa chmod 777 bukan solusi yang tepat.

Arti drwxr-xr-x

drwxr-xr-x menjelaskan direktori yang dapat diubah oleh pemiliknya, sedangkan pengguna lain hanya dapat membaca dan mengaksesnya tanpa mengubah apa pun. Dalam notasi oktal, mode tersebut adalah 755. Linux menampilkan sepuluh karakter ini di awal setiap baris keluaran ls -l, dan artinya selalu sama dalam urutan yang sama. Jadi, mempelajari satu string ini membantu Anda memahami semuanya.

Ada satu aturan yang harus dipahami terlebih dahulu karena aturan ini menentukan apakah pengujian Anda sendiri memberikan informasi yang berguna. Pengguna root mengabaikan bit izin. Kernel memberikan kemampuan CAP_DAC_OVERRIDE kepada root (penggantian kontrol akses diskresioner), sehingga root dapat membuka file yang modenya melarang akses tersebut. Semua contoh di halaman ini berhasil jika dijalankan sebagai root, apa pun bit izinnya. Login sebagai pengguna biasa jika Anda ingin mengamati cara kerja aturan tersebut.

Sepuluh karakter, satu per satu

Buat direktori dan file untuk diperiksa. Tidak ada perintah di sini yang menyentuh apa pun di luar direktori baru tersebut.

mkdir -p ~/permdemo/inner
printf 'hello\n' > ~/permdemo/inner/notes.txt
ls -ld ~/permdemo ~/permdemo/inner ~/permdemo/inner/notes.txt

Dengan umask default yang umum, yaitu 022, dua baris direktori dimulai dengan drwxr-xr-x dan baris file dimulai dengan -rw-r--r--.

Karakter 1 menunjukkan jenis file, bukan permission. d adalah direktori. - adalah file biasa. l adalah symbolic link. c dan b adalah node perangkat karakter dan blok. s adalah socket, sedangkan p adalah named pipe. Karakter ini berada di luar nilai oktal. Karena itu, drwxr-xr-x menjadi 755, bukan nilai yang diawali d.

Sembilan karakter setelahnya terdiri atas tiga kelompok yang masing-masing berisi tiga karakter. Urutannya selalu sama.

  • Karakter 2 sampai 4 adalah triad owner, yaitu bit yang berlaku untuk user pemilik file.
  • Karakter 5 sampai 7 adalah triad group, yaitu bit yang berlaku untuk group file.
  • Karakter 8 sampai 10 adalah triad other, yaitu bit yang berlaku untuk pengguna lainnya.

Di dalam sebuah triad, slotnya selalu r, lalu w, kemudian x. Tanda hubung berarti bit tersebut nonaktif. Posisi huruf tidak pernah berubah. r-x berarti read tanpa write. -w- berarti write tanpa read. Konfigurasi ini valid, tetapi jarang digunakan.

Jadi, drwxr-xr-x dapat diuraikan sebagai berikut: d untuk direktori, lalu rwx untuk owner, kemudian r-x untuk group, dan terakhir r-x untuk other.

Beberapa sistem menampilkan karakter kesebelas. Titik di akhir, drwxr-xr-x., berarti file memiliki konteks SELinux (security enhanced Linux). Distribusi yang menggunakan SELinux, seperti Fedora dan Rocky, secara default menampilkan konteks ini. Tanda plus di akhir, drwxr-xr-x+, berarti file memiliki POSIX ACL (access control list), yaitu kumpulan aturan tambahan di luar sembilan bit tersebut. Baca aturan tambahan itu dengan getfacl <path>.

r, w, dan x memiliki fungsi berbeda pada direktori

Ini adalah aturan pertama yang sering disalahpahami pemula. Hurufnya sama pada file dan direktori. Hak akses yang diberikan berbeda.

  • r pada file membaca isinya. r pada direktori menampilkan nama-nama di dalamnya, yang diperlukan oleh ls biasa.
  • w pada file mengubah isinya. w pada direktori menambahkan dan menghapus entri di dalamnya. Menghapus file berarti mengubah direktori, jadi write pada direktori yang menentukan, sedangkan mode file itu sendiri tidak berpengaruh.
  • x pada file menjalankannya sebagai program. x pada direktori melakukan traversal, yaitu kernel dapat menemukan satu nama di dalamnya saat melakukan pencarian path.

Traversal adalah bagian yang sering mengejutkan pengguna. x pada direktori tidak menjalankan apa pun. Untuk membuka /srv/site/index.html, diperlukan x pada /, lalu x pada /srv, kemudian x pada /srv/site, dan terakhir r pada file. Jika salah satu direktori dalam rangkaian tersebut tidak memiliki x untuk Anda, pencarian berhenti di sana, dan pemanggil menerima Permission denied untuk seluruh path, meskipun file di ujung path dapat dibaca oleh semua pengguna. namei -l /srv/site/index.html menampilkan setiap langkah dalam rangkaian tersebut beserta mode dan pemiliknya, sehingga Anda dapat melihat bagian yang menghentikan pencarian.

Direktori dengan r tanpa x adalah kondisi setengah yang tidak lazim dan perlu dikenali. Pengguna biasa dapat menampilkan nama-namanya karena itulah hak akses yang diberikan oleh r, tetapi tidak dapat melakukan stat pada entri mana pun. Akibatnya, ls -l mengisi kolom ukuran dan mode dengan tanda tanya, lalu menampilkan ls: cannot access ...: Permission denied untuk setiap entri.

Mengubah huruf menjadi 755

Setiap triad adalah bilangan tiga bit. r bernilai 4, w bernilai 2, dan x bernilai 1. Jumlahkan bit yang aktif.

  • rwx bernilai 4 + 2 + 1 = 7
  • rw- bernilai 4 + 2 = 6
  • r-x bernilai 4 + 1 = 5
  • r-- bernilai 4
  • --- bernilai 0

Dengan demikian, drwxr-xr-x bernilai 7 untuk owner, 5 untuk group, dan 5 untuk other: 755. -rw-r--r-- bernilai 6, 4, 4: 644. drwxrwxr-x bernilai 7, 7, 5: 775, yaitu 755 dengan izin write yang ditambahkan untuk group. Anda tidak perlu menghitung karakter secara manual karena stat menampilkan kedua bentuk sekaligus.

stat -c '%A %a %U %G %n' ~/permdemo ~/permdemo/inner/notes.txt

%A adalah bentuk huruf, %a adalah bentuk oktal, sedangkan %U dan %G menunjukkan owning user dan owning group.

String izin yang sering dicari

Berikut adalah mode yang Anda temui pada server nyata, beserta nilai oktalnya dan penggunaannya.

  • -rw-r--r-- adalah 644. File biasa yang hanya dibaca oleh suatu service, seperti file konfigurasi atau halaman HTML.
  • -rw------- adalah 600. Data rahasia, seperti private key SSH atau file .env milik aplikasi.
  • -rw-rw-r-- adalah 664. File dalam direktori yang digunakan bersama oleh suatu grup, ketika anggota tim perlu memiliki akses tulis.
  • -rwxr-xr-x adalah 755. Script dan binary, seperti /usr/local/bin/backup.sh dan sebagian besar /usr/bin.
  • -rwx------ adalah 700. Script privat yang hanya dapat dijalankan oleh pemiliknya.
  • drwxr-xr-x adalah 755. Hampir semua direktori sistem dan document root situs web.
  • drwx------ adalah 700. ~/.ssh dan direktori home pada server dengan akses yang diperketat.
  • drwxrwxr-x adalah 775. Direktori yang dapat ditulisi oleh grup pemiliknya.
  • drwxrwsr-x adalah 2775. Sama seperti sebelumnya, ditambah bit setgid, sehingga file baru di dalamnya mewarisi grup direktori tersebut.
  • drwxrwxrwt adalah 1777. /tmp. t terakhir adalah sticky bit, sehingga pengguna hanya dapat menghapus file miliknya sendiri.
  • -rwsr-xr-x adalah 4755. Binary setuid yang berjalan sebagai pemiliknya, seperti /usr/bin/passwd dan /usr/bin/sudo.
  • -rw-rw-rw- adalah 666, sedangkan drwxrwxrwx adalah 777. Dapat ditulis oleh semua pengguna, yang pada server hampir selalu merupakan kesalahan.
  • lrwxrwxrwx adalah nilai yang ditampilkan oleh setiap symbolic link. Linux mengabaikan bit mode pada link dan memeriksa targetnya, sehingga string ini sama sekali tidak memiliki arti.

Triad yang berlaku untuk Anda

Berikut adalah aturan kedua yang sering disalahpahami pemula. Kernel memilih tepat satu triad, lalu berhenti.

Jika ID pengguna Anda sama dengan pemilik file, Anda mendapatkan triad pemilik, dan bit grup serta bit other tidak pernah diperiksa. Jika tidak, dan grup file merupakan salah satu grup Anda, Anda mendapatkan triad grup. Jika tidak, Anda mendapatkan triad other.

Ada dua konsekuensi. Triad pemilik tetap berlaku meskipun merupakan triad yang paling membatasi. File dengan mode 0466, yang ditampilkan sebagai -r--rw-rw-, hanya memberikan izin baca kepada pemiliknya, sedangkan semua pengguna lain dapat menulis, karena pemeriksaan pemilik cocok terlebih dahulu dan tidak ada bagian setelahnya yang diperiksa. Ini valid, tetapi biasanya membingungkan saat pertama kali ditemui.

Triad grup dipilih berdasarkan grup file, bukan berdasarkan daftar grup yang Anda ikuti. ls -l menampilkan dua nama pada setiap baris: pemilik, lalu grup. Hanya grup kedua tersebut yang berpengaruh pada file itu. Keanggotaan dalam dua puluh grup hanya membantu jika file tersebut menggunakan salah satunya.

id
stat -c '%U %G %A %n' ~/permdemo/inner/notes.txt

id menampilkan pengguna Anda dan setiap grup yang Anda ikuti. stat menampilkan pemilik dan grup file. Bandingkan keduanya untuk mengetahui triad yang akan digunakan kernel bagi Anda.

Karena itu, direktori bersama biasanya diberi grup dan bit setgid. sudo chmod 2775 /srv/shared ditampilkan sebagai drwxrwsr-x, dan file yang dibuat di dalamnya kemudian mewarisi grup direktori, bukan grup pribadi pembuatnya. Subdirektori baru juga mendapatkan bit setgid. Setgid menetapkan grup, bukan mode. Dengan umask default 022, file baru di dalamnya tetap memiliki mode 644, sehingga anggota tim dapat membacanya tetapi tidak dapat menulisnya. Izin tulis untuk grup memerlukan umask 002 bagi setiap pengguna yang bekerja di sana, atau default ACL pada direktori, yang menggantikan umask untuk file yang dibuat di dalamnya. Memberikan setiap service akun sendiri adalah bagian lain dari pembahasan ini, dan dijelaskan dalam satu pengguna Linux untuk setiap service pada VPS.

umask menentukan mode setiap file baru

File baru tidak mengambil mode dari Anda. File tersebut mengambil mode dari program yang membuatnya, dikurangi bit yang dihapus oleh umask Anda. Umask adalah mask bit yang akan dihapus, sehingga umask yang lebih besar menghasilkan file yang lebih privat.

Sebagian besar distribusi menyediakan nilai 022. Program yang membuat file biasa biasanya meminta 0666. Program yang membuat direktori biasanya meminta 0777. Umask menghapus 022 dari kedua permintaan tersebut, sehingga file memiliki mode 644 dan direktori memiliki mode 755. Inilah pasangan mode yang umum ditemukan pada VPS baru.

umask
umask -S
touch ~/permdemo/new.txt && mkdir -p ~/permdemo/newdir
ls -ld ~/permdemo/new.txt ~/permdemo/newdir

umask -S menampilkan nilai yang sama dalam bentuk huruf, sehingga lebih mudah dibaca daripada 0022. Tetapkan umask 027 di ~/.profile untuk default yang lebih ketat: 640 pada file dan 750 pada direktori. Dengan demikian, group Anda dapat membaca pekerjaan Anda, sedangkan pengguna lain tidak dapat mengaksesnya. Hasil tersebut mengasumsikan permintaan 0666 dan 0777 yang umum.

Ada dua batasan penting. Umask hanya dapat menghapus bit, bukan menambahnya. File yang diminta dengan mode 0666, seperti yang diminta oleh touch, tidak akan pernah dapat dieksekusi, apa pun nilai yang Anda tetapkan. Program yang meminta akses hanya untuk owner juga tetap mempertahankan pembatasan tersebut: mktemp membuat file dengan mode 600 dan direktori dengan mode 700, baik dengan umask 022 maupun 027. Selain itu, service systemd tidak pernah membaca profil shell Anda. Karena itu, tetapkan nilai tersebut di file unit.

[Service]
UMask=0027

Ada satu kasus yang sepenuhnya melewati umask. Jika direktori induk memiliki default ACL, umask diabaikan dan bit izin file baru diambil dari ACL yang diwariskan.

Mengapa file web menggunakan 644 dan direktori web menggunakan 755

Web server berjalan dengan account-nya sendiri, yaitu www-data pada Debian dan Ubuntu, serta nginx pada Rocky dan Alma. Proses tersebut memerlukan izin baca pada file yang dilayaninya dan izin traverse pada direktori di atasnya. Proses tersebut tidak perlu menulis ke file atau direktori itu, dan static site seharusnya tidak mengizinkannya.

Mode 644 pada file memberikan izin tulis kepada owner dan izin baca kepada semua pengguna. Dengan demikian, deploy user dapat memublikasikan file dan web user dapat melayaninya. Mode 755 pada direktori memberikan izin tulis kepada owner dan izin traverse kepada semua pengguna. Dengan demikian, web user dapat menelusuri path tersebut tanpa dapat menambahkan atau menghapus apa pun. Jika terdapat bug pada aplikasi, bug tersebut tidak dapat menulis ulang halaman yang sedang dilayaninya.

Aturan traverse menjadi penyebab masalah di sini. Jika site berada di /home/deploy/site, /home/deploy menggunakan mode 750, dan web user tidak berada dalam group direktori tersebut, web user sama sekali tidak dapat memasuki home directory. Request kemudian berakhir dengan HTTP 403, disertai baris seperti berikut dalam /var/log/nginx/error.log:

open() "/home/deploy/site/index.html" failed (13: Permission denied), client: 203.0.113.5

Angka 13 tersebut adalah EACCES, yaitu penolakan izin dari kernel. Tidak ada masalah pada network: port sedang listening dan request sudah tiba. Hal inilah yang sering membingungkan saat Anda masih mempelajari cara kerja port listening di Linux. Jalankan namei -l /home/deploy/site/index.html, lalu telusuri rantainya untuk menemukan direktori pertama yang tidak memiliki x untuk other.

Direktori yang digunakan aplikasi untuk menulis, seperti path upload, merupakan pengecualian. Berikan izin tersebut melalui ownership, bukan dengan memperluas mode: sudo chown -R www-data:www-data /srv/site/uploads, dan pertahankan mode pada 755. Batasi akses tulis hanya pada direktori yang memerlukannya.

chmod tanpa meratakan seluruh tree

chmod memiliki dua bentuk. Notasi oktal menetapkan kesembilan bit sekaligus: chmod 644 notes.txt. Notasi simbolik hanya mengubah bagian yang Anda sebutkan dan membiarkan bagian lainnya tetap: chmod u+x deploy.sh menambahkan izin eksekusi untuk owner, sedangkan chmod go-w notes.txt menghapus izin tulis dari group dan other.

Rekursi dapat merusak tree. chmod -R 755 . menandai setiap image dan setiap file konfigurasi sebagai executable karena chmod tidak dapat membedakan script dari JPEG. Gunakan huruf kapital X sebagai gantinya.

chmod -R u=rwX,go=rX ~/permdemo
stat -c '%a %n' ~/permdemo ~/permdemo/inner/notes.txt

X dengan huruf kapital menerapkan izin eksekusi pada direktori dan pada file yang sebelumnya sudah memiliki bit eksekusi di salah satu bagiannya. Direktori akan menjadi 755, file biasa menjadi 644, dan script yang sebelumnya sudah executable tetap demikian. Jika sebuah file sudah memiliki mode yang benar, chmod --reference=good.sh other.sh menyalin mode tersebut.

Pesan yang muncul ketika bit tidak benar

bash: ./deploy.sh: Permission denied berarti skrip tidak memiliki bit x untuk triad yang berlaku bagi Anda, atau ada direktori pada path-nya yang tidak memiliki x. chmod u+x deploy.sh memperbaiki kasus pertama.

bash: ./deploy.sh: cannot execute: required file not found adalah kesalahan lain dengan nama yang membingungkan. Bit x sudah benar, tetapi interpreter yang tercantum pada baris pertama tidak ditemukan. Penyebab yang umum adalah line ending Windows, sehingga kernel mencari interpreter bernama /bin/bash\r. Perbaiki dengan sed -i 's/\r$//' deploy.sh.

Permissions 0644 for '/home/deploy/.ssh/id_ed25519' are too open. berasal dari SSH client, yang menolak menggunakan private key yang dapat dibaca oleh account lain. Key harus memiliki mode 600, sedangkan ~/.ssh harus memiliki mode 700. Penanganan key secara lengkap dibahas dalam mengelola SSH key dan permission filenya.

Authentication refused: bad ownership or modes for directory /home/deploy/.ssh muncul dalam journal server ketika home directory atau .ssh-nya dapat ditulis oleh group. Setting StrictModes pada sshd menolak key tersebut. Dari sisi client, kondisi ini terlihat sebagai prompt password yang tidak terduga tanpa penjelasan.

sudo: /etc/sudoers is world writable, yang diikuti oleh sudo: no valid sudoers sources found, quitting, berarti sudo memeriksa mode file konfigurasinya sendiri lalu menolak untuk berjalan. File tersebut harus memiliki mode 0440 dan tidak boleh dapat ditulis oleh semua user. Ini adalah akibat klasik dari chmod rekursif yang terlalu luas. Kondisi ini dapat muncul bersamaan dengan pesan sshd di atas, sehingga console milik provider menjadi satu-satunya cara untuk mendapatkan kembali akses ke server.

Mengapa 777 bukan solusi

777 memberikan akses tulis kepada setiap akun di mesin dan setiap proses yang berjalan menggunakan akun tersebut. Server menjalankan service dengan user masing-masing, sehingga “semua orang” mencakup jauh lebih banyak akun pada VPS daripada pada laptop. Service yang berhasil dibobol dapat menulis di lokasi mana pun yang diizinkan oleh 777.

Pada web root, dampaknya langsung terlihat. Direktori yang dapat ditulis oleh semua user dan juga disajikan oleh server dapat mengubah celah pada pengunggahan file menjadi cara untuk menanam script, lalu meminta script tersebut kembali.

777 hampir selalu merupakan jawaban yang salah untuk masalah kepemilikan. Gejalanya adalah “aplikasi tidak dapat menulis ke direktori ini”. Penyebabnya adalah direktori tersebut dimiliki oleh user yang salah. sudo chown -R appuser:appuser /srv/app/storage dengan mode 755 menyelesaikan masalah ini: aplikasi dapat menulis di sana, sedangkan akun lain tetap dapat melihat isi dan memasuki direktori, tetapi tidak dapat menulis ke dalamnya. Membuat akun-akun tersebut sebelum apa pun di-deploy termasuk dalam sepuluh menit pertama pada VPS baru.

Akses tulis untuk semua user sah di satu lokasi yang umum, yaitu /tmp, dan penulisannya adalah drwxrwxrwt. t di bagian akhir adalah sticky bit: direktori dapat ditulis oleh semua user, tetapi setiap user hanya dapat menghapus file yang dimilikinya. Tanpa bit tersebut, akun mana pun dapat menghapus file sementara milik akun lain.

Baca mode sebelum mengubahnya

Perintah-perintah ini hanya membaca status, sehingga aman dijalankan di mana saja.

id
umask
stat -c '%A %a %U %G %n' ~/permdemo ~/permdemo/inner/notes.txt
namei -l ~/permdemo/inner/notes.txt
find ~/permdemo -perm -0002

find <path> -perm -0002 mencantumkan semua objek di bawah suatu path yang bit tulis untuk semua pengguna (world write) telah diaktifkan. Ini adalah cara tercepat untuk mengaudit sebuah server setelah seseorang memperbaiki berbagai hal menggunakan chmod 777.

Untuk memeriksa apakah akun service tertentu dapat masuk ke sebuah direktori, lakukan pemeriksaan sebagai akun tersebut. sudo -u www-data test -x /srv/site && echo yes || echo no mencetak yes jika pengguna itu memiliki hak traverse pada direktori, dan no jika tidak. Pemeriksaan sebagai root tidak membuktikan apa pun karena root melewati pemeriksaan tersebut, sehingga hasilnya selalu yes.

FAQ

Apa arti drwxr-xr-x di Linux?

Itu adalah direktori, yang ditunjukkan oleh d di awal, dengan mode 755. Triad pemilik adalah rwx, sehingga pemilik memiliki semua izin pada direktori tersebut. Triad grup adalah r-x dan triad pengguna lain adalah r-x, sehingga pengguna lain dapat melihat nama di dalamnya dan melewati direktori tersebut, tetapi hanya pemilik yang dapat menambahkan atau menghapus apa pun. Konfirmasikan path apa pun dengan stat -c '%A %a %U %G %n' <path>, yang menampilkan bentuk huruf dan bentuk oktalnya secara berdampingan.

Mengapa file web menggunakan 644 dan direktori web menggunakan 755?

Web server berjalan dengan akun yang berbeda, yaitu www-data di Ubuntu. Web server memerlukan izin baca pada file yang dilayaninya dan izin traverse pada setiap direktori di atas file tersebut. Web server tidak perlu memiliki izin tulis pada keduanya. Mode 644 memberikan izin tulis kepada pemilik dan izin baca kepada pengguna lain. Mode 755 memberikan izin tulis kepada pemilik dan izin traverse kepada pengguna lain. Direktori yang memang harus ditulisi oleh aplikasi sebaiknya dialihkan kepemilikannya dengan chown kepada pengguna aplikasi tersebut, bukan dengan memperluas mode untuk semua pengguna.

Apakah bit x berarti saya dapat mengeksekusi direktori?

Tidak. Pada direktori, x berarti traverse, yaitu hak untuk mengurai satu nama di dalamnya saat kernel menelusuri path. cd memerlukannya, begitu juga setiap operasi membuka file di bawah direktori tersebut. Setiap direktori di sepanjang path memerlukan x, sehingga file dengan mode 644 tetap tidak dapat diakses jika salah satu direktori di atasnya tidak memiliki x untuk Anda. namei -l /path/to/file menampilkan mode setiap direktori dalam rantai tersebut dan menunjukkan lokasi pencarian terhenti.

Apakah chmod 777 pernah menjadi solusi yang tepat?

Hampir tidak pernah pada server. Mode tersebut memberikan izin tulis kepada setiap akun di mesin, termasuk akun yang digunakan oleh service. Akibatnya, satu service yang telah dibobol dapat menulis ulang file tersebut. Jika aplikasi tidak dapat menulis ke sebuah direktori, masalah sebenarnya biasanya adalah kepemilikan: sudo chown -R appuser:appuser /srv/app/storage dengan mode 755 memberikan akses tulis kepada aplikasi, sementara akun lain tetap dapat membaca direktori tersebut tetapi tidak dapat menulis ke dalamnya. Pengecualian yang umum adalah /tmp pada mode 1777. Hal itu hanya aman karena sticky bit mencegah pengguna menghapus file milik pengguna lain.

Mengapa ls menampilkan titik atau tanda plus setelah izin?

Karakter kesebelas tersebut menjelaskan aturan di luar sembilan bit izin. Titik, seperti pada drwxr-xr-x., berarti konteks keamanan SELinux terpasang. Kondisi ini normal di Fedora dan Rocky. Tanda plus, seperti pada drwxr-xr-x+, berarti POSIX ACL (access control list) telah ditetapkan, sehingga pengguna atau grup tertentu memiliki hak yang tidak ditampilkan oleh ketiga triad tersebut. Jalankan getfacl <path> untuk mencantumkan entri tambahan tersebut.

#permissions#ls#chmod#linux-basics#octal