Saat memutuskan izin apa yang akan digunakan, Anda harus tahu persis siapa pengguna Anda dan apa yang mereka butuhkan. Server web berinteraksi dengan dua jenis pengguna.
Pengguna terotentikasi memiliki akun pengguna di server dan dapat diberikan hak khusus. Ini biasanya termasuk administrator sistem, pengembang, dan akun layanan. Mereka biasanya melakukan perubahan pada sistem menggunakan SSH atau SFTP.
Pengguna anonim adalah pengunjung situs web Anda. Meskipun mereka tidak memiliki izin untuk mengakses file secara langsung, mereka dapat meminta halaman web dan server web bertindak atas nama mereka. Anda dapat membatasi akses pengguna anonim dengan berhati-hati tentang izin apa yang dimiliki proses server web. Pada banyak distribusi Linux, Apache berjalan sebagai www-data
pengguna tetapi bisa berbeda. Gunakan ps aux | grep httpd
atau ps aux | grep apache
untuk melihat apa yang digunakan pengguna Apache di sistem Anda.
Catatan tentang izin linux
Linux dan sistem yang mendukung POSIX lainnya menggunakan izin unix tradisional. Ada artikel yang bagus di Wikipedia tentang izin Filesystem jadi saya tidak akan mengulang semuanya di sini. Tetapi ada beberapa hal yang harus Anda waspadai.
Eksekusi bit
Skrip yang diartikan (mis. Ruby, PHP) berfungsi baik tanpa izin eksekusi Hanya binari dan skrip shell yang memerlukan bit eksekusi. Untuk melintasi (masuk) direktori, Anda harus memiliki izin eksekusi pada direktori itu. Server web memerlukan izin ini untuk mendaftar direktori atau melayani file apa pun di dalamnya.
Izin file baru default
Ketika file dibuat, biasanya mewarisi id grup dari siapa pun yang membuatnya. Tetapi kadang-kadang Anda ingin file baru untuk mewarisi id grup folder tempat mereka dibuat, sehingga Anda akan mengaktifkan bit SGID pada folder induk.
Nilai izin default bergantung pada umask Anda. Umask mengurangi izin dari file yang baru dibuat, sehingga nilai umum dari 022 menghasilkan 755 file yang dibuat. Ketika berkolaborasi dengan grup, ada baiknya mengubah umask Anda menjadi 002 sehingga file yang Anda buat dapat dimodifikasi oleh anggota grup. Dan jika Anda ingin menyesuaikan izin file yang diunggah, Anda perlu mengubah umask untuk apache atau menjalankan chmod setelah file diunggah.
Masalah dengan 777
Ketika Anda chmod 777
situs web Anda, Anda tidak memiliki keamanan apa pun. Setiap pengguna di sistem dapat mengubah atau menghapus file apa pun di situs web Anda. Tetapi yang lebih serius, ingatlah bahwa server web bertindak atas nama pengunjung ke situs web Anda, dan sekarang server web dapat mengubah file yang sama dengan yang dijalankannya. Jika ada kerentanan pemrograman di situs web Anda, mereka dapat dieksploitasi untuk merusak situs web Anda, memasukkan serangan phishing, atau mencuri informasi dari server Anda tanpa Anda ketahui.
Selain itu, jika server Anda berjalan pada port yang terkenal (yang seharusnya mencegah pengguna non-root memunculkan layanan mendengarkan yang dapat diakses oleh dunia), itu berarti server Anda harus dimulai dengan root (meskipun server waras mana pun akan segera turun ke akun yang kurang istimewa setelah port terikat). Dengan kata lain, jika Anda menjalankan server web di mana executable utama adalah bagian dari kontrol versi (misalnya aplikasi CGI), meninggalkan izinnya (atau, dalam hal ini, izin direktori yang berisi, karena pengguna dapat mengubah nama yang dapat dieksekusi) di 777 memungkinkan setiap pengguna untuk menjalankan semua yang dapat dieksekusi sebagai root.
Tetapkan persyaratan
- Pengembang perlu akses baca / tulis ke file sehingga mereka dapat memperbarui situs web
- Pengembang perlu membaca / menulis / mengeksekusi pada direktori sehingga mereka dapat menelusuri
- Apache membutuhkan akses baca ke file dan skrip yang ditafsirkan
- Apache perlu membaca / mengeksekusi akses ke direktori yang dapat dilayani
- Apache perlu membaca / menulis / mengeksekusi akses ke direktori untuk konten yang diunggah
Dikelola oleh satu pengguna
Jika hanya satu pengguna yang bertanggung jawab untuk memelihara situs tersebut, tetapkan mereka sebagai pemilik pengguna pada direktori situs web dan berikan izin penuh kepada pengguna. Apache masih membutuhkan akses sehingga dapat melayani file, jadi atur data-www sebagai pemilik grup dan berikan izin grup rx.
Dalam kasus Anda, Eve, yang mungkin memiliki nama pengguna eve
, adalah satu-satunya pengguna yang mengelola contoso.com
:
chown -R eve contoso.com/
chgrp -R www-data contoso.com/
chmod -R 750 contoso.com/
chmod g+s contoso.com/
ls -l
drwxr-s--- 2 eve www-data 4096 Feb 5 22:52 contoso.com
Jika Anda memiliki folder yang perlu ditulis oleh Apache, Anda bisa memodifikasi nilai izin untuk pemilik grup sehingga www-data memiliki akses tulis.
chmod g+w uploads
ls -l
drwxrws--- 2 eve www-data 4096 Feb 5 22:52 uploads
Manfaat dari konfigurasi ini adalah menjadi lebih sulit (tetapi bukan tidak mungkin *) bagi pengguna lain pada sistem untuk mengintip, karena hanya pemilik pengguna dan grup yang dapat menelusuri direktori situs web Anda. Ini berguna jika Anda memiliki data rahasia dalam file konfigurasi Anda. Hati-hati dengan umask Anda! Jika Anda membuat file baru di sini, nilai izin mungkin akan default ke 755. Anda dapat menjalankan umask 027
sehingga file baru default ke 640 ( rw- r-- ---
).
Dikelola oleh sekelompok pengguna
Jika lebih dari satu pengguna bertanggung jawab untuk memelihara situs, Anda perlu membuat grup untuk digunakan untuk menetapkan izin. Merupakan praktik yang baik untuk membuat grup terpisah untuk setiap situs web, dan beri nama grup tersebut setelah situs web itu.
groupadd dev-fabrikam
usermod -a -G dev-fabrikam alice
usermod -a -G dev-fabrikam bob
Pada contoh sebelumnya, kami menggunakan pemilik grup untuk memberikan hak istimewa kepada Apache, tetapi sekarang digunakan untuk grup pengembang. Karena pemilik pengguna tidak berguna lagi bagi kami, mengaturnya untuk root adalah cara sederhana untuk memastikan bahwa tidak ada hak istimewa bocor. Apache masih membutuhkan akses, jadi kami memberikan akses baca ke seluruh dunia.
chown -R root fabrikam.com
chgrp -R dev-fabrikam fabrikam.com
chmod -R 775 fabrikam.com
chmod g+s fabrikam.com
ls -l
drwxrwxr-x 2 root dev-fabrikam 4096 Feb 5 22:52 fabrikam.com
Jika Anda memiliki folder yang harus dapat ditulis oleh Apache, Anda dapat membuat Apache sebagai pemilik pengguna atau pemilik grup. Apa pun itu, ia akan memiliki semua akses yang dibutuhkan. Secara pribadi, saya lebih suka menjadikannya pemilik pengguna sehingga pengembang masih dapat menelusuri dan memodifikasi konten folder unggahan.
chown -R www-data uploads
ls -l
drwxrwxr-x 2 www-data dev-fabrikam 4096 Feb 5 22:52 uploads
Meskipun ini adalah pendekatan umum, ada sisi buruknya. Karena setiap pengguna lain di sistem memiliki hak yang sama untuk situs web Anda seperti halnya Apache, maka mudah bagi pengguna lain untuk menjelajahi situs Anda dan membaca file yang mungkin berisi data rahasia, seperti file konfigurasi Anda.
Anda dapat memiliki kue dan memakannya juga
Ini bisa lebih ditingkatkan. Sangat sah bagi pemilik untuk memiliki lebih sedikit keistimewaan daripada grup, jadi alih-alih menyia-nyiakan pemilik pengguna dengan menugaskannya untuk melakukan rooting, kita dapat menjadikan Apache pemilik pengguna di direktori dan file di situs web Anda. Ini adalah pembalikan dari skenario pemelihara tunggal, tetapi berfungsi sama baiknya.
chown -R www-data fabrikam.com
chgrp -R dev-fabrikam fabrikam.com
chmod -R 570 fabrikam.com
chmod g+s fabrikam.com
ls -l
dr-xrwx--- 2 www-data dev-fabrikam 4096 Feb 5 22:52 fabrikam.com
Jika Anda memiliki folder yang perlu ditulis oleh Apache, Anda bisa memodifikasi nilai izin untuk pemilik pengguna sehingga www-data memiliki akses tulis.
chmod u+w uploads
ls -l
drwxrwx--- 2 www-data dev-fabrikam 4096 Feb 5 22:52 fabrikam.com
Satu hal yang perlu diperhatikan dalam solusi ini adalah bahwa pemilik pengguna file baru akan cocok dengan pembuatnya daripada disetel ke data-www. Jadi setiap file baru yang Anda buat tidak akan dapat dibaca oleh Apache sampai Anda mengetahuinya.
* Pemisahan hak istimewa Apache
Saya sebutkan sebelumnya bahwa sebenarnya mungkin bagi pengguna lain untuk menyelinap di situs web Anda, apa pun hak istimewa yang Anda gunakan. Secara default, semua proses Apache berjalan sebagai pengguna data-www yang sama, sehingga setiap proses Apache dapat membaca file dari semua situs web lain yang dikonfigurasi pada server yang sama, dan kadang-kadang bahkan membuat perubahan. Setiap pengguna yang dapat membuat Apache menjalankan skrip dapat memperoleh akses yang sama dengan yang dimiliki oleh Apache itu sendiri.
Untuk mengatasi masalah ini, ada berbagai pendekatan untuk pemisahan hak istimewa di Apache. Namun, setiap pendekatan dilengkapi dengan berbagai kelemahan kinerja dan keamanan. Menurut pendapat saya, situs apa pun dengan persyaratan keamanan yang lebih tinggi harus dijalankan pada server khusus alih-alih menggunakan VirtualHost di server bersama.
Pertimbangan tambahan
Saya tidak menyebutkannya sebelumnya, tetapi biasanya merupakan praktik yang buruk untuk membuat pengembang mengedit situs web secara langsung. Untuk situs yang lebih besar, Anda lebih baik memiliki semacam sistem rilis yang memperbarui server web dari konten sistem kontrol versi. Pendekatan pengelola tunggal mungkin ideal, tetapi alih-alih orang yang memiliki perangkat lunak otomatis.
Jika situs web Anda memungkinkan unggahan yang tidak perlu dilayani, unggahan itu harus disimpan di suatu tempat di luar root web. Jika tidak, Anda mungkin menemukan bahwa orang-orang mengunduh file yang dimaksudkan untuk dirahasiakan. Misalnya, jika Anda mengizinkan siswa mengirimkan tugas, tugas itu harus disimpan ke direktori yang tidak dilayani oleh Apache. Ini juga merupakan pendekatan yang baik untuk file konfigurasi yang mengandung rahasia.
Untuk situs web dengan persyaratan yang lebih kompleks, Anda mungkin ingin melihat ke dalam penggunaan Daftar Kontrol Akses . Ini memungkinkan kontrol hak istimewa yang jauh lebih canggih.
Jika situs web Anda memiliki persyaratan yang rumit, Anda mungkin ingin menulis skrip yang mengatur semua izin. Uji dengan seksama, lalu amankan. Beratnya bisa bernilai emas jika Anda merasa perlu membangun kembali situs web Anda karena alasan tertentu.