Nginx'te sanal konak başına kullanıcı


31

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:


7

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.


2
Yani kullanıcının dosyalarını başka bir kullanıcıdan gizlemenin bir yolu yok mu? Kullanıcının tüm içeriği www-data tarafından okunabilir mi?
Alex Netkachov

1
Dosyaların www verisine (veya web sunucusu hangi kullanıcı olarak çalışırsa) erişilebilmesini sağlamak, dosyaların sistemdeki diğer kullanıcılar tarafından erişilebilir olmasını gerektirmez.
Womble

2
Belge köküne bir grup verin www-datave vhost'u 0710kurduğ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+xdizinler ve o+rdosyalar için olması gerekir .
womble

13
Dikkat: bir PHP betiği (veya bir cgi-bin işlemi) altında çalışıyorsa www-data, bir PHP betiği veya bir cgi-bin işlemi gerçekleştirebilen her www-datakullanı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 .
Ivan Vučica

2
@Ricalsin UNIX'in çok kullanıcılı bir işletim sistemi olduğunu ve sunucuların birden fazla kullanıcıya sahip olabileceğini unutmayın. Örneğin peterve 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.
Ivan Vučica

9

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.confveya .confher 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.


5

Ivan'ın yukarıdaki yorumuna cevaben ve OP'ye uygulanabilir görünüyor. İki şey:

  1. Uygulama belgesi kökü /blah/peterWeb/htmlve 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.

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


4
Hayır. Onu özlüyorsun. PHP komut dosyaları, Apache'nin işleminde (veya diğer web sunucularının) yürütüldüğünde, barındırma işlemi ayrıcalıkları altında çalışacaktır. Çok sayıda saf kurulumda bu kullanıcı 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.
Ivan Vučica

(Ayrıca, yorum yerine bir cevap eklemek, StackOverflow türündeki sitelerin kötüye kullanılmasıdır, aslında bir cevap verdiğiniz
etkiyi gösterir

@ IvanVučica Güncelleştirildi ve tavsiyenizi destekleyen yararlı bir bağlantı ekledi. Teşekkürler.
Ricalsin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.