Pengguna apa yang harus menjalankan apache dan PHP? Izin apa yang harus dimiliki file / var / www?

41

Saya hanya memutar kotak Ubuntu 11.10 dan kemudian berlari apt-get install apache2 php5untuk menginstal apache2 dan PHP 5 pada kotak. Sekarang berfungsi sebagai "server web" dan memuat "Berhasil!" halaman. Sekarang saya mencoba untuk memperketat keamanan dan saya memiliki pertanyaan berikut tentang server web linux:

  1. Siapa yang seharusnya menjalankan apache?
  2. Grup apa yang harus diikuti oleh pengguna ini?
  3. Paket apa yang dapat membuat PHP (dan Apache?) Berjalan sebagai pemilik file? (seperti pada host web bersama) Haruskah saya menggunakan paket ini? Apakah mudah / layak untuk dipertahankan pada sistem yang kecil?
  4. Apa yang seharusnya menjadi izin default untuk file dan folder yang dilayani ke web dengan menjalankan apache www-data? Untuk apache / php berjalan sebagai pengguna?

Saya telah melakukan hal-hal berikut dalam pemeriksaan pengaturan default:

Struktur File

Ketika saya cd /dan melakukan ls -aldaftar konten, saya melihat /var:

drwxr-xr-x 13 root root  4096 2012-02-04 20:47 var/

Jika saya cdmasuk vardan ls -alsaya melihat:

drwxr-xr-x  2 root root  4096 2012-02-04 20:47 www/

Akhirnya, di dalam /var/wwwsaya melihat:

drwxr-xr-x  2 root root 4096 2012-02-04 20:47 ./
drwxr-xr-x 13 root root 4096 2012-02-04 20:47 ../
-rw-r--r--  1 root root  177 2012-02-04 20:47 index.html

Takeaway utama saya adalah sejauh ini semua file ini milik root:root, file memiliki izin 644, dan direktori memiliki izin 755.

Izin Apache

Jika saya membuat file sebagai root /var/www/test.phpdengan konten:

<?php echo shell_exec('whoami');

dan memuat file itu ke browser yang diceritakannya kepada saya www-data, yang sama seperti di /etc/apache2/envvarsfile:

export APACHE_RUN_USER=www-data
export APACHE_RUN_GROUP=www-data

Jika saya melakukannya ps aux | grep -i apachesaya melihat yang berikut:

root      1916  1.2 104664  7488 Ss   20:47 /usr/sbin/apache2 -k start
www-data  1920  0.8 105144  5436 S    20:47 /usr/sbin/apache2 -k start
www-data  1921  1.0 105144  6312 S    20:47 /usr/sbin/apache2 -k start
www-data  1922  0.7 104688  4624 S    20:47 /usr/sbin/apache2 -k start
www-data  1923  0.7 104688  4624 S    20:47 /usr/sbin/apache2 -k start
www-data  1924  0.7 104688  4624 S    20:47 /usr/sbin/apache2 -k start
www-data  1925  0.7 104688  4624 S    20:47 /usr/sbin/apache2 -k start

Jadi siapa yang menjalankan apache? Sepertinya mungkin proses pertama adalah sebagai root, mungkin dari /etc/init.d/apacheskrip ketika sistem dimulai, dan yang lainnya muncul www-datadari yang pertama. Apakah itu benar?

Selanjutnya, jika saya mengetik groups www-datamaka saya melihat www-data : www-data- jadi sepertinya hanya berada di www-datagrup. Saya kira ini adalah praktik standar juga.

Hosting dan Keamanan Bersama

Jadi, jika saya memahami sesuatu dengan benar, jika apache berjalan www-datadan saya ingin apache dapat membaca direktori, xbit tersebut harus diatur untuk kelompok dunia (lainnya) ( o+x), dan itu juga perlu disetel pada semua induk direktori sepanjang jalan hingga rantai ( www, var). Dan jika saya ingin apache dapat membaca dari suatu file, maka o+rbit tersebut perlu diatur.

Sayangnya saya percaya ini memperkenalkan celah keamanan untuk beberapa aplikasi dan / atau banyak pengguna di kotak linux yang sama: Semua file web harus dapat dibaca dunia, dan karena itu mereka juga dapat diakses oleh aplikasi lain dan pengguna lain pada sistem. Jika satu aplikasi yang diinstal pada sistem memiliki kerentanan keamanan yang memungkinkan input pengguna mentah dan tidak divalidasi, yang kemudian dieksekusi oleh PHP, penyerang jarak jauh kemudian dapat menelusuri semua file lain di sistem web yang dapat dibaca dunia. Demikian juga, jika kotak memiliki beberapa pengguna, dan seorang pengguna mengetahui jalur file web pengguna lain, ia kemudian dapat membaca konten file (dan melihat hal-hal sensitif seperti string koneksi database, dll).

Saya pernah mendengar tentang dua paket, suphpdan phpsuexeckesepakatan itu memungkinkan file pengguna dilayani "seperti mereka" pada sistem bersama. Salah satu keunggulan dari ini adalah memungkinkan aplikasi web (seperti Wordpress) untuk membuat dan memodifikasi file - sangat membantu untuk menambah tema, plugin, dan meningkatkan perangkat lunak. Tentu saja mungkin lebih aman untuk melakukan hal-hal ini secara manual, tetapi bisakah kompromi dibuat dengan salah satu paket yang disebutkan di atas? Atau mungkin dengan menggunakan chownuntuk membuat grup direktori wordpress milik www-datadan mengatur bit sticky pada grup ( g+s)?

Saya hanya menggunakan ini sebagai pengguna akhir dari perusahaan hosting web, jadi saya tidak tahu seluk beluknya, dan apakah mereka bahkan masuk akal untuk menginstal pada sistem kecil, atau jika ada beberapa lainnya Langkah-langkah keamanan yang harus saya gunakan sebagai gantinya, tetapi saya pikir saya akan menyebutkannya di sini karena sepertinya merupakan salah satu cara yang mungkin untuk mengatasi beberapa masalah saya.

Kembali ke Pertanyaan

  1. Siapa yang seharusnya menjalankan apache?
  2. Grup apa yang harus diikuti oleh pengguna ini?
  3. Paket apa yang dapat membuat PHP (dan Apache?) Berjalan sebagai pemilik file? (seperti pada host web bersama) Haruskah saya menggunakan paket ini? Apakah mudah / layak untuk dipertahankan pada sistem yang kecil?
  4. Apa yang seharusnya menjadi izin default untuk file dan folder yang dilayani ke web dengan menjalankan apache www-data? Untuk apache / php berjalan sebagai pengguna?
cwd
sumber
Kemungkinan duplikat serverfault.com/questions/339948/…
AD7six

Jawaban:

17
  1. bukan root
  2. bukan root
  3. SuEXEC
  4. Tergantung. 644 untuk file dan 755 untuk folder adalah default aman.

Jangan mengubah kepemilikan apa pun menjadi www-data kecuali Anda ingin php dapat mengedit konten file / folder itu

Terlepas dari apa pun yang Anda lakukan: folder perlu membaca dan mengeksekusi izin bagi pengguna untuk menemukan file; file perlu izin baca agar pengguna dapat membacanya. Jika Anda mendapatkan kesalahan izin saat mengubah sesuatu - Anda telah berhasil menghapus izin yang diperlukan secara mendasar ini.

Jika Anda tidak menulis file apa pun melalui aplikasi php Anda, Anda dapat meninggalkan file yang Anda miliki: Anda. Dalam keadaan ini, izin dunia (xx4 / 5) adalah yang berlaku.

Jika Anda meninggalkan file seperti yang Anda miliki: Anda memiliki hak akses file 644 (file) yang artinya adalah Anda hanya dapat mengedit file situs web - www-data bukan Anda - sehingga file tidak dapat diedit.

Jika Anda ingin membatasi akses ke apache + Anda dan memblokir semua akses lainnya chown -R you:www-data *. Dengan izin file 640 dan izin folder 750 yang dapat Anda edit, www-data dapat membaca - karena dengan demikian apache membaca izin grup (x4 / 5x).

Membatasi minimum jalur Anda mengizinkan apache / php untuk menulis ke - apakah ada tmp dir kebutuhan aplikasi untuk menulis ke - memungkinkan untuk menulis ke folder yang hanya - dan untuk setiap lokasi yang dapat ditulis jika mungkin membuat yakin itu luar yang mendokumentasikan root atau mengambil langkah-langkah untuk memastikan jalur yang dapat ditulis ini tidak dapat diakses web.

Perhatikan bahwa "Anda" seharusnya tidak menjadi root. Mengizinkan akses ssh langsung sebagai root adalah indikator penyimpangan keamanan lainnya (seperti tidak melarang login kata sandi), tapi itu sejumlah pertanyaan tersendiri.

AD7six
sumber
10

Jadi jika saya memahami sesuatu dengan benar, jika apache berjalan sebagai www-data dan saya ingin apache dapat membaca direktori, x bit perlu diatur untuk kelompok dunia (lainnya) (o + x), dan itu juga perlu diatur pada semua direktori induk sepanjang rantai (www, var). Dan jika saya ingin apache dapat membaca dari suatu file, maka bit o + r perlu diatur.

Ini tidak benar, Anda tidak harus menetapkan rwxuntuk 'lain'. Anda harus mengubah pemilik dan / atau grup folder / file tertentu yang Anda coba lindungi. Misalnya:

chown -R cwd:www-data /var/www/cwd.com
chmod 750 /var/www/cwd.com

Sekarang hanya anggota grup yang www-datadapat membaca /var/www/cwd.com. Dan hanya Anda (cwd) yang bisa menulisnya. Jika Anda ingin mengizinkan aplikasi Anda (melalui Apache) untuk menulis / memodifikasi file di direktori itu juga Anda chmod ke 770.

Saya pikir ini mencakup semua masalah Anda, saya tidak melihat alasan untuk mengubah apache pengguna berjalan di bawah.

Rob Wouters
sumber
2
Terima kasih. Ini bukan solusi yang buruk, tetapi jika satu pengguna mengetahui path ke file pengguna lain, bisa menulis skrip yang akan membaca isi file, dan kemudian memuatnya di browser web, yang akan menjalankannya sebagai apache - membaca secara efektif file dari direktori pengguna lain. Apakah itu masuk akal? Jadi, bahkan jika Anda mengatur izin folder ke 750 masih ada kerentanan keamanan potensial.
cwd
@ cwd apakah Anda akhirnya menemukan ini?
Ricky Boyce
@ cwd Ini adalah pertanyaan persis yang saya miliki. Itu sebabnya saya menanyakan ini: serverfault.com/questions/807723/...
Nandakumar Edamana