Bir Linux kullanıcısını sahip olduğu dosyalarla sınırlayın


24

Birden fazla (~ 100) müşterinin tek bir sunucuya kabuk erişimine sahip olduğu paylaşılan bir web barındırma şirketinin sunucu kurulumunu hayal edin.

Çok sayıda web "yazılım" 0777 chmod dosyaları önerir . Müşterilerimize bu eğitimleri dikkatlice takip ederek, dosyalarını diğer müşterilerimize açarak endişeliyim. (Kesinlikle cmod 0777kendimi gereksiz yere kullanmıyorum !) Müşterilerin yalnızca kendi dosyalarına erişebilmelerini ve diğer kullanıcıların dünyaca okunabilir dosyalarına erişmelerini engellemelerini sağlayacak bir yöntem var mı?

AppArmor'a baktım , ancak bu o ortamda başarısız gibi görünen bir sürece çok sıkı bir şekilde bağlı.


12
Aslında "web yazılımı" tavsiyelerinin chmod files 0777kesinlikle gerekli olup olmadığını düşünürdüm , yani, bir başkasının dosyalarını okuyabilen bir semptom yerine, sorunun asıl nedenini ele alır. Çoğu zaman, tüm erişim önerisine izin ver, destek aramalarından kaçınmanın ya da izinleri doğru şekilde ayarlayabilmenin teknik cesaretinin bulunmamasının ucuz bir yoludur. Neredeyse hiçbir durumda talep ettiğimde dosyaları ayarlamak 0777ya da uygulamalara tam root erişimi vermek zorunda kalmamıştım . Kullanıcıların ve / veya satıcıların eğitimi burada büyük ölçüde yardımcı olur.
Cosmic Ossifrage

3
@CosmicOssifrage, kullanıcılar o kadar kolay eğitilemez ki, talimatları veya kılavuzları okumak istemezler.
Cristian Ciupitu

12
777 iznini hala tavsiye eden herhangi bir "web yazılımı" çıkarılmalı ve çekilmelidir . Kullanın suexecveya mpm_itkbenzeri.
Shadur

3
@CosmicOssifrage Phillipp'in kullanıcıları chmod 0777dosyalarına söylediğini veya zorladığını sanmıyorum . Onun bunları gitmeyi sinir olduğunu düşünüyorum loltoturialz.com/php_problemsve ayar chmod 0777körlemesine bir kötü yazılmış makale takip ederken kendi başlarına. Bunları yapmalarını engellemenin ya da birileri eşyalarını çaldığında üzülmelerini önlemenin gerçekten bir yolu yok.
Kevin - Monica'yı yeniden

2
@kevin - kesin olarak garanti geçersizliğinin yaratılmasının nedeni budur. Böyle bir cümle olmadan neredeyse hiç ciddi bir cihaz görmedim (yazılım derlendi, bir sürü senaryo veya her neyse). Ve ister inan ister inanma - çoğu kurumsal ortamda kullanıcılar bunun farkındadır
Dani_l

Yanıtlar:


34

Dış dünya ile korunan dosyalar arasında sınırlı ve değişmez bir dizin koyun ; örneğin;

/
 ├─ bin
 ├─ home
 │  └─ joe <===== restricted and immutable
 │     └─ joe <== regular home directory

veya /home/joe/restricted/public_html.

Sadece kullanıcı ve belki web sunucusu okuyabilirsiniz araçları Kısıtlı (örn modları 0700/ 0750veya bazı ACL ).

İmkansızlık chattr +i, mülkiyeti benzer bir şeyle değiştirmek suretiyle veya onunla yapılabilir root:joe.

Ubuntu o hiyerarşi oluşturmak için kolay bir yol düzenlemek olacaktır /etc/adduser.confve seti GROUPHOMESiçin yes.


15

Düşünmek isteyebileceğiniz bir seçenek var (bunun için ne kadar iş yapmak istediğinize bağlı olarak).

Diğerleri zaten yayınlanmış olduğu gibi, "normalde", kabuk okunabilen birinin dünyaca okunabilir dosyaları okumasını engelleyemezsiniz.

Ancak, onları kendi evlerine koyabilir, temel olarak kabuk erişimini ilk önce yalnızca istediğiniz kök dizine (AKA ana dizini) sınırlandırabilir ve ikincisi, kullanıcıların yürütmelerini istemediğiniz her şeyi yürütmesini önleyebilirsiniz.

Web dosyalarına erişebilecek bir kullanıcı varken benzer bir yaklaşım kullandım, ancak web klasörünün dışındaki diğer dosyaları görmesini istemedim.

Bu, çok fazla ek yüke sahipti, kurulum için bir karışıklıktı ve bir şeyi her güncellediğimde bozuldu.

Ancak bugün için OpenSSH chroot seçeneğiyle kolayca başarabileceğinizi düşünüyorum :

WikiBooks OpenSSH


SFTP için chroot'un uygulanması kolaydır, ancak kabuk erişimi için o kadar kolay olduğundan emin değilim. Her kullanıcı için tüm ikili dosyalar ve kitaplıklar ile bir chroot kurmanız gerekir.
Cristian Ciupitu

2
Bu uygulamaya özeldir. ARCHLINUX, tüm ekstra bağlama bağlantıları vb. İle
Dani_l

@CristianCiupitu, gerekli tüm kütüphaneleri birbirine bağlayan sadece belirli bir komut alt kümesine izin verdiğimi söyledi, bu yüzden bir karmaşa olduğunu söyledim. .
Dennis Nolte

@Dani_l: Peki ya kurulu paketler? arch-chrootKomut o kapsayacak şekilde görünmüyor. Ve ayrıca tüm kopyalarla birlikte boşa harcanan disk alanı sorunu var. Bunu yapmanın imkansız olduğunu söylemiyorum, şu anda biraz daha karmaşık olabilir.
Cristian Ciupitu

1
Bunu daha kolay hale getirecek bir şey, kullanıcıları salt salt okunur modda rootfs özel bir birleşimine dönüştürmek için UnionFS kullanmak ve bir ana sayfa yazım dizini kullanmaktır; bu, tüm sistem paketlerini ve ikili dosyaları görmeleri anlamına gelir; onların ana klasörü. Bu -çoğu, tüm ev dizinlerinin 700 izin almasıyla birleştiğinde başka kullanıcılar da kullanıcıların diğer kullanıcılardan dosyaları okuyabiliyordu.
Vality

11

POSIX Erişim Kontrol Listelerinin, sistem yöneticisi olarak, normal kullanıcı-grubu-diğer dosya sistemi iznini geçersiz kılarak, çok önemli bir şeyi kırma şansı olmadan, kullanıcılarınızı kendi cehaletlerinden en kötü şekilde korumanıza izin verdiğini tespit ettim. .

Örneğin (fi) dünyanın erişilebilir olması için ev dizinlerine ihtiyaç duyuyorsanız özellikle faydalı olabilir, çünkü webcontent'in apache için erişilebilir olması gerekir ~/public_html/. (Her ne kadar ACL'lerle şimdi tersini yapabilirsiniz, herkes için erişimi kaldırın ve apache kullanıcısı için belirli bir etkin ACL kullanın.)

Evet, bilgili bir kullanıcı bunları tekrar kaldırabilir / geçersiz kılabilir, bu durum beklenmeyen durumlardan oldukça nadir görülür ve normalde chmod -R 777 ~/yine de uygun olan kullanıcılar olmayan kullanıcılar , değil mi?

Dosya sistemini aclmount seçeneğiyle birlikte bağlamanız gerekir :

 mount -o remount,acl /home

Birçok dağıtımda, varsayılan kullanıcı grupları oluşturmaktır, her kullanıcının birincil grubu vardır ve tüm kullanıcıları ikincil bir grupta tanımlanamayan adıyla ayarladım users.

ACL'leri kullanmak, diğer kullanıcıların ev dizinlerine erişmesini önlemek için artık önemsizdir:

Önce:

 chmod 0777 /home/user* 

 ls -l /home/user*
 drwxrwxrwx.  2 user1  user1  4096 Jul 11 15:40 user1
 drwxrwxrwx.  2 user2  user2  4096 Jul 11 15:24 user2

Şimdi usersgrubun üyeleri için etkili dizin izinlerini 0okuma, yazma veya erişime izin vermeyecek şekilde ayarlayın :

 setfacl setfacl -m g:users:0 /home/user*

 ls -l 
 drwxrwxrwx+  2 user1  user1  4096 Jul 11 15:40 user1
 drwxrwxrwx+  2 user2  user2  4096 Jul 11 15:24 user2

+İşareti var ACL ayarlarında varlığını gösterir. Ve getfaclbunu doğrulayabilir:

getfacl /home/user1
getfacl: Removing leading '/' from absolute path names
# file: home/user1
# owner: user1
# group: user1
user::rwx
group::rwx
group:users:---
mask::rwx
other::rwx

group:users:---Grup etkin olarak diğer varlık için düzenli izinleri rağmen erişim hakkına sahip olduğunu göstermekother::rwx

Ve user1 olarak test:

[user1@access ~]$ ls -la /home/user2
ls: cannot open directory /home/user2: Permission denied

Paylaşılan sistemlerdeki ikinci bir ortak çözüm, talep üzerine talep üzerine otomatik sayıcının ana dizinleri ve kabuk erişimine adanmış bir sunucuya sahip olmasıdır. Bu, aptalca bir kanıt olmaktan uzak, ancak tipik olarak yalnızca bir avuç kullanıcı oturum açacak ve aynı zamanda yalnızca bu kullanıcıların giriş dizinleri görünür ve erişilebilir durumda olacak.


5
Nedir "fi" ? "Eg", "yani", "etc" gibi klasik olanlar veya belki OP olmadıkça kısaltmalar veya kısaltmalar kullanmanızı tavsiye etmem.
Cristian Ciupitu

3

Linux Containers (LXC) , chroot ve ayrı sistemlerin en iyi kombinasyonu olabilir.

  1. Sanallaştırma değil, gelişmiş bir chroot gibidirler, ancak farklı işletim sistemlerini tek bir sunucuda birleştirebilirsiniz.

  2. Bir kullanıcıya tam bir işletim sistemi verebilir ve onu orada chroot edebilirsiniz, böylece kullanıcı oturum açtığında kabına gider. Ayrıca işlemci ve bellek kullanımını burada sınırlayabilirsiniz.

LXC'nin yazarı olan Stéphane Graber, başlamanıza yardımcı olacak güzel bir eğiticiye sahip.


Gerçekten farklı işletim sistemlerini birleştiremezsiniz, çünkü hepsinin Linux çekirdeğini kullanması gerekir , ancak farklı dağıtımları kullanabilirsiniz .
Cristian Ciupitu

1
Teşekkürler :) Evet, farklı linux çekirdek tabanlı işletim sistemleri.
manyak

@CristianCiupitu aynı Linux çekirdeğini mi kastediyorsunuz? ya da her bir kabın çekirdeğin farklı bir sürümüne sahip olabileceğini mi kastediyorsunuz?
agks mehx

@ agksmehx, tüm LXC kapları, konağın çekirdeğini paylaşır . Sadece uygulamaları ve kütüphaneleri kullanılır. Örneğin, eğer bir Ubuntu 14.04 konteynerli bir RHEL 7 sunucunuz varsa, RHunt çekirdeği (3.10.0-123) kullanılırken, Ubuntu bir (3.13.0-24.46) kullanılmayacaktır; Ayrıca bu açıklamayı da öğreticiden okuyun. Bu arada, kapların çekirdekleri kullanılmadığından, biraz disk alanı kazanmak için bunları çıkarmak iyi bir fikir olabilir.
Cristian Ciupitu

@CristianCiupitu böyle düşündüm. Cevaptan veya yorumdan net değildi, bu yüzden açıklığa kavuşturmak istedim.
agks mehx

3

Örneğin, kullanıcının yalnızca kendi homedizinine erişmesini istiyorsanız, yapmanız gerekenler:

cd /home
sudo chmod 700 *

Şimdi /home/usernameyalnızca sahibine görünür. Bu, tüm yeni kullanıcılar, düzenleme için varsayılan yapmak için /etc/adduser.confve seti DIR_MODEiçin 0700yerine 0755varsayılan.

Elbette, varsayılan DIR_MODE'yi değiştirmek istiyorsanız, dağıtımınıza bağlı olarak, gönderdiğim çalışma çalışır Ubuntu.

Düzenle

As @Dani_l doğru sözü, bu yanıt DEĞİL Dünya okunabilir bunları yaparken doğrudur.


Bir nedenle "dünyaca okunabilir" olarak adlandırılıyorlar.
Mark K Cowan

1
@DennisNolte Aslında, dosyalar dünyaca okunabilse bile, okuduğunuz veya yürütmediğiniz bir dizinde olsanız bile, onları okuyamazsınız.
Vality

1
@Vality true, kesinlikle yanlış olduğu için yorumumu kaldırıyorum.
Dennis Nolte

2

Sadece bilgili olmak için - Hayır, yok.
@Marek doğru bir cevap verdi , ancak sorunuz yanlış - kimsenin "dünyaca okunabilir" dosyalara erişmesini engelleyemezsiniz.
Ya dünyaca okunabilirler ya da değiller. @ Marek cevabı, dünyayı okunaksız hale getirme konusunda doğrudur.


2
yanlış, kullanıcıyı bir alt klasöre chroot / hapsedip "normal" dünyaca okunabilen dosyaları okuyamadı.
Dennis Nolte

1
-1 OP'nin sorusu için gereksiz yere eleştirildiğini düşünüyorum. Müşterilerine, izinleri konusunda akıllıca olmadıklarında güvenlik ağı sağlamak istiyor. Ancak OP, Unix dosya izinlerinin nasıl çalıştığının veya temel güvenlik ilkelerinin farkında olmadığını bana benzemiyor.
Kevin - Monica'yı yeniden

Ayrıca, dosyaları 000 izin dizininin içindeki bir dizine koyabilirsiniz, daha sonra dosyalar dünyaca okunabilir olsa bile kimse erişemez.
Vality

kimse? Kök bile değil mi? ;-)
Dani_l

@Kevin, yorumumun gereksiz yere eleştirildiğini kabul etti. Bununla birlikte Dani_I, pedandik ve arının yanlış olduğunu düşünmemelidir. Cevabının geri kalanıyla aynı fikirde olmadığımı söylemiyorum.
Dennis Nolte

0

Şimdiye kadar verilen cevaplarda 'sınırlı kabuğundan' bahsetmiyorum.

ln / bin / bash / bin / rbash

Bunu giriş kabuğu olarak ayarlayın.


0

Web sunucusu, barındırılan her etki alanı için aynı kullanıcı ve grupla çalışıyorsa, kurulumu güvenli hale getirmek zordur (mümkün değilse).

Belirli dosyaların kullanıcılara ve web sunucusuna erişebilmesini ancak diğer kullanıcılara erişememesini istiyorsunuz. Ancak, web sunucusu erişebildiği anda, başka bir kullanıcı, kendi web sitesi içindeki dosyaya bir link ekleyerek bunları okuyabilir.

Her web sitesinin ayrı bir kullanıcı olarak çalışmasını sağlayabiliyorsanız, oldukça basit bir hale gelir. Artık her müşterinin biri web sunucusu diğeri kabuk erişimi için iki kullanıcı olacak.

Bu iki kullanıcıyı içeren bir grup oluşturun. Şimdi bu grup ve kullanıcı kökü ile bir dizin oluşturun. Bu dizinin izinleri olması gerekir 750; bu, root'un tam erişime sahip olduğu ve grubun erişimi okuma ve yürütme anlamına gelir. Bu dizinde, iki kullanıcının her biri için giriş dizinleri oluşturabilirsiniz. Bu, kullanıcının giriş dizininin artık forma sahip olmayacağı /home/username, en az bir tane daha dizin bileşenine sahip bir şey olduğu anlamına gelir . Bu bir sorun değil, hiçbir şey bu rehbere göre ev dizinlerinin adlandırılmasını gerektirmiyor.

Ad tabanlı vhost'lar kullanıyorsanız, farklı kullanıcılar ve gruplarla çalışan web sitelerini almak zor olabilir. Ayrımı yalnızca IP tabanlı vhost'larla çalıştırabildiğiniz ve her site için yeterli IP’ye sahip olmadığınız ortaya çıkarsa, her web sitesini bir IPv6 adresinde barındırabilir ve bunlar için ters bir proxy koyabilirsiniz. IPv4 adresi.

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.