Ringkasan yang Diperbarui
Direktori / var / www dimiliki oleh root:root
yang berarti tidak ada yang dapat menggunakannya dan sepenuhnya tidak berguna. Karena kita semua menginginkan server web yang benar-benar berfungsi (dan tidak seorang pun harus masuk sebagai "root"), maka kita perlu memperbaikinya.
Hanya dua entitas yang membutuhkan akses.
PHP / Perl / Ruby / Python semua memerlukan akses ke folder dan file karena mereka membuat banyak dari mereka (yaitu
/uploads/
). Bahasa skrip ini harus berjalan di bawah nginx atau apache (atau bahkan beberapa hal lain seperti FastCGI untuk PHP).Pengembang
Bagaimana mereka mendapatkan akses? Saya tahu seseorang, di suatu tempat telah melakukan ini sebelumnya. Namun dengan miliaran situs web di luar sana Anda akan berpikir bahwa akan ada lebih banyak informasi tentang topik ini.
Saya tahu bahwa 777 adalah izin baca / tulis / eksekusi penuh untuk pemilik / grup / lainnya. Jadi ini tampaknya tidak diperlukan dengan benar karena memberikan izin penuh kepada pengguna secara acak.
Izin apa yang perlu digunakan /var/www
agar:
- Kontrol sumber seperti git atau svn
- Pengguna dalam grup seperti "situs web" ( atau bahkan ditambahkan ke "www-data" )
- Server seperti apache atau lighthttpd
- Dan PHP / Perl / Ruby
dapatkah semua membaca, membuat, dan menjalankan file (dan direktori) di sana?
Jika saya benar, Ruby dan skrip PHP tidak "dieksekusi" secara langsung - tetapi diteruskan ke penerjemah. Jadi tidak perlu untuk mengeksekusi izin pada file di /var/www
...? Oleh karena itu, tampaknya seperti izin yang benar akan chmod -R 1660
yang akan membuat
- semua file dapat dibagikan oleh empat entitas ini
- semua file tidak dapat dieksekusi karena kesalahan
- blokir semua orang dari direktori sepenuhnya
- atur mode izin ke "sticky" untuk semua file di masa depan
Apakah ini benar?
Pembaruan 1: Saya baru menyadari bahwa file dan direktori mungkin memerlukan izin yang berbeda - Saya berbicara tentang file di atas jadi saya tidak yakin apa yang harus menjadi izin direktori.
Pembaruan 2: Struktur folder /var/www
perubahan secara drastis karena salah satu dari empat entitas di atas selalu menambahkan (dan terkadang menghapus) folder dan sub folder dalam banyak level. Mereka juga membuat dan menghapus file yang mungkin memerlukan akses baca / tulis 3 entitas lainnya. Oleh karena itu, izin harus melakukan empat hal di atas untuk file dan direktori. Karena tidak satu pun dari mereka yang perlu menjalankan izin (lihat pertanyaan tentang ruby / php di atas) Saya akan berasumsi bahwa rw-rw-r--
izin akan menjadi semua yang diperlukan dan sepenuhnya aman karena keempat entitas ini dijalankan oleh personel tepercaya (lihat # 2) dan semua pengguna lain di sistem hanya memiliki akses baca.
Pembaruan 3: Ini untuk mesin pengembangan pribadi dan server perusahaan swasta. Tidak ada "pelanggan web" acak seperti host bersama.
Pembaruan 4: Artikel ini oleh slicehost tampaknya menjadi yang terbaik dalam menjelaskan apa yang diperlukan untuk mengatur izin untuk folder www Anda. Namun, saya tidak yakin apa yang dijalankan pengguna atau grup apache / nginx dengan PHP OR svn / git dan bagaimana cara mengubahnya.
Pembaruan 5: Saya telah (saya pikir) akhirnya menemukan cara agar semua ini berfungsi (jawaban di bawah). Namun, saya tidak tahu apakah ini cara yang benar dan AMAN untuk melakukan ini. Karena itu saya sudah mulai mendapat hadiah. Orang yang memiliki metode terbaik untuk mengamankan dan mengelola direktori www menang.
sumber
Saya tidak yakin apakah itu "benar", tapi inilah yang saya lakukan di server saya:
Ingatlah bahwa Anda harus mengaktifkan bit eksekusi pada direktori sehingga Anda dapat membuat daftar konten.
sumber
Setelah melakukan penelitian lebih lanjut, tampaknya ALAT git / svn BUKAN masalah karena mereka berjalan sebagai pengguna apa pun yang menggunakannya. (Namun, daemon git / svn adalah masalah yang berbeda!) Semua yang saya buat / kloning dengan git memiliki izin saya dan alat git terdaftar di
/usr/bin
mana sesuai dengan tesis ini.Izin git terpecahkan.
Izin pengguna tampaknya dapat dipecahkan dengan menambahkan semua pengguna yang membutuhkan akses ke direktori www ke
www-data
grup yang menjalankan apache (dan nginx).Jadi sepertinya satu jawaban untuk pertanyaan ini seperti ini:
Secara default
/var/www
dimiliki olehroot:root
dan tidak ada yang dapat menambah atau mengubah file di sana.1) Ubah pemilik grup
Pertama, kita perlu mengubah grup direktori www agar dimiliki oleh "www-data" alih-alih grup "root"
2) Tambahkan pengguna ke www-data
Maka kita perlu menambahkan pengguna saat ini (dan siapa pun) ke grup www-data
3) Direktori www CHMOD
Ubah izin sehingga HANYA pemilik (root) dan semua pengguna dalam grup "www-data" dapat rwx (baca / tulis / eksekusi) file dan direktori ( tidak ada orang lain yang bahkan dapat mengaksesnya ).
Sekarang semua file dan direktori yang dibuat oleh setiap pengguna yang memiliki akses (yaitu dalam grup "www-data") akan dapat dibaca / ditulis oleh apache dan karenanya php.
Apakah ini benar? Bagaimana dengan file yang dibuat oleh PHP / Ruby - bisakah pengguna www-data mengaksesnya?
sumber
Stickiness bukan pewarisan izin. Kelekatan pada direktori berarti bahwa hanya pemilik file, atau pemilik direktori, yang dapat mengganti nama atau menghapus file itu di direktori, meskipun ada izin yang mengatakan sebaliknya. Jadi 1777 pada / tmp /.
Dalam Unix klasik, tidak ada pewarisan izin berdasarkan sistem file, hanya pada umask proses saat ini. Pada * BSD, atau Linux dengan setgid pada direktori, bidang grup dari file yang baru dibuat akan disetel sama dengan direktori induk. Untuk hal lain, Anda perlu melihat ACL, dengan ACL 'default' pada direktori, yang memungkinkan Anda mewarisi izin.
Anda harus mulai dengan mendefinisikan: * apa yang pengguna punya akses ke sistem * apa model ancaman Anda
Misalnya, jika Anda melakukan hosting web dengan banyak pelanggan dan Anda tidak ingin mereka melihat satu sama lain file, maka Anda dapat menggunakan grup umum "webcusts" untuk semua pengguna dan mode direktori 0705. Kemudian file dilayani oleh proses server web ( bukan di "webcusts") akan melihat perms Lain dan diizinkan; pelanggan tidak dapat melihat file satu sama lain dan pengguna dapat mengacaukan file mereka sendiri. Namun, ini berarti bahwa pada saat Anda mengizinkan CGI atau PHP Anda harus memastikan bahwa proses berjalan sebagai pengguna tertentu (bagaimanapun, praktik yang baik, untuk banyak pengguna-satu-satu-host, untuk akuntabilitas). Jika tidak, pelanggan dapat mengacaukan file masing-masing dengan meminta CGI melakukannya.
Namun, jika pengguna run-time untuk situs web adalah sama dengan pemilik situs web, maka Anda memiliki masalah dengan tidak dapat melindungi konten dari pelaku dalam kasus lubang keamanan dalam skrip. Di sinilah tuan rumah yang berdedikasi menang, sehingga Anda dapat memiliki pengguna run-time berbeda dari pemilik konten statis dan tidak perlu terlalu khawatir tentang interaksi dengan pengguna lain.
sumber
rename()
,unlink()
), hanya untuk tindakan pada file itu sendiri (open()
). Ini adalah perilaku "biasa".Saya percaya bahwa cara terbaik untuk melakukan ini adalah menggunakan ACLs Posix. Mereka nyaman untuk bekerja dengan dan menawarkan semua fungsi yang Anda butuhkan.
http://en.wikipedia.org/wiki/Access_control_list#Filesystem_ACLs
sumber
Pemilik file harus menjadi orang yang membuatnya, sedangkan grup harus berupa www-data. Mode untuk direktori / file kemudian secara umum 755/644. Sedangkan untuk direktori dan file, grup memerlukan akses tulis mod adalah 775/664. Asumsikan padi adalah pengembang. Secara keseluruhan ini menghasilkan:
sumber
Menambahkan ke jawaban Xeoncross, saya pikir akan lebih baik untuk mengkonfigurasi izin pada file dan direktori secara terpisah.
Ini akan memungkinkan pengembang untuk membuat dan memodifikasi direktori di dalam / var / www. Yang sepertinya penting karena, pengembang mungkin perlu membuat direktori tambahan atau menghapus direktori yang tidak lagi diperlukan.
Ini juga akan memungkinkan pengembang untuk membuat dan memodifikasi file kode (baca HTML, file PHP dan sejenisnya). Namun, masih hanya akan memungkinkan akses baca-saja untuk semua orang.
sumber