Zablokuj określone polecenie w systemie Linux dla określonego użytkownika


27

Jak zablokować polecenie, powiedzmy mkdirdla konkretnego użytkownika?

To, co właśnie stworzyłem, stworzyłem funkcję tylko do odczytu i przechowuję w profilu użytkownika ~/.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

Test:

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

Więc moje pytanie brzmi: jaki powinien być sposób na osiągnięcie tego? czy jest na to jakieś narzędzie?

Aktualizacja 1 # Ale jeśli użytkownik jest inteligentny, może skopiować plik binarny mkdir, zmienić jego nazwę i użyć go. Jak to osiągnąć?


7
Twój przykład się nie powiedzie, ponieważ użytkownik może skompilować swój własny mkdiri zmienić jego nazwę, a nawet po prostu skopiować i zmienić nazwę istniejącego pliku binarnego. Ponadto istnieje wbudowana powłoka do zastępowania aliasów i funkcji.
strugee

hmm to prawda, więc czy tak w ogóle jest?
Rahul Patil

także użytkownik nie musi się kompilować, może łatwo skopiować, cp /bin/mkdir mkdir2a następnie użyć go :(
Rahul Patil

Utworzenie katalogu jest tak powszechnym / podstawowym zadaniem, że istnieje wiele sposobów na zrobienie tego i prawie niemożliwe byłoby ich zablokowanie (z wyjątkiem niedopuszczenia do utworzenia przez użytkownika plików, tj. Ochrony przed zapisem wszystkich katalogów). Na przykład cp -r /usr/local/lib gggutworzy katalog o nazwie ggg(zawierający kopię ewentualnej zawartości /usr/local/lib, którą użytkownik może po prostu usunąć). Możesz użyć, find / -type d -emptyaby znaleźć pusty katalog do skopiowania.
G-Man mówi „Przywróć Monikę”

Odpowiedzi:


21

Nie wiem, jak to zrobić za pomocą bash, ale znam inną powłokę, która ogranicza środowisko użytkownika: lshell (ograniczona powłoka) .

Szybki przegląd konfiguracji

Lshell jest konfigurowany za pomocą pliku INI. Domyślnie przechowuje białą listę dozwolonych poleceń, ale można go łatwo skonfigurować, aby uniemożliwić użytkownikowi użycie określonej komendy.

Ta konfiguracja (domyślna konfiguracja /etc/lshell.conf) zabrania użytkownikowi fooużywania mkdir:

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

Aby skonfigurować konto użytkownika do domyślnego używania lshell, musisz:

 chsh -s /usr/bin/lshell foo

Lshell może zrobić więcej:

  • 3 poziomy szczegółowości: użytkownik, grupa, wszystkie.
  • Może ograniczyć dostęp do niektórych ścieżek w systemie.
  • Może ograniczyć użycie niektórych znaków (jak |).
  • Może ograniczyć użycie niektórych poleceń tylko przez SSH.

I więcej.

Aktualizacja 1 # Dodano wynik testu:

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
z allowed = 'all' - ['mkdir'], czy nie możesz po prostu wykonać bashi znów być nieograniczonym?
dawud

3
Po prostu pedantyczny, przepraszam, ale wciąż istnieje wiele sposobów na obejście ograniczeń nałożonych przez tę listę, np dd if=$(which bash) of=my_bash && chmod u+x my_bash && ./my_bash. Myślę, że problemem jest brak restrykcyjnej domyślnej polityki, tzn. W tym scenariuszu domyślnie UDZIELAJ uprawnień, następnie ODMÓW na podstawie listy, kiedy powinno być na odwrót: domyślnie ODMÓW, a następnie GRANT na podstawie zasad .
dawud

1
@dawud: Zgadzam się, że utrzymywanie białej listy dozwolonych poleceń jest lepszym podejściem niż posiadanie czarnej listy i mam nadzieję, że użytkownik nie obejdzie tego przez sprytne administrowanie.
rahmu

2
@Marco, sprawdź przykład podany w mojej odpowiedzi. Podaję białą listę dozwolonych poleceń, aw tym scenariuszu użytkownik nie może po prostu cpzapisać pliku binarnego do swojej PATH ( rootkatalog rxużytkownika dla użytkownika) i rbashuniemożliwia wykonanie ./executables. Czy to odpowiada na twoje pytanie?
dawud

2
@dawud Tak, rzeczywiście. Brakowało mi katalogu bin tylko do odczytu.
Marco

15

Sposób, w jaki zwykle wdrażam tego rodzaju ograniczenia, wymaga spełnienia kilku warunków, w przeciwnym razie ograniczenie można łatwo obejść:

  • Użytkownik nie należy do wheelgrupy, która jest jedyną osobą upoważnioną do korzystania su(wymuszoną przez PAM).
  • Użytkownik otrzymuje odpowiednio zabezpieczoną rbashPATH tylko do odczytu wskazującą na prywatną ~/bin, ten ~/bin/katalog zawiera linki do prostych narzędzi:

    $ 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*
    
  • użytkownik otrzymuje ograniczoną, tylko do odczytu środowiska (myślę o takich rzeczach LESSSECURE, TMOUT, HISTFILEzmiennych).

  • użytkownik jest mapowany na użytkownika SELinux staff_ui otrzymuje uprawnienia do wykonywania poleceń tak jak inny użytkownik zgodnie z wymaganiami za pośrednictwem sudo.
  • użytkownik i możliwe /home, /tmpże /var/tmpjest on polinstantified poprzez /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
    

    Ponadto /etc/security/namespace.initsprawia , że wszystkie pliki szkieletowe są tylko dla użytkownika i są własnością root.

W ten sposób możesz wybrać, czy $USERmożesz wykonać mkdirwe własnym imieniu (poprzez link w prywatnym ~/binkatalogu, udostępniony przez /etc/skel, jak wyjaśniono powyżej), w imieniu innego użytkownika (przez sudo), czy w ogóle.


4

Dodaj grupę obojętne, dodać użytkownika do tej grupy chown root:somegroup /bin/mkdir, chmod g-x /bin/mkdir. Pamiętaj, że zależy to od tego, że użytkownik nie będzie mógł modyfikować swoich grup. IIRC jest to prawdą w GNU / Linux, ale nie w niektórych innych Uniksach.


2
W większości systemów plików można również używać rozszerzonych list ACL do dokładniejszej kontroli - liczba potrzebnych grup rośnie wykładniczo wraz z liczbą użytkowników (z powodu możliwych kombinacji), nie wspominając już o problemach z nazewnictwem.
peterph

2
dodaj jeszcze jeden punkt, usuń także uprawnienia do odczytu od innych użytkowników 710, aby użytkownik nie mógł skopiować i zmienić nazwy tego pliku binarnego, prawda?
Rahul Patil

1
@RahulPatil tak, i oczywiście musisz również ograniczyć ich użycie kompilatora.
peterph

1

Najlepsze, co przetestowałem, to użycie Profile.d najlepszy i najbezpieczniejszy sposób

Krok # 1 (Utwórz plik aliasu)

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

Dodaj poniższe linie:

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

Zapisz i wyjdź

Krok # 2 (Utwórz moduł ładujący profil)

/etc/profile.d/ ta lokalizacja zawiera pliki do ukończenia bash

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

Dodaj poniżej wierszy pod plikami te wiersze będą blokować wspomniane polecenia dla poniższych użytkowników

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

Zapisz i wyjdź

Teraz wyjdź i zaloguj się ponownie

Pozdrawiam, Manur


/etc/profile.d/nie jest do bashukończenia , jest to miejsce, w którym należy umieścić dostosowania sesji logowania dla użytkowników korzystających z powłok logowania podobnych do POSIX, więc zazwyczaj nie jest to miejsce, w którym bashidą dostosowania aliasu (które wolą wejść /etc/bash.bashrc) i powinna mieć składnię powłoki POSIX (tak zazwyczaj .zamiast tego z sourcei =zamiast ==).
Stéphane Chazelas 21.04.16

-1

zainstaluj sudoers i spróbuj skonfigurować tam, czyich użytkowników i jakie polecenie.


4
Witamy w SX. Dodaj szczegóły do ​​swojej odpowiedzi; OP lub ktoś inny czytający to pytanie w przyszłości może nie być tego świadomy sudo.
Joseph R.

Ta odpowiedź jest po prostu błędna
kiltek
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.