Www verisinin sahip olduğu dosyalara SFTP izni verilmedi.


23

Apache ve PHP ile çalışan oldukça standart bir sunucu kurdum. Çalıştırdığım bir uygulama dosyalar oluşturur ve bunlar Apache kullanıcısına aittir www-data. SFTP ile yüklediğim dosyalar kendi kullanıcılarına aittir charlesr. Tüm dosyalar www-datagrubun bir parçasıdır . Benim sorunum, grubun bir parçası www-dataolmasına rağmen charlesr, sahip oldukları SFTP üzerinden hiçbir dosyayı değiştiremem veya üzerine yazamam www-data. SSH oturumu ile problemsiz dosyaları değiştirebiliyorum.

Yani ne yapacağımdan emin değilim. Sahip olduğum www-datadosyaları değiştirmek için SFTP oturum izinlerimi nasıl vereceğim ?

Biraz arka plan için, sunucuyu ayarlarken kendim için yazdığım notlar:

Now set up permissions on `/var/www` where your files are served from by
default:

$ sudo adduser $USER www-data
$ sudo chgrp -R www-data /var/www
$ sudo chmod -R g+rw /var/www
$ sudo chmod -R g+s /var/www

Now log out and log in again to make the changes take hold.

The previous set of commands does the following:

1. adds the current user ($USER) to the `www-data` group;
2. changes `/var/www` to belong to the `www-data` group;
3. adds read/write permissions to the group that `/var/www` belongs to;
4. sets the SGID bit on `/var/www`; this final point bears some explaining.

Sonra SGID biti ayarının ne anlama geldiğini kendi kendime açıklamaya devam ediyorum (yani, oluşturulan tüm dosyalar otomatik olarak grubun bir /var/wwwparçası olur www-data).


GÜNCELLEŞTİRME

Sorunun uygulamanın kendisinden veya daha belirgin olarak, yazdığı belirli dosyaları 0644 (rw-r - r--) olarak ayarlayan uygulama çerçevesi ( Kohana ); yani grup yazılabilir değil. Bu, aynı zamanda dosyaların da ait olduğu gerçeğiyle birleştiğinde, www-dataoturum açtığımda SFTP ile dosyaları düzenleyemedim anlamına geliyordu charlesr. Dosyaları neden SSH ile düzenleyebildiğimden emin değilim. Tahminim, sudo kullanmış olmam gerektiğidir.

İşte şimdi benim önceki stratejimdeki kusurları belirten Marty Fried'ın yorulmak bilmeyen yardımı sayesinde kullandığım izin stratejisi ve aynı zamanda Linux izinleri dünyasında uçup gidene kadar devam etmeme yardımcı oldu. Teşekkürler Marty!

genel bakış

  • Dosyalar ve dizinler /var/wwwait olmalıdırroot:webmasters
  • Tüm kullanıcılar webmastersgrup üyesi olmalı
  • İçindeki tüm dizinler /var/wwwşu şekilde ayarlanmalıdır: 2775veya u=rwx,g=rwxs,o=rx(rwxrwx-rx)
  • Tüm dosyalar /var/wwwşu şekilde ayarlanmalıdır: 0664veya ug=rw,o=r(rw-rw-r--)

Aşağıdakiler sahip olmalıdır www-data:webmasters(örn. Bunlar Apache'nin yazması gereken dizinlerdir):

  • application / önbellek
  • application / günlükleri
  • yükleme
  • client_helpers / yükleme

NASIL

/var/wwwVarsayılan olarak dosyalarınızın nerede sunulduğu konusunda izinler ayarlamak için :

  1. sudo addgroup webmasters
  2. sudo adduser $USER webmasters
  3. sudo chown -R root:webmasters /var/www
  4. sudo find /var/www -type f -exec chmod 664 {} \;
  5. sudo find /var/www -type d -exec chmod 775 {} \;
  6. sudo find /var/www -type d -exec chmod g+s {} \;
  7. sudo chown -R www-data:webmasters application/cache/ [vb...]

Şimdi değişikliklerin bekletilmesi için oturumu kapatın ve tekrar oturum açın.

Önceki komut kümesi aşağıdakileri yapar:

  1. Adlı yeni bir grup oluşturun webmasters; Uygulama dosyalarına yazma erişimi gereken tüm kullanıcılar bu gruba eklenir.
  2. geçerli kullanıcıyı ( $USER) webmastersgruba ekler .
  3. sahibini değiştirir /var/wwwiçin rootve grubun webmastersgrubunda.
  4. içindeki tüm dosyalara 664 izin (-rw-rw-r--) ekler /var/www.
  5. içindeki tüm dizinlere 775 izin (drwxrwxr-x) ekler /var/www.
  6. SGID bitini /var/wwwve içindeki tüm dizinleri ayarlar ; bu son nokta bazı açıklamalara dayanıyor. Ayrıca aynı şeyi yapmak için chmod octal'ınızın önüne (örneğin 2644) bir 2 koyabilirsiniz.
  7. sahibini www-data(Apache'nin kullanıcısı) ve verilen dizinin grubunu ayarlar webmaster. Bu, dizinin Apache ve webmastersgruptaki herkes tarafından yazılabilir olmasını sağlar . Yazılabilir olması gereken diğer tüm dizinler için aynısını yapın.

Yanıtlar:


10

Ubuntu.com'un Apache rehberi gibi oldukça iyi sunucu rehberleri var . Bu kadar dikkatlice not aldığınız prosedürlerinizi nereden aldınız? Yaptığım sunuculardan hiçbirinde bu kadar sıkıntı yaşamak zorunda kalmamıştım, ancak doğru şekilde yapmadığım için açık olduğum halde - ayrıca, aslında Çok genel veya çok büyük olan herhangi bir şey, bu yüzden bilmediğim bir güvenlik delikleri olabilir.

Ancak, hiçbir zaman www veri grubunun üyesi olmam gerekmedi ve www içindeki hiçbir kaynak dosya www verilerine ait değil. Anladığım kadarıyla, bu Apache tarafından sadece kendi dosyaları için kullanılıyor ve diğer dosyaların hiçbirine yazma izinleri olmayacak, çünkü teoride hiçbir önemli dosya www verisinin yazma iznine sahip olmasına izin vermeyecek. Www-data'ya ait dosyaların herkese salt okunur izin vereceğini ve kimsenin dosyalarına yazma izni olmamasını tahmin ediyorum. Tabii ki tamamen yanlış olabilirim ve eğer öyleysem, birisi bana söyler ve farklı bir şekilde açıklayan gerçek belgelere işaret eder (benim gibi rastgele bir internet kullanıcısının kendisi için çalışan talimatlar verdiği bazı forumlara değil).

Belki bir şeyleri özlüyorum, ancak problemin oldukça açık olmalı. Sftp kullanarak giriş yapan kullanıcının www-data grubunun bir üyesi olması gerekir ve değiştirmeye çalıştığınız dosyaların www-data grubu için yazma izinleri olmalıdır. Dosyaları ssh kullanarak değiştirebilmeniz mantıklı gelmiyor ama sftp kullanmıyorsunuz; Her ikisi için de aynı hesaba giriş yaptığınızdan emin misiniz? Sftp'de !groupsgruplarınızı listelemek veya !whoamihangi giriş adını kullandığınızı kontrol etmek gibi komutlar girebilirsiniz . Sonuçlar ssh kullanarak gördüklerinizle eşleşmelidir (aynı komutlarla ünlem işareti hariç).

Ayrıca, izniniz varsa, sftp'den chmod, chown, chgrp kullanabilmelisiniz.

Bu arada, listenizde en az bir tane kötü komut olduğunu düşünüyorum:

sudo chmod -R g+rw /var/www

Bu, dünyaya / var / www içindeki her dosya ve klasöre yazma izni verir. Bu kötü bir fikir gibi geliyor. Normalde, yalnızca kök, belirli dizinlerin daha fazla izne ihtiyacı olmadıkça, genellikle yalnızca tek dizinlere bu dizinlere yazma iznine sahiptir.

Not: Bu benim açımdan bir hataydı. DonalLafferty'ye bunu gösterdiği için teşekkürler, "a" değil "g" yi belirtir, bu yüzden sadece grup izinlerini değiştirir. Yorgun yaşlı gözlerim (veya kötü bir yazı tipim) "a" olarak okumuş olmalı.

Açıklama için düzenlemeler

Normalde, Apache tarafından oluşturulan dosyalar, hem www-data grubu hem de / var / www içindeki root'a ait dosyalar gibi tüm diğer kullanıcılar için salt okunurdur. Dolayısıyla, kimseyi www verisinin bir üyesi yapmak için hiçbir neden olmamalıdır. Mesele, herkese farklı bir durum olan yazma erişimini vermektir. Bu, sitenizde belirli dizinler kullanılabilir hale getirilerek yapılmalıdır ve bu, muhtemelen root tarafından sahip olunan veya sudo kullanmadığınız için, yalnızca chmod kullanarak ya sudo ile ya da sahibini kendiniz yaparak yapmanız gerekir.

Tüm siteye erişmesi gereken daha fazla geliştiriciniz varsa, o zaman "webmaster" gibi bir kullanıcı + grubu yapmak istiyorsanız, sitenin sahibi olun, o gruba yazma izni verin ve tüm üyelerin üyelerini yapın bu grubun. Bu nedenle, site dizinleri için listeleme şöyle bir şey olurdu:

drwxrwxr-x  ##  webmasters     webmasters   #### ####-##-## ##:##  mysite.com

Diğer Düzenlemeler

O zamandan beri bir kullanıcı "webmaster" oluşturmak zorunda olmadığınızı fark ettim, sadece bir grup. O zaman dosyalar root'a ait olabilir: webmasterlar, yani root sahibi, ama webmasterlar gruptur.

Aşağıdaki sorulara cevaben, Apache'nin yazdığı dosyalar www-data'ya ve www-data'ya aittir. Bu dosyalar normalde yazdığınız bir şey değildir, bu nedenle www-data üyesi olmayanların salt okunur erişimi olabilir - bunun dizin izinlerine bağlı olduğunu düşünüyorum. Zaman zaman yazma erişiminden daha fazlasına ihtiyacınız varsa, kendinizi gruba eklemek yararlı olabilir. Genellikle, belirli dizinler dünyasını Apache tarafından kaydedilen içerik için yazılabilir yaparsınız. Ayrıca, çoğu Apache'yi barındırmayan ve kabuk erişimine sahip olmayan bir barındırma barındıran web sitelerinin grup kurmanın bile bir yolu olmadığını düşünün.

Ancak Apache, root tarafından sahip olunan dosyaları bile okuyabilir. Hemen hemen tüm dosyalar dünyaca okunabilir erişime sahiptir, yazılabilir değildir. Dolayısıyla, bunu değiştirmek istemediğiniz sürece, Apache'nin webmaster grubunda olması gerekmez.

Tüm bunlar temel Linux kurulumudur, gerçekten Apache değil. Apache yalnızca web sunucusundan erişimle ilgilenir ve bu yapılandırma dosyaları tarafından ayarlanır. Bu nedenle, yazımda yer aldığım Ubuntu dokümantasyon bağlantısı, herkese açık wiki'den daha iyi bir kaynak olarak düşünülmeli.

Bu arada, O'Reilly Apache Cookbook "Htdocs, cgi-bin ve simgeler gibi belge dizinlerinin, web sitenizin gelişim modeli için en anlamlı şekilde izinleri olması gerekir. ancak hiçbir koşulda, içerdiği bu dizinlerin veya dosyaların hiçbiri web sunucusu kullanıcısı tarafından yazılabilir olmamalıdır. "

Son olarak, daha fazla denetime ihtiyacınız olursa ACL'leri kullanmak dosya izinlerini ayarlamak için iyi bir yoldur. Her zaman onları ayarlamak için iyi bir yol bile olabilir ve araştırmam gereken bir şey.


Merhaba @ marty-fried, cevap için teşekkürler, denemek için bana bol verir. Yeniden. sorularınız. Bilgiyi çeşitli kaynaklardan bir araya getirdim (bu yüzden neden kendi kullanım kılavuzuma yazdım) ve tam kaynağı hatırlayamıyorum. Her ne kadar bu kaynağı kullanmamış olsam da (çözüm 1) (sadece buldum), kararım için iyi bir gerekçe veriyor. Bahsettiğiniz Apache kılavuzunda, 'webmaster' adında bir grup oluşturmanızı önerir, ancak bunu yaparsam Apache /var/wwwo gruba eklemeden nasıl yazabilir ?
Charles Roper

Ve do için diğer kullanıcılara erişim vermek gerekir /var/wwwben grup erişim sağlayarak düşünce böylece www-dataiyi bir çözüm olacağını herkes o grubun bir üyesini ve yapım. Şimdi Apache'nin oradaki herhangi bir dosyanın üzerine yazma olanağını görebiliyorum . Sadece 2 cihaz devresinin (kendimi de içeren) koda erişimi olduğu göz önüne alındığında, kısa vadede nispeten güvenlidir.
Charles Roper

1
Teşekkürler Marty. Apache Cookbook'un bu bölümü beni güldürdü: "Eğer 12 kişiden Apache sunucunuzda dosya izinlerini ayarlamak için doğru yolları sorarsanız, bir düzine farklı cevap alacağınızı unutmayın." Şimdi ilerlemem için gereken her şeyi bana verdin. Zaman ayırdığın için çok teşekkürler. :-)
Charles Roper

1
Ben de biraz öğrendim, bu yüzden derinlemesine tartışmalardan zevk alıyorum - bu genellikle bazı tehlikeli kısımların netleşmesine yardımcı oluyor. Ben temel olarak sorunları çözmesi ve web siteleri kurması istenen bir programcıyım, bu yüzden her zaman işleri yapmanın daha iyi yollarını öğreniyorum. Başka sorularınız varsa sormaktan çekinmeyin.
Marty Fried

1
AFAIK, sudo chmod -Rg + rw / var / www 'grup' erişim sağlar. Dünyaya erişim için 'a + rw' kullanın.
Donal Lafferty

7

Kullanmadığını fark ettim chown.

Dosyaların / klasörlerin sahipliğini düzgün bir şekilde ayarlamak için tüm dizini şu şekilde ayarlayabilirsiniz: chown -R www-data:www-data

Bu, gruba www-datave kullanıcıya mülkiyeti ayarlarwww-data

Ayrıca, geçici bir geçici çözüm olarak bunu yapabilirsiniz:

chmod 777 /var/data/<filename> veya chmod 777 /var/data/<foldername>

dosyaları gerektiği gibi düzenleyin ve ardından

chmod 644 /var/data/<filename> veya chmod 755 /var/data/<foldername>

"-R" anahtarını kullanmaya dikkat edin, çünkü tüm alt dosya ve klasörlerin izinlerini de değiştirir.

664 Apache standart dosya izinleri ve 755 standart klasör izinleridir.

Bu yardımcı olur umarım :)

Star


Merhaba, cevaplamak için zaman ayırdığınız için teşekkürler, çok memnun oldum. Ancak, gerçekten yardımcı olmuyor. Dosyaların kesilmesi, SFTP kullanırken TÜMünün değiştirilemez olmasını sağlar (bu yüzden peşinde olduğum şeyin tersi!). Chmod geçici çözümünü gerçekten kullanamıyorum çünkü a) SFTP'de chmod için izinlerim yok; b) Gerçekten SSH üzerinden giriş yapmak, izinleri değiştirmek, SFTP'lerimi yapmak, geri dönüş vb. yapmak istemiyorum; ve c) bazı dosyalar güvenlik nedeniyle farklı izinlere sahip, bu nedenle yine de toplu olarak toplayamıyorum.
Charles Roper

Nedir /var/data? Ayrıca, hangi dizini bu komutu kullanmasını öneriyorsunuz chown -R www-data:www-data? Umarım olmaz /var/www.
Marty Fried,
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.