Pengguna per host virtual di Nginx


31

Apakah mungkin di nginx mengkonfigurasi pengguna yang berbeda per host virtual?

Sesuatu seperti

 server {
     user myprojectuser myprojectgroup;
     ...
 }

Jawaban:


7

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.


2
Jadi tidak ada cara untuk menyembunyikan file pengguna dari pengguna lain? Semua konten pengguna harus dapat dibaca oleh www-data?
Alex Netkachov

1
Membuat file dapat diakses oleh www-data (atau pengguna apa pun yang dijalankan oleh server web) sama sekali tidak mengharuskan file tersebut dapat diakses oleh pengguna lain di sistem.
womble

2
Berikan kumpulan dokumen root www-datadan perms 0710ketika 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+xuntuk direktori dan o+rfile.
womble

13
Hati-hati: jika skrip PHP (atau proses cgi-bin) berjalan di bawah www-data, setiap pengguna yang dapat menyajikan skrip PHP atau proses cgi-bin dapat mengakses file apa pun yang dapat diakses oleh www-datapengguna. Ini tampaknya tidak jelas bagi siapa pun yang menyimpan kata sandi basis data di config.php.incatau serupa pada mesin bersama.
Ivan Vučica

2
@Ricalsin Ingatlah bahwa UNIX adalah sistem operasi multi-pengguna, dan server dapat memiliki lebih dari satu pengguna. Sebagai contoh, peterdan 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.
Ivan Vučica

9

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.confatau buat .conffile 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.


5

Menanggapi komentar Ivan di atas dan yang tampaknya berlaku untuk OP. Dua hal:

  1. Root dokumen aplikasi akan menjadi seperti /blah/peterWeb/htmldan /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.

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


4
Tidak. Kamu melewatkannya. Skrip PHP, ketika dieksekusi dalam proses Apache (atau server web lain) akan berjalan di bawah hak proses hosting. Pada sejumlah besar pengaturan naif pengguna 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.
Ivan Vučica

(Juga, menambahkan jawaban alih-alih komentar adalah penyalahgunaan situs jenis StackOverflow, mengesankan Anda benar-benar memberikan jawaban. Hindari itu.)
Ivan Vučica

@ IvanVučica Diperbarui dan menambahkan tautan bermanfaat yang mendukung saran Anda. Terima kasih.
Ricalsin
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.