File System & Permissions — DevOps

Struktur File System Linux Linux menggunakan struktur direktori hierarki dengan / (root) sebagai titik awal: / ├── bin/ # binary/program essential ├── etc/ #…

Di server, setiap file punya pemilik dan izin (permission), dan keduanya menentukan siapa boleh membaca, mengubah, dan menjalankan apa. Bayangin dapur restoran. Pemilik restoran menulis buku resep. Koki boleh membaca resep dan memakai dapur, tapi gak boleh mencoret buku resepnya. Brankas uang cuma dibuka manajer. Di web-1, buku resepnya adalah kode catatan-api, dapurnya folder storage/, dan brankasnya file secret /etc/catatan-api.env.

🧪 Tebakan cepat: /etc/catatan-api.env diubah jadi 600 milik root, padahal catatan-api jalan sebagai user www-data. Apakah app masih dapat DATABASE_URL-nya? Tebak dulu, jawabannya ada di bagian "Secret: 600 milik root".

Tiga pemain di web-1

User Siapa dia Yang dia butuhkan
deploy kamu, dan script deploy menulis kode di /srv/catatan-api
www-data user yang menjalankan app (dan nanti Nginx) membaca kode, menulis di storage/
root admin server, termasuk systemd membaca secret saat menyalakan app

Selain mereka, server bisa punya login lain, misalnya sari, teman setim. Prinsipnya: tiap user cuma dapat izin yang dia butuhkan. App cukup membaca kodenya. Kalau app boleh menulis ke app.js, penyerang yang membobol app bisa menanam kodenya sendiri.

Membaca izin: tiga trio, tiga angka

Dasarnya ada di pelajaran Permission & Ownership, track Terminal. Ringkasnya: r = 4 (baca), w = 2 (tulis), x = 1 (jalankan, atau masuk kalau folder). Tiap trio dijumlahkan jadi satu digit, urut pemilik, grup, lainnya:

Angka Hitungan Huruf Biasanya untuk
755 7 = 4+2+1, 5 = 4+1, 5 = 4+1 rwxr-xr-x folder dan script
644 6 = 4+2, 4, 4 rw-r--r-- file kode
640 6 = 4+2, 4, 0 rw-r----- config yang dibaca grup
600 6 = 4+2, 0, 0 rw------- secret

Kenapa file baru 644 dan folder baru 755

File dan folder baru selalu milik user yang membuatnya, dengan izin dari umask. Di Ubuntu umask-nya 022, artinya grup dan lainnya gak dapat w. Jadi file baru jadi 644 dan folder baru jadi 755. Ini yang terjadi di web-1 kemarin:

deploy@web-1:/srv/catatan-api$ ls -ld /etc/catatan-api.env app.js deploy.sh storage/lampiran
-rw-r--r-- 1 root   root    156 Oct  8 17:20 /etc/catatan-api.env
-rw-r--r-- 1 deploy deploy  299 Oct  8 17:35 app.js
-rw-r--r-- 1 deploy deploy  291 Oct  8 17:35 deploy.sh
drwxr-xr-x 2 deploy deploy 4096 Oct  8 17:40 storage/lampiran

Membereskan: chown dan chmod

cd /srv/catatan-api
sudo chown www-data:www-data storage/lampiran   # folder upload milik user app
sudo chmod 600 /etc/catatan-api.env             # secret: cuma root
chmod u+x deploy.sh                             # pemilik dapat x: 644 jadi 744
deploy@web-1:/srv/catatan-api$ ls -ld /etc/catatan-api.env app.js deploy.sh storage/lampiran
-rw------- 1 root     root      156 Oct  8 17:20 /etc/catatan-api.env
-rw-r--r-- 1 deploy   deploy    299 Oct  8 17:35 app.js
-rwxr--r-- 1 deploy   deploy    291 Oct  8 17:35 deploy.sh
drwxr-xr-x 2 www-data www-data 4096 Oct  8 17:40 storage/lampiran

Secret: 600 milik root

600 milik root artinya cuma root yang boleh membaca. App tetap dapat DATABASE_URL, karena yang membaca file itu bukan app, melainkan systemd. systemd jalan sebagai root, membaca file secret dulu, baru menyalakan app sebagai www-data dengan isi file itu sebagai environment variable. Itu jawaban tebakannya. Caranya (EnvironmentFile=) ada di pelajaran berikutnya.

User lain sekarang ditolak, termasuk deploy tanpa sudo:

sari@web-1:~$ cat /etc/catatan-api.env
cat: /etc/catatan-api.env: Permission denied

Di latihan: dari angka ke huruf

parsePermission(755) harus mengembalikan "rwxr-xr-x". Ubah angkanya jadi teks dengan String(octal), pecah per digit dengan split(""), lalu ganti tiap digit dengan trionya:

const TRIO = { 0: "---", 1: "--x", 2: "-w-", 3: "-wx", 4: "r--", 5: "r-x", 6: "rw-", 7: "rwx" };
console.log(String(644).split("")); // ["6", "4", "4"]
console.log(TRIO[6] + TRIO[4] + TRIO[4]); // rw-r--r--

⚠️ Jebakan yang sering ketemu

TL;DR: Di web-1, kode milik deploy (file 644, folder 755), app jalan sebagai www-data dan cuma boleh menulis di storage/ (sudo chown www-data:www-data storage/lampiran), dan secret /etc/catatan-api.env 600 milik root, yang dibaca systemd saat menyalakan app. r = 4, w = 2, x = 1, dijumlahkan per trio pemilik, grup, lainnya: 755 = rwxr-xr-x (grup dan lainnya boleh baca dan jalankan, gak boleh tulis), 644 = rw-r--r--, 600 = rw-------. Kernel memakai satu trio saja, dan root melewati pemeriksaan. File baru 644 dan folder baru 755 karena umask 022. chown mengganti pemilik, chmod angka menulis mode utuh, chmod u+x mengubah satu bagian. Jangan pernah 777.

Yang akan kamu pelajari