Apache 2'nin / var / www içindeki www-data kullanıcısı için izinleri en iyi kullanma şekli nedir?


215

Kimse dosyaları işlemek için güzel bir çözüm var /var/wwwmı? Ad Tabanlı Sanal Konakları çalıştırıyoruz ve Apache 2 kullanıcısı www-data .

İki normal kullanıcımız ve root'umuz var. Yani dosyaları karıştırırken yapmak zorunda değilsiniz /var/www...

chown -R www-data:www-data

... her zaman, bununla baş etmenin iyi bir yolu nedir?

Ek soru: Daha sonra izinleri ne kadar zorlarsın?

Bu, işbirlikçi geliştirme ortamlarında her zaman bir sorun olmuştur.


Yanıtlar:


206

@ Zoredache'nin cevabını genişletmeye çalışmak , bunu kendim hallederim:

  • Yeni bir grup oluşturun (www-pub) ve kullanıcıları bu gruba ekleyin

    groupadd www-pub

    usermod -a -G www-pub usera ##, mevcut gruplara eklemek için -a öğesini kullanmalıdır

    usermod -a -G www-pub userb

    groups usera ## kullanıcı için ekran grupları

  • / Var / www altındaki herşeyin sahipliğini root olarak değiştirin: www-pub

    chown -R root:www-pub /var/www Özyinelemeler için ## -R

  • Tüm klasörlerin izinlerini 2775 olarak değiştirin.

    chmod 2775 /var/www ## 2 = set grubu kimliği, 7 = işletme sahibi (root) için rwx, grup için 7 = grup (www-pub), 5 = dünya için rx (apache www-data kullanıcısı dahil)

    Grup kimliğini ayarla ( SETGID ) bit (2), grubun (www-pub) bu ​​klasörde oluşturulan tüm yeni dosyalara / klasörlere kopyalanmasına neden olur. Diğer seçenekler, kullanıcı kimliğini kopyalamak için SETUID (4) ve sadece sahibinin dosyaları silmesine izin verdiğini düşündüğüm STICKY (1).

    Orada bir var -Rözyinelemeli seçenek, ama bu dosya ve klasörler arasında ayrım olmayacak, böylece zorunda bulmak kullanmak şöyle:

    find /var/www -type d -exec chmod 2775 {} +

  • Tüm dosyaları 0664 olarak değiştir

    find /var/www -type f -exec chmod 0664 {} +

  • Kullanıcılarınız için umask değerini 0002 olarak değiştirin.

    Umask, varsayılan dosya oluşturma izinlerini kontrol eder, 0002, dosyaların 664 ve dizinlerin 775 olacağı anlamına gelir. Bunun ayarlanması ( benim durumumun umaskaltındaki satırı düzenleyerek /etc/profile), bir kullanıcı tarafından oluşturulan dosyaların www- deki diğer kullanıcılar tarafından yazılabileceği anlamına gelir. chmodonlara ihtiyaç duymadan grup .

Bunları bir dosya ve dizin oluşturarak ve sahibini, grubunu ve izinlerini doğrulayarak test edin ls -l.

Not: Gruplarınızdaki değişikliklerin yürürlüğe girmesi için oturumu kapatmanız / oturum açmanız gerekir!


6
@Tom Bunun için findkomut kullanmanızı öneririz görmek harika . Çok sayıda dosya / dizininiz varsa ve GNU bulma özelliğini kullanıyorsanız, vereceğim küçük bir performans ipucu , komutun birden çok dosyada çalışabilmesi+ yerine kullanmaktır çünkü "mümkün olduğunca çok dosyada komut çalıştırmak daha hızlıdır" her seferinde dosya başına bir defa olmak yerine. Bunu yapmak, her seferinde komutu başlatmak için harcadığınız zamandan tasarruf etmenizi sağlar. " Ayrıca, ters eğik çizgi gerektirmediğinden yazması daha kolaydır. \;
aculich

2
@ Aculich'in önerisi kullanıldı + değil \;
Tom

1
@SunnyJ. şunu deneyin (dış tırnaklar olmadan): "find / var / www -type f -exec chmod 0664 '{}' \ +" Bunu deneyin. '{}' İle \ + arasında bir boşluk var.
Buttle Butkus

1
neden başkalarının görmesi ve yürütmesi için izin vermemiz gerekiyor.
Kevin Parker,

1
@ Yıkmanın yolu, teşekkürler. Sadece bir not - bence cevabınıza eklenmiş olan "Kullanıcı kimliğini kopyalamak için SETUID (4)" yanlıştır. Yanlış - SETUID, Linux / Unix - Ref
Yarin

60

İzinleri nasıl yapılandırmak istediğinizden tam olarak emin değilim, ancak bu size bir başlangıç ​​noktası verebilir. Muhtemelen daha iyi yollar var. Her iki kullanıcının da / var / www / altındaki herhangi bir şeyi değiştirmesini istediğinizi farz ediyorum.

  • Yeni bir grup oluşturun (www-pub) ve kullanıcıları bu gruba ekleyin.
  • Kök için / var / www altındaki her şeyin sahipliğini değiştirin: www-pub.
  • Tüm klasörlerin izinlerini 2775 olarak değiştirin.
  • Tüm dosyaları 0664 olarak değiştirin.
  • Kullanıcılarınız için umask değerini 0002 olarak değiştirin.

Bu, kullanıcılarınızdan herhangi biri tarafından oluşturulan herhangi bir yeni dosyanın kullanıcı adı: www-pub 0664 olması ve oluşturulan dizinin kullanıcı adı: www-pub 2775 olması anlamına gelir. Apache, 'diğer kullanıcılar' bileşeni üzerinden her şeye okuma erişimi sağlar. Dizinlerdeki SETGID biti, klasörün sahibi olan gruba ait olarak oluşturulan tüm dosyaları zorlar. Yazma bitinin, gruptaki herkesin dosyaları düzenleyebilmesi için ayarlandığından emin olmak için umask'ın ayarlanması gerekir.

Ne kadar hardcore gelince izinlere geçiyorum. Tamamen siteye / sunucuya bağlıdır. Sadece 1-2 editör varsa ve onları işleri çok fena kırmalarına engellemem gerekiyorsa, o zaman kolay gideceğim. Eğer iş daha karmaşık bir şeye ihtiyaç duyarsa, o zaman daha karmaşık bir şey kurardım.


1
Olası ekleme - web sunucusu tarafından yazılması gereken önbellek / yükleme dizinlerini www-data olarak ayarlayın: www-data ve
775.

'Diğer' izinlerine güvenmek yerine kullanıcıları apache grubuna eklemek de işe yarar mı? Tek yapmanız gereken dosyaları yüklemek ve bu dosyaların apache tarafından okunabilmesi gerekiyorsa, 3. bir grup sadece bu dosyaları düzenlemeniz gerekiyorsa faydalı olabilir.
Simurr

1
Bu biraz @Zoredache genişletmek için herhangi bir şans? Rwx bitlerinin, chmod, chown, adduser, usermod'un temel kullanımlarını biliyorum, ama beni sekizli izinler, ölümler ve diğer her şeyden ilk basamakta kaybettiniz. Seviyelendirilmiş yaklaşımınızı gösteren bazı örnek komutlar büyük memnuniyet duyacaktır.
Tom

1
Bu şekilde her kullanıcı diğer tüm kullanıcı dosyalarına erişebilir! Bu, userA, userB'nin config.php… 'ini okuyabilir, mysql referansını durdurabilir, örneğin
drAlberT

1
Acl'yi

39

Yardımcı olabilecek POSIX ACL (erişim kontrol listeleri) bulabileceğinizi düşünüyorum. Kullanıcıya göre daha ince taneli izin modeline izin verirler: grup: diğer model. Daha açık olabileceğimden ve ayrıca dosya sisteminin bir dalı için "varsayılan" davranışı ayarlayabildiğim için kafamın içinde düz durmaları daha kolay oldu.

Örneğin, her kullanıcının izinlerini açıkça belirtebilirsiniz:

setfacl -Rm d:u:userA:rwX,u:userA:rwX /var/www
setfacl -Rm d:u:userB:rwX,u:userB:rwX /var/www

Veya paylaşılan bazı gruplara göre yapabilirsiniz:

setfacl -Rm d:g:groupA:rwX,u:groupA:rwX /var/www

Belki de Apache kullanıcınızı salt okunur olarak tutmak istersiniz.

setfacl -Rm d:u:www-data:rX,u:www-data:rX /var/www

Man sayfaları:

Eğitimi


2
Bu şekilde ! +1
drAlberT

Galibiyet için ACL +1 ... Daha fazlasını görmek için serverfault.com/a/360120/41823
Yarin

1
ACL vs temel izinler için olumsuz bir performans olup olmadığını merak ediyorum.
Buttle Butkus

2
Ne yazık ki, ACL standart kurulumlarda / dağıtımlarda çok sık eksik. Bazen dosya sistemlerini değiştirdiğim veya yönettiğim her sunucuda çekirdeği derlemek bir acıdır. Ayrıca, dosyaları yedeklerken çok dikkatli olmalısınız, özellikle de sunucuları değiştiriyorsanız. ACL harika ancak mevcut desteği o kadar düşük ki, sunucudaki ve ortamdaki her şey üzerinde tam kontrole sahip olmayan herkese karşı bunu öneriyorum. Ancak ACL'yi gerçekten anlamlı olduğu yere işaret etmek için +1!
Ninj

İyi cevap +1; Apache işleminin okuma / yazma izinlerinin ( www-dataörneğin) tüm site için salt okunur olarak değiştirilmesiyle ilgili bir not (setfacl veya chmod aracılığıyla - veya her ikisiyle) -> Bu, açıkça tüm yazma işlemlerini (eklenti / modül yükleme / tarayıcı tarafından güncelleme) örneğin çoğu CMS). Pek çok popüler kişinin, grup düzeyinde değil, sadece kullanıcı izin seviyesindeki yazma erişimini test ettiğine inanıyorum. Yine de güncelleme yapabilirsiniz ancak güncellemeler manuel olarak ve yazma klasörleri için özel izinler uygulanmalıdır (logs / temp / uploads / etc). Siteniz bununla çalışıyorsa salt okunur, büyük güvenlik sağlar.
bshea

11

Bu soru tekrar soruldu ve meta üzerinde tartışıldığı gibi , mevcut en iyi uygulamalar sorulduğunda, 2009'da elde edilenden daha iyi yaklaşımlar sağlar. Bu cevap, işbirlikçi web geliştirme ortamlarını güvenli bir şekilde ele almak için bazı güncel çözümler vermeye çalışır .


Güvenli bir web sunucusu ve ortak geliştirme için, dosya izinlerinden daha fazlası vardır:

  • Her site için ayrı bir kullanıcıya sahip olmak, yani kullanan tüm sitelere hizmet vermemek www-data. Bu önemlidir, çünkü günümüzde Apache nadiren yalnızca statik içerik dosyaları sunmakta, ancak dinamik web siteleri işletmektedir . Bu cevap en yaygın sunucu sitesi dili olduğu için PHP'ye odaklanır , ancak aynı ilkeler diğerleri için de geçerlidir.

    Tek bir sitede güvenlik sorununuz varsa, aynı kullanıcı olarak çalışan her siteye yayılabilir. Bir saldırgan, veritabanı oturum açma bilgileri dahil olmak üzere kullanıcının gördüğü her şeyi görebilir ve kullanıcının yazma izni olan her siteyi değiştirebilir.

  • Kullanım SSH Dosya Aktarım Protokolü (SFTP). FTP kullanımı güvenlik nedeniyle terk edilmek zorunda kalırken (hem şifreleri hem de içeriği düz metin olarak gönderdiği için), güvenli yerine SFTP'nin işbirlikçi web geliştirme için mükemmel bir çözüm olan bir özelliği vardır.

    Siteleri ve site başına bir kullanıcıyı izole ettikten sonra, web geliştiricilerinize erişim sağlamanız gerekir, bu sorunun neyle ilgili olduğu. Onlara bu site kullanıcılarının şifrelerini vermek yerine - veya kişisel kullanıcı hesaplarını başlangıçta önerildiği şekilde kullanarak site dosyalarına erişim - giriş yapmak için SSH anahtarlarını kullanabilirsiniz .

    Her geliştirici keypair üretebilir ve özel anahtarı gizli tutabilir. Ardından, ~/.ssh/authorized_keysgeliştiricinin üzerinde çalıştığı her web sitesi kullanıcı hesabı için ortak anahtar dosyaya eklenir . Bu şifreleri ve girişleri yönetmek için birçok avantaja sahiptir:

    • Her geliştirici, site başına kullanıcı düzenlemesiyle ilgili tüm şifreleri hatırlama veya saklama yükü olmadan herhangi bir sayıda web sitesine erişebilir.

    • Birisi şirketten her çıktığında şifreleri değiştirmeye ve paylaşmaya gerek yoktur.

    • Çok güçlü şifreler kullanabilir veya tamamen şifre tabanlı girişleri devre dışı bırakabilirsiniz.

  • PHP-FPM kullanın . PHP'yi kullanıcı olarak çalıştırmak için geçerli yaklaşım budur. Her kullanıcı için yeni bir havuz oluşturun, yani her site için bir havuz. Tek bir sitenin ne kadar kaynak tüketebileceğini de belirtebileceğiniz gibi, hem güvenlik hem de performans açısından en iyisidir.

    Bakınız, bkz. NeverEndingSecurity's Run php-fpm'yi ayrı bir kullanıcı / kullanıcı kimliği ve linux'ta gruplandırın . HowtoForge'ın Ubuntu 16.04'te Apache ile PHP-FPM Kullanması , sunucuda tek bir FPM soketi kullanılmasına rehberlik eden, kullanıcı ayrımı yoluyla güvenliği arttırmak için PHP-FPM kullanmayan öğreticiler var .

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.