Web sunucusunun yazamadığı bir dosya çoğu kez 777 ile düzeltilir ve işe de yarar. Ama bu, makinedeki herhangi bir sürecin - bir saldırganın az önce yüklediği süreç de dahil - onu yeniden yazabilmesi demektir. Asıl soru izinlerin ne olduğu değil, dosyanın kime ait olduğudur.

Doğru düzen

sudo chown -R sara:www-data /var/www/site
sudo find /var/www/site -type d -exec chmod 2750 {} \;
sudo find /var/www/site -type f -exec chmod 640 {} \;

# only what genuinely must be written
sudo chmod -R 2770 /var/www/site/storage /var/www/site/uploads

Dosyalar sizin, grup web sunucusunun; o her şeyi okur ve yalnızca buna ihtiyacı olan iki dizine yazar.

Baştaki 2, grup tuzağıdır

O setgid'dir. O olmadan, dizinin içinde oluşturulan bir dosya kendi oluşturucusunun grubunu alır; böylece web sunucusunun yüklediği bir dosyayı siz okuyamazsınız, sizin oluşturduğunuzu da o yazamaz. Başka biri bir dosya ekleyene kadar her şey yolunda görünür - arızanın rastgele görünmesinin sebebi de budur.

sudo chmod g+s /var/www/site/uploads
ls -ld /var/www/site/uploads      # drwxrws--- - the s is the setgid bit

YENİ dosyaların ne alacağına umask karar verir

umask            # 0022 typical: new files 644, new dirs 755
umask 0007       # files 660, dirs 770 - nothing for others

Bir art süreç için onu kabuk profilinizde değil hizmet biriminde ayarlayın; yoksa yalnızca elle oluşturduğunuz dosyalara işler.

# /etc/systemd/system/app.service
[Service]
UMask=0007

Asla 777

Bir yükleme dizininde 777 ve orada PHP çalıştırmaya razı bir web sunucusu, bir sitenin ele geçirilmesinin tek en yaygın yoludur. Bakınız yükleme dizini: asla çalıştırılabilir olmasın.

Zaten yanlış olanı bulun

find /var/www -perm -o=w -not -type l | head -20