WWW klasörü için linux izinleri nasıl ayarlanır?


69

Güncellenen Özet

/ Var / www dizini, root:roothiç kimsenin kullanamayacağı ve tamamen yararsız olduğu anlamına gelir. Hepimiz gerçekten çalışan bir web sunucusu istediğimizden (ve hiç kimse "root" olarak giriş yapmamalıdır), o zaman bunu düzeltmemiz gerekiyor.

Sadece iki işletmenin erişime ihtiyacı var.

  1. PHP / Perl / Ruby / Python'un çoğunun oluşturduğu klasör ve dosyalara erişmesi gerekir (örn. /uploads/). Bu betik dilleri nginx veya apache altında çalışıyor olmalıdır (ya da PHP için FastCGI gibi başka bir şey bile).

  2. Geliştiriciler

Nasıl erişebilirler? Bunu daha önce bir yerlerde birisinin yaptığını biliyorum . Bununla birlikte, milyarlarca web sitesi dışında, bu konuda daha fazla bilgi olacağını düşünürdünüz.


777'nin sahibi / grubu / diğer için tam okuma / yazma / yürütme izni olduğunu biliyorum. Bu nedenle , rastgele kullanıcılara tam izinler sağladığından bunun doğru olması gerekmiyor .

Bunun için hangi izinlerin kullanılması gerekiyor /var/www:

  1. Git veya svn gibi kaynak kontrolü
  2. "Web siteleri" gibi bir gruptaki kullanıcılar ( hatta "www-veri" ye eklenir )
  3. Apache veya lighthttpd gibi sunucular
  4. Ve PHP / Perl / Ruby

herkes orada dosyaları (ve dizinleri) okuyabilir, yaratabilir ve çalıştırabilir mi?

Eğer haklıysam, Ruby ve PHP scriptleri doğrudan "çalıştırılmaz" - ancak bir tercümana iletilir. Öyleyse /var/www... içindeki dosyalarda izinli çalıştırılmasına gerek yoktur. Nedenle, olurdu doğru izni gibi görünüyor chmod -R 1660bulunması şeklinde

  1. bu dört varlık tarafından paylaşılabilir tüm dosyalar
  2. yanlışlıkla çalıştırılamayan tüm dosyalar
  3. dizindeki diğer herkesi tamamen engelle
  4. Gelecekteki tüm dosyalar için izin modunu "yapışkan" olarak ayarlayın

Bu doğru mu?

Güncelleme 1: Dosyaların ve dizinlerin farklı izinlere ihtiyaç duyabileceğini fark ettim - yukarıdaki dosyalardan bahsediyordum, bu yüzden dizin izinlerinin ne olması gerektiğinden emin değilim.

Güncelleme 2:/var/www Yukarıdaki dört varlıktan biri her zaman klasörleri ve alt klasörleri her zaman çok derinlemesine eklerken (ve bazen de kaldırırken) klasör yapısını büyük ölçüde değiştirir. Ayrıca, diğer 3 işletmenin okuma / yazma erişimi için ihtiyaç duyabileceği dosyaları oluşturur ve kaldırır. Bu nedenle, izinler hem dosyalar hem de dizinler için yukarıda belirtilen dört şeyi yapmalıdır. Hiçbirinin izin almaması gerektiğinden (yukarıdaki ruby ​​/ php ile ilgili soruya bakın) rw-rw-r--Bu dört varlığın güvenilir personel (bkz. # 2) ve diğer tüm kullanıcılar tarafından çalıştırılmasından dolayı izinlerin gerekli ve tamamen güvenli olacağını varsayacağım . sistem sadece okuma erişimine sahip.

Güncelleme 3: Kişisel gelişim makineleri ve özel şirket sunucuları içindir. Paylaşılan bir ana bilgisayar gibi rastgele "web müşterileri" yok.

Güncelleme 4: Slicehost tarafından hazırlanan bu makale , www klasörünüz için izinlerin ayarlanması için neyin gerekli olduğunu açıklamakta en iyi gibi görünmektedir. Ancak, PHP VEYA svn / git ile hangi kullanıcı veya grup apache / nginx'in çalıştığından ve bunları nasıl değiştireceğinden emin değilim.

5. Güncelleme: Sanırım (sanırım) sonunda tüm bunların çalışmasını sağlayacak bir yol buldum (aşağıdaki cevap). Ancak, bunun doğru ve GÜVENLİ yol olup olmadığını bilmiyorum. Bu nedenle bir lütuf başlattım. Www dizinini korumak ve yönetmek için en iyi metoda sahip olan kişi kazanır.

Yanıtlar:


47

Daha fazla araştırmadan sonra, cevaplamanın başka bir yolu (muhtemelen daha iyi bir yol) gibi görünmesi www klasörünü böyle ayarlamaktır.

  1. sudo usermod -a -G developer user1 (her kullanıcıyı geliştirici grubuna ekleyin)
  2. sudo chgrp -R developer /var/www/site.com/ böylece geliştiriciler orada çalışabilir
  3. sudo chmod -R 2774 /var/www/site.com/ böylece yalnızca geliştiriciler dosya oluşturabilir / düzenleyebilir (diğer / dünya okuyabilir)
  4. sudo chgrp -R www-data /var/www/site.com/uploads Böylece www-data (apache / nginx) yükleme yapabilir.

Yana gitkullanıcı bunu çağırıyor ne olursa olsun olarak çalışır ve ardından sürece kullanıcı "geliştirici" grubunda olduğu gibi onlar git depo klasörleri düzenlemek PHP dosyalarını oluşturmak ve yönetmek gerekir.

Not: (3) adımında: 2774'te '2', dizin için 'Grup Kimliği'ni ayarlamak anlamına gelir. Bu, içinde oluşturulan yeni dosyaların ve alt dizinlerin, üst dizinin grup kimliğini (kullanıcının birincil grubu yerine) devralmasını sağlar. Referans: http://en.wikipedia.org/wiki/Setuid#setuid_and_setgid_on_directories


Bana makul gözüküyor.
wazoox

İyi. Belki bunu birkaç kişiyle onaylayabilirsem, bu yaklaşımı kullanacağım. İnsanlardan sıktığım en iyi cevap bu gibi görünüyor.
Xeoncross

Dosyaların sahibinin kim olacağını belirtmiyorsunuz. Kök olarak bırakır mısın? O zaman sadece sudo'lar yükleme klasörünüzü düzenleyebilir (muhtemelen istediğiniz şeyi yapmaz).
Nic

Evet, kök sahibi kalır. Ancak, grup sahibi şimdi "geliştirici" (ve wrx iznine sahip) olduğundan, tüm dev'ler (ve apache / nginx) de okuyabilir. Sudo'ya gerek yok.
Xeoncross

7
İzlenecek bir şey daha umask. Birçok sistemde, hem grup hem de genel dosyalar için yazma izinlerini yeni dosyalarda kaldıracak varsayılan bir 022 umask değeri vardır. 002 (kamuya açık yazı yok) veya 007 (kamuya açık değil) istediğinden şüpheleniyorum. Umask'ı Apache'nin config ve / veya başlangıç ​​komut dosyalarında, dizine erişmesi gereken herhangi bir işlem için ayarlayabilirsiniz. Bunu / etc / profile ya da / etc / bashrc dosyasına eklemeyi unutmayın, böylece geliştiricileriniz için de varsayılan ayardır
Mark Porter

8

Bunun "doğru" olup olmadığından emin değilim, ancak sunucumda yaptığım şey şu:

  • / var / www her web sitesi için bir klasör içerir.
  • Her web sitesinin, web sitesinin dizinindeki tüm dosya ve klasörlerin sahibi olarak belirlenen belirlenmiş bir sahibi vardır.
  • Web sitesini koruyan tüm kullanıcılar web sitesi için bir gruba yerleştirilir.
  • Bu grup, dizindeki tüm dosya ve klasörlerin grup sahibi olarak ayarlanır.
  • Web sunucusu (örneğin, PHP) tarafından yazılması gereken dosya veya klasörler, sahiplerinin apache'nin çalıştığı kullanıcı olan www-data olarak değiştirilmesini sağlar.

İçerikleri listeleyebilmeniz için dizinlerde execute bit'in etkinleştirilmiş olması gerektiğini unutmayın.


Git / svn veya PHP o zaman nasıl yeni klasörler oluşturur?
Xeoncross

2
PHP, web sunucusu ile aynı kullanıcı bağlamında çalışır, böylece web sunucusunun sahip olduğu herhangi bir dizinde dosya ve klasör oluşturabilir. Genelde bunun gibi sadece birkaç klasör vardır (/ uploads / örneğin). Git / svn hakkında emin değilim - onları web sitesini kontrol eden grup hesabına ekleyebilir misiniz?
Nic

görünüşe göre git çalışan kullanıcı olarak çalışıyor - tıpkı diğer herhangi bir araç gibi.
Xeoncross

Sonra git kullanıcısını apache grubuna ekleyin ve klasör grubuna yazma izinlerini verin.
David Rickman

Sadece söyledim, git'in bir kullanıcısı yok - onu kullanan mevcut kullanıcı olarak çalışıyor.
Xeoncross

7

Daha fazla araştırma yaptıktan sonra, git / svn TOOLS , her ne kullanıyorsa kullansınlar , çünkü onlar sorun değil gibi görünüyor . (Bununla birlikte, git / svn kestaneleri farklı bir meseledir!) Git ile yarattığım / klonladığım her şey izinlerime sahipti ve /usr/binbu teze uygun olan git aracı listelendi .

Git izinleri çözüldü.

Kullanıcı izinleri, www dizinine erişmesi gereken tüm kullanıcıları www-dataapache'nin (ve nginx) çalıştığı gruba ekleyerek çözülebilir gibi görünüyor .

Öyleyse , bu sorunun bir cevabı şöyle gider:

Varsayılan /var/wwwolarak aittir root:rootve kimse orada dosya ekleyemez veya değiştiremez.

1) Grup sahibini değiştir

Öncelikle "root" grubu yerine "www-data" a ait olacak www dizin grubunu değiştirmemiz gerekiyor

sudo chgrp -R www-data /var/www

2) www-data kullanıcıları ekle

O zaman şu anki kullanıcıyı (ve başka birini) www-data grubuna eklemeliyiz

sudo usermod -a -G www-data demousername

3) CHMOD www dizini

İzinleri, SADECE mal sahibi (root) ve "www-data" grubundaki tüm kullanıcıların, dosyaları ve dizinleri rwx (oku / yaz / çalıştır / yürüt) yapabilecekleri ( başka kimsenin erişemeyeceği ) değiştirebilecek şekilde değiştirin.

sudo chmod -R 2770 /var/www

Artık erişimi olan herhangi bir kullanıcı tarafından oluşturulan tüm dosyalar ve dizinler (yani "www-data" grubunda) apache ve dolayısıyla php tarafından okunabilir / yazılabilir olur.

Bu doğru mu? Peki ya PHP / Ruby'nin oluşturduğu dosyalar - www-data kullanıcıları bunlara erişebilir mi?


6
Tüm web dosyalarının PHP tarafından yazılabilir olması fikri hoşuma gitmedi, bir komut dosyası güvenlik açığı varsa olası maruziyetinizi artırır.
Nic

Tamam, pek çok metin, katran, günlük ve görüntü dosyaları (artı klasörler) oluşturmak için PHP kullandığımı biliyorum , bu yüzden her şeyin yazılabilir olması gerektiğini varsayıyordum. Bununla birlikte, belki de haklarınız ve PHP’niz, yalnızca PHP uygulamalarının% 99’u hiçbir zaman komut dosyası oluşturmadığı için zararsız olacak DOSYA DEĞİŞTİRMEYİ DEĞİŞTİRebilmelidir . Diğer seçenek, PHP'nin yalnızca orada kötü bir şey oluşturmak için kullanılabildiğinden beri yapmayan bazı dizinlerin PHP yazma erişimine (/ upload /) izin vermesi gibi görünüyor. Herhangi bir fikir?
Xeoncross

2
Komut dosyasını ve verileri ayrı tutmaya çalışın. Bir saldırgan / uploads / içindeki bir şeyi bırakmayı başarsa bile çalıştırılabilir olmamalıdır. Katmanlardaki güvenlik anahtarıdır.
Nic

6

Yapışkanlık, izin devralma değildir. Bir dizindeki yapışkanlık, aksi takdirde söylenen izinlere rağmen, yalnızca dosyanın sahibinin veya dizin sahibinin bu dosyayı yeniden adlandırabilir veya silebileceği anlamına gelir. Böylece 1777 / tmp /.

Klasik Unix'te, sadece mevcut süreç olan 'umask'a dayanan dosya sistemine dayalı izin devri yoktur. * BSD veya dizinde setgid ile Linux, yeni oluşturulan dosyaların grup alanı ana dizininkiyle aynı olacak şekilde ayarlanacaktır. Daha fazlası için, devralınmış izinlere sahip olmanıza izin veren, dizinlerde 'varsayılan' ACL olan ACL'lere bakmanız gerekir.

Tanımlayarak başlamalısınız: * sisteme hangi kullanıcıların erişimi var * tehdit modeliniz nedir

Örneğin, birden fazla müşteriyle web barındırma yapıyorsanız ve bunların birbirlerinin dosyalarını görmesini istemiyorsanız, tüm bu kullanıcılar için ortak bir grup "webcus" kullanabilir ve 0705 dizin modunu kullanabilirsiniz. webserver işlemi ( değil "webcusts" olarak) diğer perma görür ve izin verilebilir; müşteriler birbirlerinin dosyalarını göremez ve kullanıcılar kendi dosyalarına bulaşabilir. Ancak, bu, CGI veya PHP'ye izin verdiğiniz anda işlemlerin belirli bir kullanıcı olarak gerçekleştirildiğinden emin olmanız gerektiği anlamına gelir (yine de, birebir kullanıcı için birden fazla kullanıcı için hesap verebilirlik). Aksi halde, müşteriler bir CGI yaptırmak suretiyle birbirlerinin dosyalarına karışabilirler.

Ancak, bir web sitesinin çalışma zamanı kullanıcısı, web sitesinin sahibiyle aynıysa, komut dosyasında bir güvenlik açığı olması durumunda, içeriği kötüye kullanımlardan koruyamama konusunda sorunlarınız olur. Bu, özel ana makinelerin kazandığı yerdir, böylece statik içerik sahibinden farklı bir çalışma zamanı kullanıcısına sahip olabilirsiniz ve diğer kullanıcılarla etkileşim hakkında çok fazla endişelenmenize gerek kalmaz.


İyi cevap. MacOS X'te, sistem SGID biti dizinlerde otomatik olarak bulunuyor gibi davranır. Yapışkan bit genellikle dosyayı yalnızca yazabiliyorsanız kaldırabileceğiniz anlamına gelir. Yani, herkes genel olarak yazılabilir bir dosyayı / tmp dosyasından kaldırabilir. MacOS X'te, / tmp, kullanıcı için özel bir dizine bir bağlantıdır - bu nedenle sonuçta paylaşım yoktur.
Jonathan Leffler

Cevabınız için teşekkürler, soruyu daha fazla bilgi ile güncelledim.
Xeoncross

Jonathan: Yapışkan bit, yalnızca dizinin sahibi veya dosyanın sahibi, onu yeniden adlandırabilir veya silebilir (yani, 'dosya' dizinindeki girişine göre hareket eder). Tek tek dosyadaki izinler bu dizin işlemleri ( rename(), unlink()) için gerçekleştirilmez, yalnızca dosyanın kendisindeki eylemler için ( open()) gerçekleştirilir. Bu "olağan" davranış.
Phil P

2

Bunu yapmanın en iyi yolunun Posix ACL'leri kullanmak olduğuna inanıyorum. Çalışmanız ve ihtiyacınız olan tüm işlevleri sunmanız rahattır.

http://en.wikipedia.org/wiki/Access_control_list#Filesystem_ACLs


ACL'ler hakkında faydalı bilgiler için +1. Ancak, birkaç geliştiriciyle basit bir sunucuyu yönetmek için sistemi tıka basa bırakmak istemem. Ayrıca ACL'leri kullanmak için Çekirdeği yeniden derlemekten de emin değilim.
Xeoncross

@ Xeoncross: ACL'ler hiçbir şeyi düşürmez. Bunlar sadece normal dosya izinleri gibi bir bilgidir. Hepsi "ekstra" ve karmaşık değil, kafa karıştırıcı yapışkan / grup / her türlü çözümden ziyade izinleri yönetmenin en basit ve en iyi yolunun bu olduğuna inanıyorum. Korkma, sadece acl ile yeniden birleştir ve bir dene!
Kravat savaşçısı

1

Dosyanın sahibi onu oluşturan kişi, grup ise www-data olmalıdır. Dizinler / dosyalar için mod genel olarak 755/644. Dizinler ve dosyalar için grubun yazma erişimine ihtiyacı varsa, mod 775/664. Paddy'nin geliştirici olduğunu varsayalım. Tamamen bu yapar:

chown -R paddy:www-data /var/www/websiteindevelopment
chmod -R 755 /var/www/websiteindevelopment
chmod -R 775 /var/www/websiteindevelopment/directorywritablebygroup
find /var/www/websiteindevelopment -type f -perm 755 -print -exec chmod 644 {} \;  
find /var/www/websiteindevelopment -type f -perm 775 -print -exec chmod 664 {} \;

0

@ Xeoncross'un cevabını ekleyerek, dosyalar ve dizinler üzerindeki izinleri ayrı ayrı yapılandırmanın iyi olacağını düşünüyorum.

sudo find /var/www -type d -exec chmod 775 {} \;  # Change permissions of directories to rwxrwxr-x
sudo find /var/www -type f -exec chmod 664 {} \;  # Change file permissions to rw-rw-r--

Bu, geliştiricilerin / var / www içindeki dizinleri oluşturmasını ve değiştirmesini sağlar. Bu önemli gibi görünüyor, çünkü geliştiricilerin ek dizinler oluşturması veya artık gerekmeyen bir dizini kaldırması gerekebilir.

Ayrıca, geliştiricilerin kod dosyaları oluşturmasını ve değiştirmesini de sağlar (HTML, PHP dosyaları ve benzerlerini okuyun). Ancak, yine de herkes için salt okunur erişime izin verecek.

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.