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.envdiubah jadi600milikroot, padahal catatan-api jalan sebagai userwww-data. Apakah app masih dapatDATABASE_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 |
- Di
755, pemilik dapatrwx, sedangkan grup dan lainnya dapatr-x: boleh membaca dan menjalankan, tapi gak boleh menulis. - Kernel cuma memakai satu trio: kamu pemiliknya, pakai trio pemilik. Bukan pemilik tapi anggota grupnya, pakai trio grup. Selain itu, trio lainnya.
rootmelewati pemeriksaan ini: dia boleh membaca dan menulis file apa pun. - Di folder,
r= boleh melihat daftar isinya,w= boleh membuat dan menghapus file di dalamnya,x= boleh masuk. Jadi app yang menyimpan upload butuhwdanxdi folderstorage/lampiran.
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
storage/lampirandibuat Budi denganmkdir -psebagaideploy, jadi milikdeploydengan755.www-datajatuh ke trio lainnya,r-x: gak adaw. Itu sebabnya upload ditolak denganEACCESdi pelajaran sebelumnya./etc/catatan-api.envdibuat dengansudo nano, jadi milikrootdengan644. Trio lainnyar--: semua user di server, termasuksari, bisa membaca password database-nya.deploy.shbaru ditulis, jadi644tanpax. Menjalankannya memberi-bash: ./deploy.sh: Permission denied.
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
chown user:grup pathmengganti pemilik dan grup. Selalu butuhsudo. Sekarangwww-datapakai trio pemilikrwxdistorage/lampiran, dan cuma dia yang boleh menulis di sana.chmod 600menulis mode dengan angka. File itu milikroot, jadideployjuga butuhsudo.chmod u+xmenulis mode dengan huruf:upemilik,ggrup,olainnya,asemua;+tambah,-cabut,=set persis. 644 ditambahxdi digit pemilik: 6 + 1 = 7, jadi744. Contoh lain:chmod go-rwxmencabut semua izin grup dan lainnya, jadi 644 berubah jadi 600.app.jstetap644milikdeploy: app bisa membacanya, tapi gak bisa menimpanya.
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
chmod -R 777supaya upload jalan. Upload memang jalan, tapi semua user, termasuk app yang dibobol, boleh mengubah semua file. Yang salah biasanya pemiliknya: betulkan denganchown.chown -R www-datauntuk seluruh/srv/catatan-api. App jadi pemilik kodenya sendiri dan bisa menimpanya. Cukupstorage/saja yang milikwww-data.chmod 600di file yang dibaca app sendiri, tapi pemiliknya user lain. Kalau app membaca.envlangsung, sedangkan file itu600milikdeploy, app gagal denganEACCES.600cuma cocok kalau yang membaca adalah pemiliknya (atau root). Kalau grup harus ikut membaca, pakai640dengan grupwww-data.chmod -R 644di folder. Folder kehilanganx, jadi gak bisa dimasuki:-bash: cd: storage: Permission denied. Folder butuh755.
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.