Normal web projesi dizinleri için mükemmel unix izinleri nelerdir?


12

Yazılı bir web uygulamasında aşağıdakiler için sekizli biçimde mükemmel minimum izinler nelerdir?

  1. Kullanıcının statik dosyaları (images / swf / js dosyaları) yüklediği bir dizin
  2. Yöneticinin statik dosyaları (images / swf / js dosyaları) yüklediği bir dizin
  3. Uygulamada kullanılan kitaplıkların bulunduğu dizin
  4. Yürütülebilir / göz atılabilir sunucu tarafı komut dosyalarının yer aldığı bir dizin
  5. Zaten varolan dosyaların (txt veya xml) sunucu tarafındaki kodla düzenleneceği dizin

İşte önerilerim ve gerekçelerim

  1. 555, herkes okuyabilir ve yazabilir, kimse yürütemez
  2. 544, tek başına sahip yazabilir, herkes sadece okuyabilir, kimse yürütemez
  3. 000, kimse okumak, yazmak veya yürütmek gerekmez, sadece web sunucusu tarafından kullanılacak?
  4. 661, sahibi okuyabilir, yazabilir, herkes sadece yürütebilir
  5. 600, sahibi okuyabilir, yazabilir (gerekli olmayabilir), başka kimse hiçbir şey yapamaz

Şimdi iki şeyle ilgileniyorum:

  1. İlk listede kaçırdığım web tabanlı uygulamalarda yaygın olarak kullanılan bir şey var mı?
  2. İkinci listede katılmadığınız bir şey var mı, alternatifiniz nedir ve neden daha iyi?

1
İnsanlar neden Anlamıyorum DEĞİL bugünlerde EKL'lerini kullanarak ...
PFO

Yanıtlar:


20

Bir 'web uygulamasının' bir sunucuda (apache, nginx, vb.) Çalıştığını ve bazı dinamik kodlama dillerinde (PHP, Ruby, vb.) Yazıldığı varsayılarak, 'kullanıcının' kim olduğu konusunda bir yanlış anlaşmanız vardır.

Kullanıcı, uygulamanızda oturum açmış olan kişi değildir; uygulamadaki rolleri (admin, vb.) Senaryo ile tamamen ilgisizdir. Kullanıcı, işlemin altında çalıştığı linux sistem kullanıcısıdır. Web sitenizin kodu yalnızca bir kullanıcı olarak çalıştırılır - web sunucunuzun kullanıcısı olabilir (bu gerçekten iyi bir şey değildir) veya sitenize özgü bir kullanıcı olabilir (ki bu çok daha iyidir).

Linux'ta kullanıcılar gruplara aittir - başka bir gruba kullanıcı ekleyebilir ve bu gruba ayrıcalıklar atayabiliriz.

İyi bir kurulum sunucunuzun bir kullanıcı olarak çalışmasına (bu kullanıcıya 'web sunucusu' diyelim) ve dinamik komut dosyası dilinizin (örn. FastCGI aracılığıyla) kendi kullanıcısı olarak (site başına bir kullanıcı - ilk kullanıcı 'site1' 'diyelim) .

Dosyalarınızı sunmak için web sunucusunun dosyalara erişmesi ve komut dosyası dilinin dosyalara erişmesi gerekir. Bu şu anlama gelir: 'site1' ve 'webserver' dosyalarınızı okuyabilmelidir. Ancak bunlardan sadece biri dosyalara 'sahip' olabilir. Sahibi 'kullanıcı'dır (kullanıcı, grup, diğer). Ayrıca dizine yazabilmek (ve yazdığı dosyaları okuyabilmek için) komut dosyası dilimize ihtiyacımız var. Bu nedenle 'site1' kullanıcısının okuma ve yazma izinlerine ihtiyacı vardır. Grup ve diğer izinlerin olabildiğince kısıtlayıcı olmasını istediğimizden, 'sahip'imiz' site1 'olacak ve ilgili kullanıcı izinleri okunacak ve yazılacaktır.

Web sunucumuzun izinlerini başka bir 'kullanıcı' olarak belirleyemediğimiz için, 'site1' grubuna 'webserver' ekleyeceğiz (elbette, hem 'site1' hem de 'webserver' ile farklı bir grup oluşturabilirsiniz. bu grubun üyelerine aynı izinler verilecektir İzinlerini belirlemek için herhangi bir kullanıcıya en gevşek izinler (kullanıcının, grubun, diğer kümenin) uygulanacaktır.

İyi bir kurulumun, dosyaların dinamik bir dil için yürütme izinlerine sahip olmasını gerektirmemesi gerektiğini belirtmek gerekir. Dosyalar doğrudan çalıştırılmaz, ancak bir yorumlayıcıya okunur - tipik bir komut dosyasını (hiçbir şey yazmayan) çalıştırmak için yalnızca okuma izinleri gerekir.

Dizinlerdeki 'yürütme' izninin farklı bir anlamı vardır - içeriği okuyamadan çapraz geçişe izin verir. Bir dizindeki bir dosyayı okuyabilmek için kullanıcının üstündeki HER dizinde 'yürütme' iznine sahip olması gerekir.

Bir web uygulaması için, her dosyanın sahibi tarafından okuma izinleri olmalıdır - aksi takdirde oldukça anlamsız bir dosyadır. Bir kullanıcı veya yöneticinin dosyaları (web uygulamanız üzerinden) yükleyip yüklemediği, 'sahip' (yani dinamik dil) yazma izinlerine ihtiyaç duyar. Etkili bir kurulum, statik dosyalar doğrudan web sunucusu üzerinden sunulmaya çalışacaktır, çünkü dinamik diller büyük dosyaları okumada ve içeriği yankılamada yavaştır. Bu nedenle web sunucusunun statik dosyalarınıza okuma erişimine ihtiyacı vardır.

Bu nedenle, en az dosya izinleri şunlar olabilir:

  • Kullanıcının statik dosyaları (images / swf / js dosyaları) yüklediği bir dizinde bulunan bir dosya: 640
  • Yöneticinin statik dosyaları (images / swf / js dosyaları) yüklediği bir dizindeki dosya: 640
  • Uygulamada kullanılan kitaplıkların bulunduğu bir dizindeki dosya: 400 (veya 440)
  • Yürütülebilir / göz atılabilir sunucu tarafı komut dosyalarının yer aldığı bir dizindeki dosya: 400 (veya 440)
  • Zaten varolan dosyaların (txt veya xml) sunucu tarafındaki kodla düzenleneceği bir dosya: 640 veya 600
    • (web sunucusunun bunları zaman zaman değiştirip değiştirmeyeceğine bağlıdır)

Ancak, en düşük dizin izinleri şunlar olabilir:

  • Kullanıcının statik dosyaları (images / swf / js dosyaları) yüklediği bir dizin bulunur: 750
  • Yöneticinin statik dosyaları (images / swf / js dosyaları) yüklediği bir dizin: 750
  • Uygulamada kullanılan kitaplıkların bulunduğu bir dizin: 500 (veya 550) [en az 510 olmalıdır]
  • Yürütülebilir / göz atılabilir sunucu tarafı komut dosyalarının yer aldığı bir dizin: 500 (veya 550) [en az 510 olmalıdır]
  • Zaten varolan dosyaların (txt veya xml) sunucu tarafındaki kodla düzenleneceği dizin: 750 veya 700
    • (web sunucusunun zaman zaman değiştirilmemiş, buradan dosya sunup sunmayacağına bağlıdır)

Bir kez daha - web sunucunuzun erişmesi gereken dizinin üzerindeki her dizinde 'yürütme' iznine sahip olmalıdır - bu nedenle web sunucusu belirli bir dizinden dosya sunmasa bile, yürütme izinleri vermeliyiz.

Web sunucusuna dosyaların çoğuna okuma erişimi vermek oldukça yaygındır (bu yüzden 500 ile 550 arasında değiştirin). Varsayılan 'biraz güvenli' izinler genellikle dizinler için 755 ve dosyalar için 644'tür - yürütme izni yoktur, herkes okuyabilir ve yalnızca kullanıcı yazabilir - bir linux sistemindeki dosyaların büyük çoğunluğunun bu izinlere sahip olduğunu fark edeceksiniz.

'Diğer' izinlerin sahibi veya grupta olmayan sistem kullanıcılarını (yani kalan tüm sistem kullanıcılarını) ifade ettiğini unutmayın. 'Diğer' izinlerinizi kısıtlayıcı tutmak iyidir, çünkü bu kullanıcılar bilinmemektedir - onlara açıkça izin vermediniz. Diğer izinler, güvenliği ihlal edilmiş bir sistemden yararlanmanın en kolay yoludur (örneğin / tmp'nin ortak bir hedef olmasının nedenlerinden biri).

Yukarıdakiler bağlamında, son iki sorunuzun bu kadar alakalı olduğunu düşünmüyorum. Dizin izinlerinizi 550 (ve dosya izinleri 440 olarak) olarak ayarlayın ve ardından uygulamanızın yazacağı dizinler için kullanıcıya yazma izinleri verin (örn. Dizin: 750; dosya: 640).

(Dosyaları yüklemek için yazma iznine ihtiyacınız olacaktır - ancak isterseniz bunları daha sonra kaldırabilirsiniz - tartışmalı olsa da, eğer birisi yalnızca sahibin yazabileceği - hesabınızın güvenliği ihlal edilmiş - bir dizine yazıyorsa kısıtlayıcı izinleri tutma nedenleri).


@Iain: Kesinlikle - o anda dosya izinlerini düşünüyordum - bunu düzeltir - teşekkürler.
cyberx86

1

İşi yapmak için minimum izin kümesine sahip olmak normaldir. Web sunucunuz varsa ve kullanıcılar ortak bir grubu paylaşıyorsa, herhangi bir erişim verme gereksinimini kaldırabilirsiniz o. İzinler kullanıcılarla da ilgilidir. Sekizli izinleri yanlış anlamışsınız gibi görünüyor.

  1. 555 r-xr-xr-xdeğil rw-rw-rw. Bir dizin olduğundan, dosyaları oluşturmak / silmek için, x750'yi rwxr-x---başlatmak için iyi bir yer olacak şekilde ayarlamanız gerekir . Bu, dizinin sahibi olan kullanıcının dosya eklemesine / kaldırmasına ve ortak gruptaki herkesin dosyalara erişmesine izin verir.
  2. Yukarıdaki 1. ile aynı.
  3. Eğer gerçekten statik dosyaları 050'den daha fazla ise web sunucusuna erişim sağlar ancak ilk etapta dosyaları oluşturmak için en az 750 olurdu.
  4. Yukarıdaki 3 ile aynı.
  5. 070, web sunucusunun dosyaları okumasına ve değiştirmesine izin vermek için minimumdur, ancak 770'in muhtemelen daha gerçekçi olması için dosyaların oluşturulması gerekir.

Web sunucusunun dosyaları okumak için dizinde yürütme izinlerine sahip olması gerekmez mi (noktalar # 1 (740?), 3, 5)?
cyberx86

Doh! gerçekten x dosyalara erişmek için gereklidir r sadece onları listelemenizi sağlar ... daha fazla kahve için ambles off.
user9517

0

Genel olarak, dizinlerde 0755, 0775 veya 2775 modunu kullanır (dosya sistemi BSD anlambilimiyle monte edilmişse, BSD ve Linux için dizinlerde SGID biti, yeni dosyaların grup ilişkilendirmesini, dosyanın yaratıcısının varsayılan GID'si). Bu, tüm kullanıcıların söz konusu dizinleri dolaşmasına (içine ve içine girmesine) ve okumasına (ls komutunu çalıştırmasına veya readdir / read sistem çağrılarını gerçekleştirmesine) olanak tanır. Alternatifler grup / yazma seçeneklerini ve belirtildiği gibi, dizinlerde SGID bitini ekleyerek, uygun bir grupla ilişkili tüm dosyaların ve alt dizinlerin korunmasına yardımcı olabilir.

Dosyalar için normalde 0644 veya muhtemelen 0664 kullanılır (dünya tarafından okunabilir ve grup yazılabilir veya kullanılamaz). Açıkçası CGI betikleri ve ikili dosyaları için x-biti eklemeniz gerekir; ve bazı özel durumlar için, son derece iyi test edilmiş ikili dosyalarda, SUID veya SGID bitleri eklenebilir. Normalde UNIX ve Linux, komut dosyalarındaki SUID / SGID bitini göz ardı eder ve yalnızca yerel derlenmiş yürütülebilir dosyalar için semantiğini dikkate alır. Ancak, sitenizi "setuidhack" gibi bazı modüllerle web sunucusunu yorumlanmış komut dosyalarında bile SUID / SGID bitlerini onurlandırmak için kullanılabilecek bir Apache gibi çalıştırıyor olabilirsiniz. (Bu, her dosyayı dosyalayan HTTP daemon stat () tarafından ve kendi özel fork () / execve () kodunu kullanarak yapılır, yalnızca çalıştırılabilir () vektörüne doğru yorumlayıcı dizesini execve () vektörüne enterpolasyon yaparak '

Bunlar sadece en genel yönergelerdir. Bunlar tüm durumlar için "mükemmel" değildir ve kesinlikle web sunucunuz ve yüklediğiniz ve yapılandırdığınız herhangi bir web uygulaması veya çerçeveleri için belgelere başvurmalısınız ... ve muhtemelen sizden önce bir UNIX güvenlik uzmanına danışmak istersiniz. dosyalarınızı, kodlarınızı veya sunucularınızı herkese açık İnternet'e gösterin.

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.