Nginx'te sanal sunucu başına farklı bir kullanıcıyı yapılandırmak mümkün mü?
Gibi bir şey
server {
user myprojectuser myprojectgroup;
...
}
Nginx'te sanal sunucu başına farklı bir kullanıcıyı yapılandırmak mümkün mü?
Gibi bir şey
server {
user myprojectuser myprojectgroup;
...
}
Yanıtlar:
Hayır, çünkü bir nginx konfigürasyonundaki tüm sunucu stanlaları aynı çalışan işlem setinden sunuluyor. Ayrıca, güvenlik açısından, içeriğin web sunucusu tarafından otomatik olarak istenmeyen olduğu anlamına geldiğinden (a gibi aptallıklar bulunmadığından ), nginx'te bir güvenlik açığı varsa, içeriğin hiçbiri olmadığından, bu şekilde çalıştırmanız daha iyi olur chmod -R 0777
. risk altında.
www-data
ve vhost'u 0710
kurduğunuzda izin verin (bunun nginx'i yapılandırmak için kök gerektirdiğinden, otomasyonunuzun da gerekli izinleri ayarlamasını sağlamak bir sorun değildir). O zaman docroot içeriğinin sadece o+x
dizinler ve o+r
dosyalar için olması gerekir .
www-data
, bir PHP betiği veya bir cgi-bin işlemi gerçekleştirebilen her www-data
kullanıcı , kullanıcının erişebileceği herhangi bir dosyaya erişebilir . Bu config.php.inc
, paylaşılan bir makinede veritabanı şifrelerini saklayan veya benzer şekilde kullanan herkes için açık değildir .
peter
ve john
. Web sayfalarını barındırıyorlar ~/public_html
. Bu konuyu tartışan herhangi bir kişi tarafından belirtilmeyen farklı bir yaklaşımın bulunmadığı durumlarda, bir .php betiği de altında çalıştığı web sunucusuyla aynı izinlere sahiptir www-data
. Bu, web sunucusu ve PHP tercümanı gibi, başka herhangi bir .php betiğini okuyabileceği anlamına gelir.
Evet. Ekstra güvenlik için mümkündür ve önerilmektedir (aşağıdaki nedene bakınız).
PHP-FPM kullandığınızı göz önünde bulundurarak (muhtemelen her zamanki gibi), her alan için farklı bir kullanıcının sahip olduğu bir makara oluşturabilirsiniz.
Not: Buraya adım adım ayrıntılı bir eğitim verdim:
https://learnwithdaniel.com/2019/06/user-per-virtual-host-nginx/
1. Makaralar oluşturun:
Makaraları ekleyin /etc/php/7.0/fpm/pool.d/www.conf
veya .conf
her yeni makara için yeni bir dosya oluşturun.
Biriktirme # 1 (kullanıcım1):
[myprojectuser1]
user = myuser1
group = myprojectgroup
..
listen = /run/php/myuser1.sock
...
listen.owner = www-data
listen.group = www-data
Biriktirme # 2 (kullanıcı 2):
[myprojectuser2]
user = myuser2
group = myprojectgroup
..
listen = /run/php/myuser2.sock
...
listen.owner = www-data
listen.group = www-data
Not: listen.owner / listen.group grubunuzu aynı nginx kullanıcısına (genellikle www-data ) tutun .
2. Her makarayı sunucu bloğuna atayın (apache kullanıcıları için sanal ana bilgisayar):
Ana bilgisayar 1:
server {
...
location ~ \.php$ {
fastcgi_pass unix:/run/php/myuser1.sock;
}
...
}
Ana bilgisayar 2:
server {
...
location ~ \.php$ {
fastcgi_pass unix:/run/php/myuser2.sock;
}
...
}
FPM ve NGINX servislerini yeniden başlatın
sudo /etc/init.d/php7.0-fpm restart
sudo service nginx restart
Test yapmak:
Geçerli işlem kullanıcısını gösterecek bir pinfo.php (veya herhangi bir isim) dosyası oluşturun:
<?php
echo str_replace("\n", '<br>', shell_exec('ps -u -p '.getmypid()));
Veya pinfo.php dosyasını bash ile oluşturun:
echo "<?php echo str_replace(\"\\n\", '<br>', shell_exec('ps -u -p '.getmypid()));" > pinfo.php
Ardından tarayıcınızda " http: //.../pinfo.php " dosyasını açın .
Neden birden fazla kullanıcı kullanmalı (güvenlik sebepleri):
Tüm web sitelerinizi aynı kullanıcı altında ( www-data ) çalıştırırsanız, PHP (system /) / passthru () / exec () işlevine yapılan çağrı tüm web sitelerine erişebilir! NGINX sizi buna karşı korumaz. PHP sadece bir örnek, ancak herhangi bir popüler web sunucusu dili benzer aramalara sahip. Bir hacker olarak, tüm web sitelerinde gezinmek için " ls .. " ve herhangi bir dosyaya (başka bir web sitesi dosyaları dahil) kendi kodunuzu yazmak için " cp / echo / mv " yazabilirsiniz. Sunucudaki tüm web siteleri aynı kişiye ait olsa bile (örneğin siz) her bir web sitesini farklı bir kullanıcıyla çalıştırmanız önerilir; çünkü bilgisayar korsanlarının / virüslerin (örneğin Wordpress virüslerinin) diğer web sitelerinize erişmesini önler.
Ivan'ın yukarıdaki yorumuna cevaben ve OP'ye uygulanabilir görünüyor. İki şey:
Uygulama belgesi kökü /blah/peterWeb/html
ve gibi bir şey olurdu /blah/johnWeb/html
. Hem NGINX hem de Apache2, her ikisi de www-data'yı grup olarak çalıştırsalar bile birinin diğer dizinde çalışmasına ya da çalışmasına izin vermez.
Her bir dizin ağacını kendi kullanıcı izninin altına koymak, her kullanıcının bir UNIX sistemine ssh / login yapmasına ve dizinlerini her birine özel tutmasına olanak tanır - her kullanıcıyı www-veri grubuna koyma. Kabul ederseniz, cümleniz:
Bir PHP betiği veya bir cgi-bin işlemi yapabilen her kullanıcı www-data kullanıcısı tarafından erişilebilen herhangi bir dosyaya erişebilir.
daha doğru bir şekilde yazılmış olabilir:
apache / nginx sunucusu (www-data) ile aynı gruba koyduğunuz her kullanıcı, istediği her şeyi yapabilir (php betiği dahil olmak üzere), erişilebilir olan herhangi bir dosyada (web'de her şey olur) sunucu).
1 EDIT: Bazı Sunucu Yöneticisi sorunları ele almak zorunda Bu konuya daha fazla baktım. Ivan'ın bilgilerinin ne kadar doğru olduğunu bilmiyordum! Kullanıcılara paylaşılan bir barındırma yapılandırmasına komut dosyası yükleme ve çalıştırma yeteneği vermek isterseniz, o zaman dikkat edin. İşte bir yaklaşım . Bu kırılganlığı anladığımdan emin olmak için şapka Ivan'a bahşiş veriyor.
www-data
. Johnny bir komut dosyası oluşturabilir ve altında çalışabilir www-data
(bu, naif kurulumlarda yapabileceği), Johnny'nin senaryosu Peter'ın komut dosyalarını okuyabilir ve tekrar Johnny'e gönderebilir. Bunun gruplarla hiçbir ilgisi yok. Doğru çözüm, suPHP'ye (eğer normal olarak kurulursa, kötü, kötü yazılmış kod olarak daha sonra bu kullanıcının tüm dosyalarını tehlikeye sokarsa) veya bir hapis ya da kullanıcı başına tahsis edilmiş ek web kullanıcısına sahip olmaktır.