Menganggap bahwa 'aplikasi web' berjalan di server (seperti apache, nginx, dll) dan ditulis dalam beberapa bahasa skrip dinamis (seperti PHP, Ruby, dll), Anda memiliki kesalahpahaman tentang siapa 'pengguna' itu.
Pengguna bukan orang yang masuk ke aplikasi Anda - itu, dan peran mereka dalam aplikasi (admin, dll) sama sekali tidak relevan dengan skenario. Pengguna adalah pengguna sistem linux yang menjalankan proses di bawah. Kode situs web Anda dijalankan hanya sebagai satu pengguna - itu mungkin pengguna server web Anda (yang sebenarnya bukan hal yang baik), atau mungkin pengguna yang spesifik untuk situs Anda (yang jauh lebih baik).
Di linux, pengguna menjadi bagian dari grup - kami dapat menambahkan pengguna ke grup lain dan memberikan hak istimewa ke grup itu.
Pengaturan yang baik akan membuat server Anda berjalan sebagai satu pengguna (sebut saja pengguna ini 'server web') dan jalankan bahasa skrip dinamis Anda (mis. Via FastCGI) sebagai pengguna sendiri (satu pengguna per situs - sebut pengguna pertama kami 'site1') .
Untuk melayani file Anda, server web perlu mengaksesnya, dan bahasa skrip membutuhkan akses ke file tersebut. Itu berarti: 'site1' dan 'server web' harus dapat membaca file Anda. Hanya satu dari mereka, namun dapat 'memiliki' file. Pemilik adalah 'pengguna' (dalam pengguna, grup, lainnya). Kita juga memerlukan bahasa scripting kita untuk dapat menulis ke direktori (dan membaca file yang telah ditulisnya). Oleh karena itu, pengguna 'site1', perlu izin baca dan tulis. Karena kami ingin izin grup dan lainnya seketat mungkin, 'pemilik' kami akan menjadi 'site1', dan izin pengguna yang sesuai akan dibaca dan ditulis.
Karena kami tidak dapat menentukan izin untuk server web kami sebagai 'pengguna' lain, kami akan menambahkan 'server web' ke grup 'situs1' (tentu saja Anda dapat, membuat grup yang berbeda dengan 'situs1' dan 'server web' di dalamnya. Semua anggota grup ini akan diberikan izin yang sama. Izin yang paling longgar (dari pengguna, grup, set lainnya) akan diterapkan ke pengguna yang diberikan untuk menentukan izin mereka.
Perlu dicatat bahwa pengaturan yang baik tidak memerlukan file untuk menjalankan izin untuk bahasa yang dinamis. File-file tersebut tidak langsung dijalankan, melainkan dibaca menjadi penerjemah - hanya izin baca yang diperlukan untuk menjalankan skrip tipikal (yang tidak menulis apa-apa).
Izin 'mengeksekusi' pada direktori memiliki arti yang berbeda - izin mengizinkan traversal tanpa bisa membaca konten. Agar dapat membaca file di direktori, pengguna harus memiliki 'mengeksekusi' izin pada setiap direktori di atasnya.
Untuk aplikasi web, setiap file harus memiliki izin baca oleh pemiliknya - jika tidak, ini adalah file yang tidak berguna. Apakah pengguna atau admin mengunggah file (melalui aplikasi web Anda) 'pemilik' (yaitu bahasa dinamis) perlu izin menulis. Pengaturan yang efisien akan mencoba menyajikan file statis secara langsung melalui server web, karena bahasa dinamis cenderung lambat dalam membaca file besar dan menggemakan konten. Karena itu server web perlu akses baca ke file statis Anda.
Oleh karena itu, izin file minimal mungkin:
- File di direktori tempat pengguna mengunggah file statis (file gambar / swf / js) akan berada: 640
- File dalam direktori tempat admin mengunggah file statis (file gambar / swf / js) akan berada: 640
- File di direktori tempat pustaka yang digunakan dalam aplikasi berada: 400 (atau 440)
- File dalam direktori tempat skrip sisi server yang dapat dieksekusi / dapat dijelajahi berada: 400 (atau 440)
- File dalam direktori tempat file yang sudah ada (txt atau xml) akan diedit oleh kode di sisi server: 640 atau 600
- (tergantung pada apakah server web akan menampilkan ini, kadang-kadang tidak dimodifikasi)
Sementara, izin direktori minimal mungkin:
- Direktori tempat pengguna mengunggah file statis (file gambar / swf / js) akan berada: 750
- Direktori tempat admin mengunggah file statis (file gambar / swf / js) akan berada: 750
- Direktori tempat pustaka yang digunakan dalam aplikasi berada: 500 (atau 550) [setidaknya harus 510]
- Direktori tempat skrip sisi server yang dapat dieksekusi / dapat dijelajahi berada: 500 (atau 550) [setidaknya harus 510]
- Direktori tempat file yang sudah ada (txt atau xml) akan diedit oleh kode di sisi server: 750 atau 700
- (tergantung pada apakah server web akan melayani file dari sini, kadang-kadang tidak dimodifikasi)
Sekali lagi - server web Anda harus memiliki izin 'laksanakan' pada setiap direktori di atas direktori yang memerlukan aksesnya - jadi bahkan jika server web tidak akan menyajikan file dari direktori yang diberikan, kami harus memberikan izin untuk menjalankannya.
Sangat umum untuk memberikan akses web server baca ke sebagian besar file (jadi ubah 500 hingga 550). Izin 'agak aman' standar biasanya 755 untuk direktori dan 644 untuk file - tanpa izin eksekusi, semua orang dapat membaca, dan hanya pengguna yang dapat menulis - Anda akan mencatat bahwa sebagian besar file pada sistem linux memiliki izin ini.
Ingatlah bahwa izin 'lain' merujuk pada pengguna sistem apa pun yang bukan pemilik atau dalam grup (yaitu semua pengguna sistem yang tersisa). Menjaga izin 'orang lain' Anda terbatas, karena pengguna ini tidak dikenal - Anda belum secara eksplisit memberi mereka izin. Izin lainnya seringkali paling mudah untuk memanfaatkan sistem yang dikompromikan (misalnya salah satu alasan mengapa / tmp adalah target umum).
Dalam konteks di atas, saya kira dua pertanyaan terakhir Anda tidak relevan. Tetapkan izin direktori Anda menjadi 550 (dan berikan izin file ke 440), lalu berikan izin menulis kepada pengguna untuk direktori apa pun yang akan ditulis oleh aplikasi Anda (direktori: 750; file: 640).
(Anda tentu saja memerlukan izin menulis untuk mengunggah file - tetapi jika Anda mau, Anda dapat menghapusnya setelah itu - bisa dibilang, jika seseorang menulis ke direktori yang hanya dapat ditulis oleh pemiliknya - akun Anda telah disusupi - yang merupakan salah satu akun alasan untuk menjaga izin restriktif).