Apakah mungkin di nginx mengkonfigurasi pengguna yang berbeda per host virtual?
Sesuatu seperti
server {
user myprojectuser myprojectgroup;
...
}
Apakah mungkin di nginx mengkonfigurasi pengguna yang berbeda per host virtual?
Sesuatu seperti
server {
user myprojectuser myprojectgroup;
...
}
Jawaban:
Tidak, karena semua bait server dalam konfigurasi nginx dilayani dari rangkaian proses pekerja yang sama. Selain itu, dari perspektif keamanan, Anda lebih baik menjalankannya seperti itu, karena itu berarti bahwa konten secara otomatis tidak dapat ditulis oleh server web (tidak ada kebodohan seperti a chmod -R 0777
), sehingga jika ada kerentanan di nginx, tidak ada konten beresiko.
www-data
dan perms 0710
ketika Anda mengatur vhost (karena ini membutuhkan root untuk mengkonfigurasi nginx, itu bukan masalah untuk memiliki otomatisasi Anda juga mengatur izin yang diperlukan). Maka isi dokumen hanya perlu o+x
untuk direktori dan o+r
file.
www-data
, setiap pengguna yang dapat menyajikan skrip PHP atau proses cgi-bin dapat mengakses file apa pun yang dapat diakses oleh www-data
pengguna. Ini tampaknya tidak jelas bagi siapa pun yang menyimpan kata sandi basis data di config.php.inc
atau serupa pada mesin bersama.
peter
dan john
. Mereka meng-hosting halaman web mereka di ~/public_html
. Tidak ada pendekatan berbeda yang tidak disebutkan oleh siapa pun yang membahas hal di atas, skrip .php memiliki izin yang sama dengan server web seperti yang juga dijalankan di bawahnya www-data
. Ini berarti, sama seperti server web dan penerjemah PHP, ia dapat membaca skrip .php lainnya.
Iya nih. Dimungkinkan dan direkomendasikan untuk keamanan ekstra (lihat mengapa di bawah).
Menimbang bahwa Anda menggunakan PHP-FPM (Anda mungkin, karena ini adalah yang paling biasa), Anda dapat membuat spool, yang dimiliki oleh pengguna yang berbeda, untuk setiap domain.
PS: Saya menulis tutorial langkah demi langkah yang terperinci di sini:
https://learnwithdaniel.com/2019/06/user-per-virtual-host-nginx/
1. Buat gulungan:
Tambahkan gulungan ke /etc/php/7.0/fpm/pool.d/www.conf
atau buat .conf
file baru untuk setiap gulungan baru.
Kumparan # 1 (myuser1):
[myprojectuser1]
user = myuser1
group = myprojectgroup
..
listen = /run/php/myuser1.sock
...
listen.owner = www-data
listen.group = www-data
Kumparan # 2 (myuser2):
[myprojectuser2]
user = myuser2
group = myprojectgroup
..
listen = /run/php/myuser2.sock
...
listen.owner = www-data
listen.group = www-data
PS: Jaga listen.owner / listen.group ke pengguna nginx yang sama (biasanya www-data ).
2. Tetapkan setiap spool ke blok servernya (host virtual untuk pengguna apache):
Tuan rumah 1:
server {
...
location ~ \.php$ {
fastcgi_pass unix:/run/php/myuser1.sock;
}
...
}
Tuan rumah 2:
server {
...
location ~ \.php$ {
fastcgi_pass unix:/run/php/myuser2.sock;
}
...
}
Mulai ulang layanan FPM dan NGINX
sudo /etc/init.d/php7.0-fpm restart
sudo service nginx restart
Pengujian:
Buat file pinfo.php (atau apa pun nama) yang akan menunjukkan proses pengguna saat ini:
<?php
echo str_replace("\n", '<br>', shell_exec('ps -u -p '.getmypid()));
Atau buat file pinfo.php via bash:
echo "<?php echo str_replace(\"\\n\", '<br>', shell_exec('ps -u -p '.getmypid()));" > pinfo.php
Kemudian buka " http: //.../pinfo.php " di browser Anda.
Mengapa menggunakan banyak pengguna (alasan keamanan):
Jika Anda menjalankan semua situs web Anda di bawah pengguna yang sama ( www-data ), panggilan PHP ke sistem () / passthru () / exec () akan memiliki akses ke semua situs web! NGINX tidak akan melindungi Anda dari ini. PHP hanyalah sebuah contoh, tetapi bahasa server web populer mana pun memiliki panggilan serupa. Sebagai seorang peretas, Anda dapat " ls .. " untuk menavigasi melalui semua situs web dan " cp / echo / mv " untuk menulis kode Anda sendiri dalam file apa pun (termasuk file situs web lain). Sekalipun semua situs web di server dimiliki oleh orang yang sama (mis. Anda), disarankan untuk menjalankan setiap situs web dengan pengguna yang berbeda, karena itu akan mencegah peretas / virus (virus Wordpress) untuk mengakses situs web Anda yang lain.
Menanggapi komentar Ivan di atas dan yang tampaknya berlaku untuk OP. Dua hal:
Root dokumen aplikasi akan menjadi seperti /blah/peterWeb/html
dan /blah/johnWeb/html
. Baik NGINX dan Apache2 tidak akan mengizinkan satu untuk membaca dengan teliti atau beroperasi di direktori lain bahkan jika keduanya menjalankan www-data sebagai grup.
Menempatkan setiap pohon direktori di bawah izin pengguna mereka sendiri akan memungkinkan setiap pengguna untuk ssh / login ke sistem UNIX dan menjaga direktori mereka pribadi untuk masing-masing - hanya saja jangan menempatkan setiap pengguna ke dalam kelompok data-www. Jika Anda setuju, maka kalimat Anda:
setiap pengguna yang dapat menyajikan skrip PHP atau proses cgi-bin dapat mengakses file apa pun yang dapat diakses oleh pengguna data-www.
mungkin lebih akurat ditulis sebagai:
setiap pengguna yang Anda letakkan dalam grup yang sama dengan server apache / nginx (www-data) kemudian dapat melakukan apa pun yang mereka inginkan (termasuk menjalankan skrip php) dalam file apa pun yang dapat diaksesnya (yang pada dasarnya akan menjadi segalanya di web server).
EDIT 1: Harus mengatasi beberapa masalah Admin Server saya melihat lebih jauh ke dalam topik ini. Saya tidak mengetahui seberapa akurat informasi Ivan! Jika Anda bermaksud memberi pengguna kemampuan untuk mengunggah dan menjalankan skrip pada konfigurasi hosting bersama, maka perhatikan. Inilah satu pendekatan . Hat tip ke Ivan untuk memastikan saya memahami kerentanan ini.
www-data
. Jika Johnny dapat membuat skrip dan menjalankannya di bawah www-data
(yang pada pengaturan naif dia bisa), maka skrip Johnny dapat membaca skrip Peter dan mengirimkannya kembali ke Johnny. Ini tidak ada hubungannya dengan kelompok. Solusi yang tepat adalah memiliki suPHP (jika pengaturan naif, buruk, karena kode yang ditulis dengan buruk maka membahayakan semua file pengguna ini), atau penjara, atau pengguna web tambahan khusus per pengguna.