Belirli kullanıcı için Linux'ta Özel Komutu Engelle


27

Komut nasıl engellenir, mkdirbelirli kullanıcı için diyelim ?

Ne yaptım sadece salt okunur fonksiyonu ve kullanıcılar profilinde saklamak ~/.bashrc

/bin/mkdir() {
        echo "mkdir command not allow for you"

}

mkdir() {
        echo "mkdir command not allow for you"

}
./mkdir() {

        echo "mkdir command not allow for you"
}

readonly -f /bin/mkdir
readonly -f mkdir
readonly -f ./mkdir

Ölçek:

rahul@ubuntu:~$ cd /bin/
rahul@ubuntu:/bin$ ./mkdir /home/rahul/ggg
mkdir command not allow for you
rahul@ubuntu:/bin$ cd
rahul@ubuntu:~$ mkdir testing
mkdir command not allow for you
rahul@ubuntu:~$ /bin/mkdir testing
mkdir command not allow for you

Öyleyse benim sorum şu, bunu başarmanın yolu ne olmalı? Bunun için herhangi bir araç var mı?

Güncelleme 1 # Ancak kullanıcı akıllıysa, mkdir binary dosyasını kopyalayabilir ve yeniden adlandırabilir ve kullanabilir. Peki bu nasıl başarılır?


7
Örneğiniz başarısız olur, çünkü kullanıcı kendi derlemesini yapabilir mkdirve yeniden adlandırabilir, hatta varolan ikili dosyayı kopyalayıp yeniden adlandırabilir. Ayrıca, takma adları ve işlevleri geçersiz kılmak için yerleşik bir kabuk vardır.
Strugee

hmm bu doğru, yine de var mı?
Rahul Patil

Ayrıca kullanıcının derlemesine gerek kalmadan kolayca kopyalayabilir, cp /bin/mkdir mkdir2sonra kullanabilir :(
Rahul Patil

Bir dizin oluşturmak çok yaygın / temel bir iştir, bunu yapmanın birden fazla yolu vardır ve bunların hepsini engellemek neredeyse imkansızdır (kullanıcının dosya oluşturmasına izin vermemek hariç; yani tüm dizinleri kendisine karşı yazmaya karşı korumak hariç). Örneğin, ( varsa, kullanıcının silebileceği , içeriğinin bir kopyasını içeren) cp -r /usr/local/lib gggadlı bir dizin oluşturur . Kopyalanacak boş bir dizin bulmak için kullanabilirsiniz . ggg/usr/local/libfind / -type d -empty
G-Man

Yanıtlar:


21

Bash ile nasıl yapılacağını bilmiyorum, ancak kullanıcı ortamını kısıtlayan başka bir kabuk biliyorum: lshell (sınırlı kabuk) .

Yapılandırmaya hızlı bir bakış

Lshell, bir INI dosyası aracılığıyla yapılandırılmıştır. Varsayılan olarak, izin verilen komutların bir beyaz listesini tutar, ancak kullanıcının belirli bir komutu kullanmasını engellemek için kolayca yapılandırılabilir.

Bu yapılandırma (varsayılan conf /etc/lshell.conf) kullanmasını yasaklaması fookullanmaktan mkdir:

[foo]
allowed = 'all' - ['mkdir', 'bash', 'sh', 'csh', 'dash', 'env']

Bir kullanıcı hesabını varsayılan olarak lshell kullanacak şekilde yapılandırmak için yapmanız gereken:

 chsh -s /usr/bin/lshell foo

Lshell daha fazlasını yapabilir:

  • 3 ayrıntı düzeyi: kullanıcı, grup, hepsi.
  • Sistemdeki belirli yollara erişimi kısıtlayabilir.
  • Belirli karakterlerin kullanımını (örneğin |) kısıtlayabilir .
  • Bazı komutların kullanımını yalnızca SSH üzerinden kısıtlayabilir.

Ve dahası.

Güncelleme 1 # Eklenen Test Sonucu:

rahul:~$ which bash
/bin/bash
rahul:~$ dd if=$(which bash) of=my_bash
*** forbidden syntax: dd if=$(which bash) of=my_bash
rahul:~$ bash
*** forbidden command: bash
rahul:~$ cp /bin/bash my_bash
*** forbidden path: /bin/bash
rahul:~$ /bin/bash
*** forbidden command: /bin/bash
rahul:~$ sh
*** forbidden command: sh
rahul:~$ dash
*** forbidden command: dash
rahul:~$ env bash
*** forbidden command: env
rahul:~$ cp /bin/mkdir mycreatedir
*** forbidden path: /bin/mkdir

3
ile allowed = 'all' - ['mkdir'], sadece bashtekrar çalıştırıp kısıtlanamaz mısın?
dawud

3
Sadece sersemletici olmak, özür dilerim, ancak bu listenin getirdiği kısıtlamaları aşmanın birçok yolu var, örneğin dd if=$(which bash) of=my_bash && chmod u+x my_bash && ./my_bash. Bence sorun kısıtlayıcı bir varsayılan politikanın yokluğudur, yani, bu senaryoda varsayılan olarak GRANT izinleri, daha sonra aşağıdaki gibi olması gerektiğinde, listeye dayalı DENY izinleri, bunun tersi durumda: Varsayılan olarak DENY, daha sonra GRANT ilkesine dayalı .
dawud

1
@dawud: İzin verilen komutların bir beyaz listesini tutmanın kara listeye sahip olmaktan ve kullanıcının admin'i zedeleyerek onu engellemeyeceğinden daha iyi bir yaklaşım olduğunu kabul ediyorum.
rahmu

2
@Marco, cevabımda verilen örneği kontrol edin. İzin verilen komutların bir beyaz listesini sağlıyorum ve bu senaryoda, kullanıcı cpPATH ( kullanıcı için rootait dizin rx) için yalnızca bir ikili dosya yapamıyor ve rbashyürütülmesini engelliyor ./executables. Soruna cevap veriyor mu?
dawud

2
@dawud Gerçekten öyle. Salt okunur bin dizinini özledim.
Marco

15

Genelde bu tür kısıtlamaları uygulamamın bir çok koşulu yerine getirmesi gerekir, aksi halde kısıtlamalar kolayca çözülebilir:

  • Kullanıcı wheel, yalnızca yetkili su(PAM aracılığıyla) yetkilendirilen gruba ait değildir .
  • Kullanıcıya rbashbir özel işaret gösteren salt okunur bir PATH ile güvenli bir şekilde verilen ~/binbu ~/bin/dizin basit araçlara bağlantılar içerir:

    $ ll ~/bin
    total 0
    lrwxrwxrwx. 1 root dawud 14 Sep 17 08:58 clear -> /usr/bin/clear*
    lrwxrwxrwx. 1 root dawud  7 Sep 17 08:58 df -> /bin/df*
    lrwxrwxrwx. 1 root dawud 10 Sep 17 08:58 egrep -> /bin/egrep*
    lrwxrwxrwx. 1 root dawud  8 Sep 17 08:58 env -> /bin/env*
    lrwxrwxrwx. 1 root dawud 10 Sep 17 08:58 fgrep -> /bin/fgrep*
    lrwxrwxrwx. 1 root dawud  9 Sep 17 08:58 grep -> /bin/grep*
    lrwxrwxrwx. 1 root dawud 10 Sep 17 08:58 rview -> /bin/rview*
    lrwxrwxrwx. 1 root dawud 13 Sep 17 08:58 rvim -> /usr/bin/rvim*
    lrwxrwxrwx. 1 root dawud 13 Sep 17 08:58 sudo -> /usr/bin/sudo*
    lrwxrwxrwx. 1 root dawud 17 Sep 17 08:58 sudoedit -> /usr/bin/sudoedit*
    lrwxrwxrwx. 1 root dawud 13 Sep 17 08:58 tail -> /usr/bin/tail*
    lrwxrwxrwx. 1 root dawud 11 Sep 17 08:58 wc -> /usr/bin/wc*
    
  • Kullanıcı kısıtlı, salt okunur bir ortam verilir (gibi şeyler düşünmek LESSSECURE, TMOUT, HISTFILEdeğişkenler).

  • kullanıcı SELinux kullanıcısı ile eşleştirilir staff_uve komutların istenildiği gibi diğer kullanıcı olarak çalıştırılmasına izin verilir sudo.
  • kullanıcı var /home, /tmpve muhtemelen /var/tmpyoluyla polyinstantiated edilir /etc/security/namespace.conf:

    /tmp       /tmp/.inst/tmp.inst-$USER-     tmpdir:create   root
    /var/tmp   /tmp/.inst/var-tmp.inst-$USER- tmpdir:create   root
    $HOME      $HOME/$USER.inst/              tmpdir:create   root
    

    Ayrıca, /etc/security/namespace.inittüm iskelet dosyalarını kullanıcı için salt okunur ve aittir root.

Eğer seçebilirsiniz Bu şekilde $USERyürütebileceği mkdironun / onu kendi adına (özel bir bağlantı yoluyla ~/binyoluyla sağlanan dizinde, /etc/skeldiğer kullanıcı adına (via üzerine, yukarıdaki gibi açıklanmıştır) sudohiç) ya da hiçbiri.


4

Sahte bir grup ekleyin, kullanıcıyı bu gruba ekleyin chown root:somegroup /bin/mkdir,, chmod g-x /bin/mkdir. Bunun, kullanıcının gruplarını değiştirememesine bağlı olduğunu unutmayın. IIRC bu GNU / Linux'ta doğrudur, fakat diğer bazı Unices'de geçerli değildir.


2
Çoğu dosya sisteminde daha hassas taneli kontrol için genişletilmiş ACL'ler de kullanabilirsiniz - gereken grup sayısı, adlandırma sorunlarından bahsetmek yerine, (olası kombinasyonlar nedeniyle) kullanıcı sayısıyla birlikte katlanarak artacaktır.
peterph

2
bir nokta daha ekleyin, diğer kullanıcılardan 710 gelen okuma iznini de kaldırın, böylece kullanıcı bu ikili dosyayı kopyalayıp yeniden adlandıramadı, değil mi?
Rahul Patil 17:13

1
@RululPatil evet ve elbette derleyicilerin kullanımlarını da kısıtlamanız gerekiyor.
peterph

1

Test ettiğim en iyisi, Profile.d'yi kullanmanın en iyi ve en güvenli yoludur.

Adım # 1 (Diğer Ad Dosyası Oluşturun)

[root@newrbe ~]# vim /etc/customalias.sh

Aşağıdaki satırları ekle:

alias rm="echo remove contenet is restricted"
alias poweroff="echo Poweroff is restricted"
alias chmod="echo Change Permission is restristed"

Kaydet ve çık

Adım # 2 (Profil yükleyici oluştur)

/etc/profile.d/ bu konum bash işleminin tamamlanması için dosyalar içeriyor

[root@newrbe ~]# vim /etc/profile.d/customsource.sh

Dosyaların altına aşağıdaki satırları ekleyin, bu satırlar aşağıdaki kullanıcılar için belirtilen komutları engeller

if [ `whoami` == "user1" ] && [ `whoami` == "user2" ]; then
    source /etc/customalias.sh
fi

kaydet ve çık

Şimdi çıkın ve yeniden tanımlayın

Saygılar, -Mansur


/etc/profile.d/için değil bashtamamlanmasından değil nerede tipik yüzden, bu giriş kabukları POSIX gibi kullanan kullanıcılar için yer Giriş oturumu özelleştirmeler için nerede bashtakma özelleştirmeler (daha doğrusu gitmek hangi /etc/bash.bashrcnedenle genellikle () gider ve onu bir POSIX kabuk sözdizimi olmalıdır, .bunun yerine arasında sourceve =yerine ==).
Stéphane Chazelas 21:16

-1

sudoers'ı kurun ve orada kimin kullanıcıları ve hangi komutla yapılandırmayı deneyin.


4
SX’e hoş geldiniz. Lütfen cevabınıza ayrıntı ekleyin; OP veya gelecekte bu soruyu okuyan herhangi biri, bunun farkında olmayabilir sudo.
Joseph R.

Bu cevap kesinlikle yanlıştır
kiltek 8:18
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.