/ Var / www / html ve bir web sitesi belgesi kökü için kendi giriş diziniyle ilgili sorunlara izin verir


34

Ben çalışıyorum değil benim içinde 777 izin vermek /var/www/htmlklasörün ama olmadan dosyalarımı düzenlemek istediğiniz sudo. Ben de içinde kendi ev dizininde bir klasörün bir sembolik bağlantı oluşturmak olsa da /var/www/html. Kullanarak yarattım sudo ln -sT /home/andre/www/moodle/ moodleve ls -laçıktı şu:

andre@andre-270E5G:/var/www/html$ ls -la
total 8
drwxr-xr-x 2 root root 4096 Mai  4 10:20 .
drwxr-xr-x 4 root root 4096 Abr 29 14:29 ..
lrwxrwxrwx 1 root root   23 Mai  4 10:20 moodle -> /home/andre/www/moodle/

Bu yüzden, moodle klasörüm herkes için izinleri okudu, yazdı ve yürüttü, istediğim bu değil. Komutu sudo chmod -R 775 moodle/değiştirmeye çalıştım, ancak hepsine okuma, yazma ve yürütme izinleri kaldı. Aynı moodle klasöründe de denedim /home/andre/www/moodleama aynı kaldı. Çıkış ls -lain /home/andre/www/olduğu:

andre@andre-270E5G:~/www$ ls -la
total 28
drwxrwxr-x  3 andre andre  4096 Mai  4 10:02 .
drwx------ 49 andre andre 20480 Mai  4 10:01 ..
drwxrwxr-x 41 andre andre  4096 Mai  4 10:02 moodle

Yani klasörün moodleiçinde /home/andre/www/istediğim izinler var.

Ek bir problem olarak, erişim localhost/moodlesağladığımda 403 Yasaklı hata alıyorum.

Neyi yanlış yapıyorum burada?

Yanıtlar:


63

Asla ana dizininizden bir web sitesi çalıştırmak zorunda değilsiniz . HİÇ. Aksi takdirde, web sunucusuna,/home/dizin yapısını görmek içinilerleyebilmenizgerekir, ancak aynı zamanda/home/$USER/(kullanıcının dizininizde, başka bir alt klasörde ne olduğunu görmeye çalıştığımız kullanıcının giriş dizini) içine de girmeniz gerekir. Orada. Kötü yapılandırılmış veya yanlış yapılandırılmış veya yamalanmamış bir web sunucusu bu şekilde büyük miktarda veri sızıntısına veya kimlik bilgilerinin kaybolmasına neden olabilir ve kişisel verilerinizi ve oturum açma işlemlerinizi farklı şeylere riske sokar. Kullandığınız sembolik bağlantı yaklaşımı, Apache'ye okuma izni vermeye çalışırken aynı nedenden dolayı yardımcı olmuyor/home/andre/www/moodle- web sunucusunun, bağlantı /var/www/htmlnoktasının işaret ettiği yere, bu güvenlik riskini teşkil ettiği yere ulaşmak için ana dizininizi geçebilmesi gerekir .

İlk olarak, kullanın sudo cp -r /home/andre/www/moodle/ /var/www/html/. Bu, dosyalarınızı kopyalar /var/www/htmlve kendi ana dizininizden uzak tutar. Daha sonra izinleri yineleyeceğiz, böylece web sunucusu siz ve bu dizindeki her şeye erişebilir ve kullanıcınıza tüm dosyaları ve dizinleri tam olarak okuyabilir / yazabilir. O zaman, sadece /var/www/htmlsiteniz için çalışmak zorunda kalmayacaksınız .

Bu, verilerinizi geri kopyalamanızın ardından dört adımda geçerlidir /var/www/html:

  1. Apache'ye klasörlere ve dosyalara erişim sağlayın, böylece siteye 403 hatasız hizmet verebilir.
  2. Kullanıcınıza 'sahibini' dosya ve klasörler üzerinden verin ve kendinize tüm dosya ve klasörleri okuma ve yazma, ayrıca dizinleri geçme yeteneği verin.
  3. (İsteğe bağlı, ancak önerilen) Dizin yapısının tamamında, buradan oluşturulan tüm dosya veya klasörlerin, olması gereken grubu olacak şekilde ayarlayın www-data.
  4. (İsteğe bağlı) Sizin ve web sunucusunun site verilerini görebilmesi için izinleri ayarladığımız son güvenlik temizliği, ancak diğer kullanıcılar sitenin dosyalarına veya dizin yapısına erişemiyor.

(1) Apache'nin klasörlere ve dosyalara erişmesine izin verin.

sudo chgrp -R www-data /var/www/html
sudo find /var/www/html -type d -exec chmod g+rx {} +
sudo find /var/www/html -type f -exec chmod g+r {} +

Bu tekrarlı bir şekilde 'grubu' www-dataklasörler ve dosyalar için olacak şekilde ayarlar . Bu daha sonra web sunucusunun site doküman kök dizin yapısına tekrar bağlanma ve erişme izni verir ( +xsadece dizinler için). Ayrıca web sunucusunun tüm dosyalar için okuma izinlerine sahip olmasını sağlar, böylece site verileri alınabilir.

Web sunucusuna bir dosyaya veya bir dizine yazma izni vermeniz gereken bazı durumlar olabilir - bunu yaparak gerçekleştirilebilir sudo chmod g+w /var/www/html/PATH( PATHdizin yapısında uygulamanız gereken dosya veya klasörün yolu web sunucusu için izinleri yaz).

DİKKAT : Bunun bir site yapılandırmasıyla ilgili (güvenli veritabanı bilgileri vb.) 'Güvenli' bilgileri gösterebileceği pek çok durum vardır ve bu bireysel dosyalar veya dizinlerdeki bu verilere ilişkin 'diğer' erişim izinlerini silmelisiniz. Aşağıdakiler: sudo chmod o-rwx /var/www/html/FILEPATH( dosya klasörüne FILEPATHgöre yolun yerine /var/www/html).

Ayrıca, 'yeni dosyalar', web sunucusuna oluşturulan ve kopyalanan dosyalara ve klasörlere erişebilmek için doğru izinler vermek üzere 403 sayı alırsa, bu komutları gelecekte yeniden çalıştırmanız gerekebileceğini unutmayın. almıyorsanız www-datadoğru ayarlanmış grubu.


(2) Sahibinize, klasörlere ve dosyalara okuma / yazma ayrıcalıkları verin ve klasör yapısını dizin yapısında gezinmek için klasör erişimine izin verin.

sudo chown -R USER /var/www/html/
sudo find /var/www/html -type d -exec chmod u+rwx {} +
sudo find /var/www/html -type f -exec chmod u+rw {} +

USERİlk komutta kendi kullanıcı adınızla değiştirin !

Burada üç şey yapıyoruz. Öncelikle, kullanıcınızı içindeki tüm dosya ve dizinlerin "Sahibi" olacak şekilde ayarladık /var/www/html. Daha sonra, klasörler üzerinde okuma ve yazma izinlerini ayarladık ve klasörlere girmelerine ( +xdizin öğelerinde bulunan öğe) erişmenize izin veriyoruz . Daha sonra tüm dosyaları, henüz belirlediğimiz sahibi için okuma / yazma izinlerine sahip olacak şekilde ayarladık.


(3) (İsteğe bağlı) Bundan sonra her yeni dosyanın www-data'erişim' kullanıcısı olarak oluşturulduğundan emin olun .

sudo find /var/www/html -type d -exec chmod g+s {} +

Bu, dizinler üzerindeki grup için "set gid" bitini ayarlar. Bu dizinlerin içinde oluşturulan dosya ve klasörler her zaman www-datagrup olarak olacaktır , web sunucusu erişimine izin verir.


(4) (İsteğe bağlı) Diğer kullanıcıların verileri görmesini istemiyorsanız nihai güvenlik temizliği

Dizinleri ve dosyaları görebilmek için kullanıcılara ihtiyacımız var. Bunu yapmak için web sunucusuna ihtiyacımız var. Diğer sistem kullanıcılarının (root hariç) verileri görmesini istemeyiz. Böylece, onlara bu erişimi vermeyelim ve bunu yalnızca kullanıcı ve web sunucusu verileri görebilir.

sudo chmod -R o-rwx /var/www/html/

NOT: Bunu daha sonra yeniden çalıştırmanız veya 'diğer' izin kategorileri için izinleri burada düzenlemeniz gerekmeyecektir. 'Diğer' kullanıcılar ulaşamıyorsa (filtyapı ve dizin yapısını geçmek /var/www/html/için gerekli +xbiti /var/www/htmlveya +rdosya listelerini okuyacak biti yoksa), diğer kullanıcılar için bu dizinin altındaki öğelerin izinleri veya gruplar gerçekten çok fazla önemli olmayacak.


Buna rağmen, bunun için biraz daha az istilacı bir çözüm var, ancak tüm yeni dosyalar için çalışması garanti edilmese de, dosya erişim kontrol listelerini içeren tüm dosya sistemlerinde çalışması garanti edilmiyor . Bu, dosyalar www-dataiçin mülkiyeti bir şeyler için bırakmanıza izin verir, ancak dosyalara şahsen sahip olmadığınız halde, tüm amaç ve amaçlar için size etkili sahiplik hakları verir.

Bu çözüm biraz daha az istilacıdır ve bir dizine ve içindeki tüm dosyalara sahip olmanıza www-data:www-dataveya root:www-datakendinize erişmenize izin verir. Tek tek gruplar ayarlamadan birden çok kullanıcının izniniz olmasını sağlayan Erişim Denetimi Listeleri'ni kullanır . Bu aynı zamanda sağlayan rootveya www-datakullanıcıların dosyaların sahibi sistem, ancak şeyler değil düzenlemek ve bu tür okuyabilir Bunu yaparsanız bir vaka ile ayrı ayrı ek izinler eklemek sağlar ve belirli kullanıcılar için ince ayar izinleri.

Hala birlikte çalıştığımızı /var/www/html/varsayalım ve verilerimizi görmek için bizden ve sistemden (ve elbette kökünden) başkalarını gizlemek istemediğimizi varsayarsak , aşağıdakileri yapmamız gerekir:

  1. Web sunucusu sistemi kullanıcısına tekrar sahiplik verin www-data.
sudo chown -R www-veri: www-veri / var / www / html
  1. Dosyaları tekrar tekrar okumanıza / yazmanıza izin verirken, diğer kullanıcılara ( tabii ki www-datave roottabii ki) dosyalara erişme imkanı vermez.
sudo find / var / www / html -tipi f -exec setfacl -mu: SİZİN ADI: rw -m other :: --- {} \;
  1. Tekrar tekrar kendinize dizinleri okuma / yazma / gezinme izni verin, diğer kullanıcılar için klasörlere erişimi kaldırın ( www-datave hariç root) ve bunu dizinlerdeki yeni dosyalar için 'varsayılan' ACL olarak ayarlayın.
sudo find / var / www / html -tipi d -exec setfacl -d -mu: SİZİN ADI: rwx -mo :: --- {} \;
  1. Ayrıca setgid, tüm dizinler için biti de ayarlamamız gerekir , böylece bir dosya oluşturursanız web sunucusu hala www-datagrup izinleriyle erişebilir .
sudo find / var / www / html -tipi d -exec chmod g + x {} \;

Ve şimdi tüm dizinlere erişimi var, ve uzakta erişimini almak den yoktu www-dataihtiyacı gibi webserver hala her yerde dosyaları oluşturabilir olarak hangi yardımcı olur (örneğin PHP tabanlı önyüzleridir kendi önbellek dizinleri sahip ve bu şekilde düzgün çalışması için yaratılması ve yazılması gerekiyor).

Tek uyarı: El ile yeni dosyalar oluşturuyorsanız, web sunucusuna sahiplik vermek için bunları uygun şekilde kesmeniz gerekir. Bu basit bir işlemdir sudo chown www-data:www-data filenameve erişim kontrol listeleri hala dosyaya ilişkin etkin haklara sahip olmanıza izin vermelidir.

Belirli bir dosyanın sahiplerini değiştirmeden bazı standart dışı erişim türleri için bunu sysadmin olarak yapmak zorunda kaldığım birden fazla durum var. Bu işe yarar, ancak her dosya sistemi dosya erişim listelerini desteklemediğinden kendi baş ağrıları vardır .


2
@ AndréCarvalho +x, dosyalara çalıştırılabilir izinler verir ve PHP dosyalarının, mutlaka, PHP komut satırı aracılığıyla veya sunucunun kendisinde bir çalıştırılabilir dosya olarak yürütülmesini istemeyiz; web sunucusundaki PHP ayrıştırıcısı tarafından işlenmelerini istiyoruz (ve biz +xPHP ayrıştırıcısının bunları okuması ve işlemesi için PHP dosyalarına ihtiyacınız yoktur ). Dizinler +x, dizinler arasında geçişe izin vermek için gerekir - yani, eğer bir dizin olmasam +xve kök değilim, dizine giremem, Apache ile ilgili sorunlarınız, sembolik bağlarınızla ve evinizle çalışmıyor dizin.
Thomas Ward

1
@ AndréCarvalho www-databir sistem grubudur - standart kullanıcıların katılacağı bir grup değildir.
Thomas Ward

1
@JunaidQadirShekhanzai İnsanların ayarları ihtiyaç duydukları ortamlardan ve diğer birçok faktörden büyük ölçüde farklı olduğundan, bunu sağlamak imkansız. Bu tür bir 'kabuk dosyası' isteğe bağlı bileşenler olduğu için üretmek mümkün olmaz . Ben olabilir denemek ve bu yapabileceğini Python komut dosyası yapmak, ama biz hala sistem kısıtlamalar, isteğe bağlı görevler, değişen yolları, vb gibi şeyler girmek
Thomas Ward

1
@ T.Todua dediğim gibi değildi. Ben söyledi sen dışarı şeklinde bir site asla : (içinden okumak) "ev" dizini olduğuna göre, bir şey çalıştırmak gerekir - /home/USER/...bir web sunucusu üzerinde. Kullandığım kelimelerin anlamını yanlış anladınız ve yanlış anladınız. /var/www/*web sitelerini dışarıda bırakmak için nispeten 'güvenli' bir yer çünkü burası için ayrılmış bir klasör / alan. Ancak, /var/www/htmlgüvenli değildir, çünkü kurulum sırasında web sunucuları tarafından yazılır ve önemli verilerin gizlenmesine neden olur (bu nedenle /var/www/SUBDIRECTORY, tek tek alt siteler yerine kullanın)
Thomas Ward

1
İfadeleri açıklık için ayarladım.
Thomas Ward

2

Bir izin sorununu çözmek için sembolik bağlantıların kullanılması fikri kusurludur ve çalışamaz. Sembolik bağlantı için gösterilen izinler çoğunlukla ilgisizdir, "gerçek" dizininin izinlerini atlatmak için kullanılamazlar. Bir sembolik oluşturma /var/www/html/moodleiçin /home/andre/www/moodle/izinlerini aşmak değil /home/andre/www/moodle/. Bir şeyler yapmak isteyen herkes, /var/www/html/moodleancak gerekli izinlere sahipse bunu yapabilir /home/andre/www/moodle/.

İmzalamanızdan sudo chmod -R 775 moodle/aslında yaptığı bir etkisi vardır, ancak farklı bunu sembolik bağın izni değişmedi düşündüğüm gelen, ancak sembolik link hedef /home/andre/www/moodle/.

Web sunucusunda aldığınız 403 hatası muhtemelen web sunucunuzun girmesi için gerekli izinlere sahip olmamasıdır /home/andre. Bu, "ek bir sorun" değildir, aynı izin probleminden dolayıdır.

Bu nedenle, sembolik bağlantılar kullanmak yerine, dosyalara ve web sunucusuna erişmelerine izin veren (veya uygulamaya göre değişiklik gösteren) onları düzenlemenizi sağlayan izinleri belirlemeniz gerekir. Bu izinlerin tam olarak ne olduğu, kullanım durumunuza (uygulamanız ve sunucu yapılandırmanız) bağlıdır.

Genel olarak, dosyalara sahip olmanız ve rw izinlerine sahip olmanızın iyi bir fikir olduğunu düşünüyorum, web sunucusu yalnızca grup izinleriyle dosyalara erişimi okumaktadır ve diğer tüm kullanıcıların hiçbir erişimi yoktur.

Bir izin örneği (eksik bilgiler nedeniyle kullanım durumunuz için çalışmayabilir):

andre@fermat:/var/www/html$ ls -al moodle/
total 0
drwxr-x--- 2 andre www-data 60 mai  4 16:20 .
drwxr-xr-x 3 root  root     80 mai  4 16:20 ..
-rw-r----- 1 andre www-data  0 mai  4 16:20 index.html

Dizinin, sahibi olarak girip sizin içeriğini değiştirmek için sizin için yeterli erişime sahip olduğunu görebilirsiniz; web sunucusu (gruptaki www-data) girip okuyabilir. Dosyaların kendileri okunabilir ve size (sahibine) yazılabilir ve web sunucusuna (grupta www-data) okunabilir . Diğer tüm kullanıcıların hiçbir erişimi yok.

Yine, lütfen bunu sadece örnek olarak alın. Web sunucunuzun tam kullanıcısı / grubu, yapılandırmanıza bağlıdır. Uygulamanızın (moodle) farklı izinlere ihtiyacı olabilir, onun belgelerine bakmanız gerekir.


Kabul edildi, ancak izinleri nasıl doğru ayarlayacaklarını bilmiyorlarsa bu pek de yardımcı olmaz ve başka sorunlarla da karşılaşırlar.
Thomas Ward

@ThomasW .: O zaman izinleri nasıl doğru şekilde ayarlayacağımız sorusu, web sunucusu yapılandırması, istenen dosya düzenleme şekli ve uygulamanın gereklilikleri gibi gerekli bilgileri içeren yeni bir soru olmalıdır.
mastov

ya da doğru bir cevap olarak yazılmış - ki şimdi yapıyorum. Ayrıca, bir web sitesi için / home / USER / dışında hiçbir şey çalıştırmamalısınız, eğer web sunucusu doğru bir şekilde yamalı ya da yapılandırılmamışsa, diğer birçok "kullanıcı" verisine erişebilir.
Thomas Ward

@mastov Anladım. Açıkladığın bir sürü soruyu çözüyorsun.
André Carvalho,

2

Thomas koğuşundan mükemmel cevap https://askubuntu.com/a/767534/717860

Önerilen tüm adımları 8 komut yerine sadece 3 komutla yapabilirsiniz:

3 komut:

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

aynı komutu aşağıdaki 8 komutu kullanarak yapın:

sudo chgrp -R www-data /var/www
sudo find /var/www -type d -exec chmod g+rx {} +
sudo find /var/www -type f -exec chmod g+r {} +
sudo chown -R ubuntu /var/www/
sudo find /var/www -type d -exec chmod u+rwx {} +
sudo find /var/www -type f -exec chmod u+rw {} +
sudo find /var/www -type d -exec chmod g+s {} +
sudo chmod -R o-rwx /var/www/
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.