Kullanıcıya yalnızca bir dizine okuma / yazma erişimi verme


18

Bir sunucu çalıştırıyorum ve tek bir kullanıcıya belirli bir dizine okuma / yazma erişimi vermeliyim. Aşağıdakileri denedim:

sudo adduser abcd
sudo groupadd abcdefg
chown -R .abcdefg /var/www/allowfolder
chmod -R g+rw /var/www/allowfolder
usermod -a -G comments abcd

Yukarıdaki gibi çalışıyor, ancak kullanıcıya sunucunun geri kalanına salt okunur erişim sağlar.

Kullanıcının yalnızca belirli bir klasörü okuyabilmesi ve yazabilmesi için izinleri nasıl ayarlayabilirim? Kullanıcı, gibi programları da çalıştırabilmelidir mysql.


2
Kısa cevap: bir chroot kullanın.
Chris Down

@Chris Bir cevapta bunun üzerinde durmak ister misiniz? Manish ve ben bununla mücadele ediyoruz ve çalışmasını sağlayamıyoruz.
Geri al

mysqlProgram nerede bulunur? Kullanıcı onu ve ihtiyacı olan tüm kütüphaneleri ve veri dosyalarını okuyabilmelidir.
Gilles 'SO- kötü olmayı kes

@Gilles Hmm. Anlayabildiğim kadarıyla apt-get'den standart bir mysql kurulumu (benim sistemim değil, bu Geri Al).
Manishearth

Yanıtlar:


18

Negatif EKL'ler

Erişim kontrol listelerini ayarlayarak kullanıcının dosya sisteminin belirli bölümlerine erişmesini engelleyebilirsiniz . Örneğin, kullanıcının abcdaşağıdaki dosyalara erişemediğinden emin olmak için /home:

setfacl -m user:abcd:0 /home

Bu yaklaşım basittir, ancak erişmek istemediğiniz her şeye erişimi engellemeyi unutmayın abcd.

chroot

Neleriabcd görebileceğiniz üzerinde olumlu kontrol sahibi olmak için, bir chroot oluşturun , yani kullanıcıyı dosya sisteminin bir alt ağacıyla sınırlayın.

Kullanıcının ihtiyaç duyduğu tüm dosyaları (ör. mysqlVe kullanıcının çalışmasını istiyorsanız tüm bağımlılıkları mysql) chroot altında yapmanız gerekir . Diyelim ki krota giden yol /home/restricted/abcd; mysqlprogram kullanılabilir altında olması gerekiyor /home/restricted/abcd. Krootun dışına işaret eden sembolik bir bağlantı iyi değildir çünkü sembolik link araması, chroot hapishanesinden etkilenir. Linux altında, bağlama bağlarını iyi kullanabilirsiniz:

mount --rbind /bin /home/restricted/abcd/bin
mount --rbind /dev /home/restricted/abcd/dev
mount --rbind /etc /home/restricted/abcd/dev
mount --rbind /lib /home/restricted/abcd/lib
mount --rbind /proc /home/restricted/abcd/proc
mount --rbind /sbin /home/restricted/abcd/sbin
mount --rbind /sys /home/restricted/abcd/sys
mount --rbind /usr /home/restricted/abcd/usr

Dosyaları da kopyalayabilirsiniz (ancak güncel olmalarına dikkat etmeniz gerekir).

Kullanıcıyı chroot ile sınırlamak için bir ChrootDirectoryyönerge ekleyin /etc/sshd_config.

Match User abcd
    ChrootDirectory /home/restricted/abcd

Şunlarla test edebilirsiniz: chroot --userspec=abcd /home/restricted/abcd/ /bin/bash

Güvenlik çerçevesi

SELinux veya AppArmor gibi güvenlik çerçevelerini de kullanabilirsiniz. Her iki durumda da, herhangi bir delik bırakmadığınızdan emin olmak için oldukça hassas bir yapılandırma yazmanız gerekir.


Belirli bir dizine okuma ve yazma izni vermenin çok daha kolay bir yolu grup oluşturmaktır mı? Örneğin, yeni bir grup oluşturabilir ve dizin grubu sahibini yapılan grup haline getirmek için chown kullanabilir ve kullanıcıyı gruba ekleyebilir. Son olarak dizine gruplara okuma ve yazma izinleri verin.
Kasım

@Qasim Bu, tüm dosyaların izinlerinin ve sahipliklerinin istendiği gibi ayarlanmasını gerektirir. Yanlış gidebilecek çok şey var (izinleri korunarak başka bir yerden kopyalanan veya bir arşivden çıkarılan dosyalar, başka bir gruba ait olması gereken dosyalar, grup tarafından okunamayan dosyalar, hata yapan veya yapabilen kullanıcılar ' t Grup erişilebilirliğinin istendiği gibi kalmasını sağlamak için rahatsız etmeyin…) grupların bu sorunu gerçekten çözmediğinden emin olun.
Gilles 'SO- kötü olmayı bırak

Dizin üzerinde grup izinleri hiçbir kullanıcı dizine "cd" veya dizini "ls" bir şekilde ayarlanmış olsaydı ben nasıl dosyaları kendi izinleri olması gerektiğini görmüyorum demek.
Kasım

@Qasim Altındaki her dosyaya /var/www/allowfolderve alt dizinlerine sadece /var/www/allowfolderkendisi değil erişilebilir olmalıdır . Tersine, diğer dosyalara erişilemez. Aslında, yalnızca dosya izinlerine ve ACL'ye dayanan bir çözüm gereksinimleri tam olarak karşılayamaz: en azından kullanıcının erişim /var/wwwiçin x iznine sahip olmaları gerektiğinden belirli bir adın var olup olmadığını test etmesine izin verir . /var/www/var/www/allowfolder
Gilles 'SO- kötü olmayı bırak

Oh ok anlıyorum ama eğer / var dizinini bundan çıkarırsak ve / home / user dizinindeki normal bir dizin hakkında konuştuğumuzu varsayalım?
Kasım

5

Kullanmalısınız chroot. chrootKomut tüm alt süreçleri gördükleri kök dizini değiştirir. Nasıl çalıştığını göstermek için bir örnek vereceğim.

Bu olay yerinde yazılmıştır; Şu an UNIX makinesinin önünde değilim. Bu örnekte, adlı bir dizin var dirüç dosyalarla: a, b, c, ve ls. İlk üçü normal dosyalardır. lsgerçek lsikili dosyaya bir sabit bağlantıdır, böylece dosyaları kroottayken listeleyebiliriz.

Ben gidiyorum chrootiçine dir. (Büyük olasılıkla kök dizindeki bazı dizinleri unuttuğumu unutmayın.)

İşte kabuk çıktı formundaki kurulum:

$ pwd
/home/alex/test
$ l
dir
$ ls dir
a b c ls
$ ./ls dir # does the same thing
a b c ls
$ ls /
bin boot dev etc home mnt media proc sbin sys usr var

Şimdi olacak chrootiçine dir. Bağımsız /bin/bashdeğişken, yeni kök dizinde hangi işlemin çalıştırılacağını seçer. Varsayılan olarak /bin/sh.

$ chroot /bin/bash dir
$ # this prompt is now from a subprocess running in the new root directory
$ PATH=/ ls
a b c ls
$ pwd
/

Şimdi şunlardan çıkıyoruz chroot:

$ exit
$ # this prompt is now from the original bash process, from before the chroot
$ pwd
/home/alex/test

Umarım bu chrootkomutun nasıl çalıştığını gösterir. Temelde sorununuzu çözmek için yapmanız gereken, chroother oturum açtıklarında o kullanıcı olarak bir komut çalıştırmaktır . Belki de bir başlangıç ​​komut dosyasına koymak?

Bir dosyaya olan sabit bağlantı chroot, o dosyaya başka yollarla erişilemese bile a içinde çalışmaya devam eder (bu, sabit bağlantıların yolları değil, düğümleri gösterdiği için çalışır). Bu nedenle, kullanıcının mysqlkomut gibi erişmesine izin vermek için şunları yürütebilirsiniz:

ln /usr/bin/mysql /path/to/chroot/target

Ancak bu, tüm sembollerle tüm bir chroot ortamı kurmamı gerektirmez mi? Yeni kullanıcının diğer dizinlere erişimi olmaması için bir komut çalıştırmak daha kolay olmaz mıydı, ancak apache gibi programlar bunlara erişimi kaybetmez mi?
Manishearth

Temel olarak, bir kullanıcının diğer kullanıcıların erişimini etkilemeden fs'nin geri kalanına okuma erişimini kaybetmesini sağlamanın herhangi bir yolu var mı (chmod aracılığıyla)?
Manishearth

@Manishearth ile basit bir yolu yoktur chmod. "bir komutu çalıştırmak daha kolay olmaz mıydı ... onlara erişimi kaybetmeyin" dediğinizde, o komut budur chroot. "tüm bir kroot ortamı" ile ne demek istediğinizi veya bunun neden bir sorun olacağını açıklarsanız, belki daha iyi anlarım. (bir oneliner ile tüm yürütülebilir dosyalara erişim verebileceğinizi unutmayın ln /bin/* /path/to/chroot/target)
strugee

@Manishearth, örneğim mantıklı değilse, chrootkendinizle oynamanızı veya mantıklı olmayanları bana bildirmenizi öneririm . daha da iyisi, ikisini de yap. (ve
manajları

@Manishearth, bu cevap sizi cevaba götürecek kadar yardımcı olduysa, kabul etmeyi düşünmelisiniz.
Kasım'da strugee
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.