Bagaimana cara mengatur izin linux untuk folder WWW?

69

Ringkasan yang Diperbarui

Direktori / var / www dimiliki oleh root:rootyang 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.

  1. 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).

  2. 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/wwwagar:

  1. Kontrol sumber seperti git atau svn
  2. Pengguna dalam grup seperti "situs web" ( atau bahkan ditambahkan ke "www-data" )
  3. Server seperti apache atau lighthttpd
  4. 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 1660yang akan membuat

  1. semua file dapat dibagikan oleh empat entitas ini
  2. semua file tidak dapat dieksekusi karena kesalahan
  3. blokir semua orang dari direktori sepenuhnya
  4. 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/wwwperubahan 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.

Xeoncross
sumber

Jawaban:

47

Setelah penelitian lebih lanjut, sepertinya jawaban lain (mungkin cara yang lebih baik) adalah dengan mengatur folder www seperti itu.

  1. sudo usermod -a -G developer user1 (tambahkan setiap pengguna ke grup pengembang)
  2. sudo chgrp -R developer /var/www/site.com/ sehingga pengembang bisa bekerja di sana
  3. sudo chmod -R 2774 /var/www/site.com/ sehingga hanya pengembang yang dapat membuat / mengedit file (dunia lain dapat membaca)
  4. sudo chgrp -R www-data /var/www/site.com/uploads sehingga www-data (apache / nginx) dapat membuat unggahan.

Karena gitdijalankan sebagai apa pun yang dipanggil pengguna, maka selama pengguna berada dalam grup "pengembang", mereka harus dapat membuat folder, mengedit file PHP, dan mengelola repositori git.

Catatan: Pada langkah (3): '2' dalam 2774 berarti 'mengatur ID Grup' untuk direktori. Ini menyebabkan file dan sub direktori baru yang dibuat di dalamnya untuk mewarisi ID grup dari direktori induk (bukan grup utama pengguna) Referensi: http://en.wikipedia.org/wiki/Setuid#setuid_and_setgid_on_directories

Xeoncross
sumber
Terlihat masuk akal bagi saya.
wazoox
Baik. Mungkin jika saya bisa mengkonfirmasi ini dengan beberapa orang lagi saya akan menggunakan pendekatan ini. Tampaknya menjadi jawaban terbaik yang saya dapat peras dari orang.
Xeoncross
Anda tidak menentukan siapa yang akan menjadi pemilik file. Apakah Anda membiarkannya sebagai root? Maka hanya sudoers yang dapat mengedit folder unggahan Anda (mungkin bukan yang Anda inginkan).
Nic
Ya, root akan tetap menjadi pemiliknya. Namun, karena pemilik grup sekarang "pengembang" (dan memiliki izin wrx) maka semua devs (dan apache / nginx) juga dapat membaca. Tidak perlu untuk sudo.
Xeoncross
7
Satu hal lagi yang harus diperhatikan adalah umask. Banyak sistem memiliki umask standar 022 yang akan menghapus izin menulis untuk grup dan publik pada file baru. Saya menduga Anda ingin 002 (tidak ada tulisan untuk umum) atau 007 (tidak ada akses untuk publik). Anda dapat mengatur umask di config Apache dan / atau skrip startup untuk setiap proses yang membutuhkan akses ke direktori. Jangan lupa untuk menambahkan ini ke / etc / profile atau / etc / bashrc sehingga diset secara default untuk pengembang Anda juga
Mark Porter
8

Saya tidak yakin apakah itu "benar", tapi inilah yang saya lakukan di server saya:

  • / var / www berisi folder untuk setiap situs web.
  • Setiap situs web memiliki pemilik yang ditunjuk, yang ditetapkan sebagai pemilik semua file dan folder di direktori situs web.
  • Semua pengguna yang mengelola situs web dimasukkan ke dalam grup untuk situs web tersebut.
  • Grup ini ditetapkan sebagai pemilik grup dari semua file dan folder di direktori.
  • File atau folder apa pun yang perlu ditulis oleh server web (mis. PHP) diubah pemiliknya menjadi www-data, pengguna yang menjalankan apache.

Ingatlah bahwa Anda harus mengaktifkan bit eksekusi pada direktori sehingga Anda dapat membuat daftar konten.

Nic
sumber
Bagaimana git / svn atau PHP membuat folder baru?
Xeoncross
2
PHP berjalan dalam konteks pengguna yang sama dengan server web, sehingga dapat membuat file dan folder di direktori mana pun yang dimiliki oleh server web. Pada umumnya hanya ada beberapa folder seperti ini (/ unggah / misalnya). Saya tidak yakin tentang git / svn - dapatkah Anda menambahkannya ke akun grup yang mengontrol situs web?
Nic
rupanya git berjalan ketika pengguna menjalankannya - sama seperti alat lainnya.
Xeoncross
Kemudian tambahkan pengguna git ke grup apache dan berikan izin menulis grup folder.
David Rickman
Saya baru saja mengatakan, git tidak memiliki pengguna - ini berjalan sebagai pengguna saat ini menggunakannya.
Xeoncross
7

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/binmana sesuai dengan tesis ini.

Izin git terpecahkan.

Izin pengguna tampaknya dapat dipecahkan dengan menambahkan semua pengguna yang membutuhkan akses ke direktori www ke www-datagrup yang menjalankan apache (dan nginx).

Jadi sepertinya satu jawaban untuk pertanyaan ini seperti ini:

Secara default /var/wwwdimiliki oleh root:rootdan 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"

sudo chgrp -R www-data /var/www

2) Tambahkan pengguna ke www-data

Maka kita perlu menambahkan pengguna saat ini (dan siapa pun) ke grup www-data

sudo usermod -a -G www-data demousername

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 ).

sudo chmod -R 2770 /var/www

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?

Xeoncross
sumber
6
Saya tidak suka gagasan memiliki semua file web dapat ditulis oleh PHP, itu meningkatkan kemungkinan paparan Anda jika ada kerentanan skrip.
Nic
Ok, saya tahu saya menggunakan PHP untuk membuat banyak file teks, tar, log, dan gambar (plus folder) jadi saya hanya berasumsi bahwa semuanya harus dapat ditulis. Namun, mungkin hak dan PHP Anda hanya dapat MENGUBAH FILE IT CREATES yang tidak berbahaya karena 99% dari semua aplikasi PHP tidak pernah membuat file skrip. Pilihan lain tampaknya hanya mengizinkan direktori tertentu akses tulis PHP (/ uploads /) yang tidak dibuat karena karena itu PHP masih dapat digunakan untuk membuat sesuatu yang buruk di sana. Ada ide?
Xeoncross
2
Cobalah untuk memisahkan skrip dan data. Bahkan jika seorang penyerang berhasil menjatuhkan sesuatu di / unggah /, itu seharusnya tidak dapat dieksekusi. Keamanan berlapis-lapis adalah kuncinya.
Nic
6

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.

Phil P
sumber
Jawaban yang bagus. Pada MacOS X, sistem berperilaku seolah bit SGID ada di direktori secara otomatis. Bit lengket biasanya berarti Anda hanya dapat menghapus file jika Anda dapat menulisnya. Artinya, siapa pun dapat menghapus file yang dapat ditulis untuk umum di / tmp. Di MacOS X, / tmp adalah symlink ke direktori pribadi untuk pengguna - jadi tidak ada pembagian sama sekali.
Jonathan Leffler
Terima kasih atas jawabannya, saya telah memperbarui pertanyaan dengan informasi lebih lanjut.
Xeoncross
Jonathan: bit sticky berarti hanya pemilik direktori, atau pemilik file, dapat mengubah nama atau menghapusnya (yaitu, bertindak atas entri di direktori 'file'). Izin pada file individual tidak ikut bermain untuk operasi direktori ini ( rename(), unlink()), hanya untuk tindakan pada file itu sendiri ( open()). Ini adalah perilaku "biasa".
Phil P
2

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

Pengikat dasi
sumber
+1 untuk informasi bermanfaat tentang ACL. Namun, saya tidak ingin sampah tambahan menghambat sistem hanya untuk mengelola server sederhana dengan beberapa pengembang. Saya juga merasa tidak nyaman dengan mengkompilasi ulang Kernel untuk menggunakan ACL.
Xeoncross
@ Xeoncross: ACL jangan merusak apa pun. Mereka hanya metainformation seperti izin file normal. Ini tidak semua yang "ekstra" dan rumit, saya percaya itu adalah cara paling sederhana dan terbaik untuk mengelola izin daripada beberapa solusi lengket / kelompok / apa pun yang membingungkan. Jangan takut, remount dengan acl dan cobalah!
Pejuang
1

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:

chown -R paddy:www-data /var/www/websiteindevelopment
chmod -R 755 /var/www/websiteindevelopment
chmod -R 775 /var/www/websiteindevelopment/directorywritablebygroup
find /var/www/websiteindevelopment -type f -perm 755 -print -exec chmod 644 {} \;  
find /var/www/websiteindevelopment -type f -perm 775 -print -exec chmod 664 {} \;
Jonny
sumber
0

Menambahkan ke jawaban Xeoncross, saya pikir akan lebih baik untuk mengkonfigurasi izin pada file dan direktori secara terpisah.

sudo find /var/www -type d -exec chmod 775 {} \;  # Change permissions of directories to rwxrwxr-x
sudo find /var/www -type f -exec chmod 664 {} \;  # Change file permissions to rw-rw-r--

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.

MikeyE
sumber