Zapobiegaj definiowaniu wszystkich poleceń jako alias

10

Czy istnieje sposób, aby zapobiec zdefiniowaniu wszystkich poleceń jako alias?

Na przykład użytkownik nie powinien mieć możliwości zdefiniowania rmani żadnego innego polecenia (polecenia domyślne Ubuntu) jako nazwy aliasu.

αғsнιη
źródło
Co miałeś dokładnie na myśli? Szukasz czegoś w rodzaju „miękkiego bloku”, aby zapobiec przypadkowemu wykonaniu tego?
Kos
4
Nie jestem pewien, po co to robić, nawet jeśli byłoby to możliwe.
muru
4
jaka byłaby logika tego? Nie uniemożliwia to użytkownikowi wpisania rzeczywistego polecenia ... więc nie widzę powodu, aby ktokolwiek musiał blokować aliasy?
Rinzwind
2
Jak powiedzieli Muru i Rinzwind, o co chodzi? Aliasy nie mogą robić paskudniejszych rzeczy niż te, które użytkownik może już robić, blokowanie aliasów tylko utrudnia życie użytkownika. Niezależnie od tego, jakie byłoby rozwiązanie (np. Użycie aliasu / funkcji w celu zastąpienia wbudowanego), nie mogę wymyślić sposobu, aby uniemożliwić obejście go przez samych użytkowników, chyba że przez ich zablokowanie ~/.bashrc.
Kos
Nie blokując wszystkich aliasów, tylko zapobiegaj, aby nie używał domyślnej nazwy poleceń jako nazwy aliasu. Wiem, że możemy uciec przed aliasami na wiele sposobów, na przykład używając \ tego samego polecenia aliasu do uruchomienia rzeczywistego polecenia. To wszystko
αғsнιη

Odpowiedzi:

24

W żaden sposób nie można uniemożliwić użytkownikowi zdefiniowania preferowanych aliasów. Rozważać:

  1. Wyłączysz aliasy w /etc/bash.bashrc . Umożliwiają to, gdziekolwiek chcą.
  2. Usuwasz wszystkie wzmianki o aliasach w /etc/bash.bashrcoraz wszystkie ~/.bashrci~/.bash_aliases za pomocą skryptu. Umieszczają swoje aliasy w innym pliku i źródłują je.
  3. Uruchomisz polecenie, PROMPT_COMMANDktóre wyłącza niektóre aliasy. Redefiniują lub nie definiująPROMPT_COMMAND .
  4. Ty łapiesz DEBUG i niezdefiniowane aliasy. Usuwają pułapkę.
  5. Przeglądałeś wszystkie pliki pozyskane przy wywołaniu do rootowania. Używają innego pliku i źródło go ręcznie jako pierwsze polecenie, które uruchamiają.
  6. Wyłączyć przy pomocy poleceń wbudowanych unset, builtinoraz enable; wykonać aliasfunkcję ; declare -rf aliasaby uniemożliwić użytkownikom modyfikowanie funkcji; i wyeksportuj funkcję. Działają /bin/bashz --rcfilei, --init-fileaby uruchomić nową powłokę, w której wspomniane wbudowane funkcje są teraz włączone.
  7. ...

Możesz wyłączyć aliasy w czasie kompilacji, wtedy to od Ciebie zależy, czy będziesz aktualizować Bash i upewnić się, że nie będzie to miało wpływu na następną Shellshock. Oczywiście użytkownicy mogliby zbudować własne bash.

muru
źródło
4
Miałem trochę zabawny pomysł: możesz alias alias: =)
Rinzwind
4
I oni unalias alias.
muru
4
@muru pewnie, ale możesz też pseudonim unalias: +
Rinzwind
8
@Rinzwind i biegną \unalias unalias.
muru
10

TL; DR

Jedynym sposobem, aby uniemożliwić użytkownikowi tworzenie aliasów, jest zapewnienie im powłoki, która nie obsługuje aliasingu. Jest to na ogół problem X / Y, gdzie X jest tak naprawdę modelem zagrożenia, który powinien zostać rozwiązany za pomocą odpowiednich mechanizmów kontrolnych lub architektur zamiast próbować rozwiązać problem post facto po tym, jak użytkownik otrzyma powłokę we wspólnym systemie.

Poniżej podam technicznie poprawną odpowiedź, a także wskazówki dotyczące tego, jakie problemy to rozwiąże i nie rozwiąże. Zapewniam również dodatkowe wytyczne dotyczące alternatywnych kontroli.

Korzystanie z Powłoki Ograniczonej Bash

Możesz użyć ograniczonej powłoki Basha, przypisując rbash jako powłokę logowania użytkownika. Na przykład:

foo:x:2001:2001:restricted user:/home/foo:/bin/rbash

Następnie należy wyłączyć wbudowany alias dla użytkownika, najlepiej bez naruszania powłoki innych osób. Na przykład możesz dodać następujące elementy do pliku, takiego jak /etc/profile.d/rbash.sh :

# Limit effect to users in a specific UID range.
if ((UID >= 2000)) && ((UID < 3000)); then
    # Check shell options; disable alias builtins when shell is restricted.
    if [[ $- =~ r ]]; then
        enable -n alias
        enable -n unalias
    fi
fi

Ostrzeżenia

O ile nie umieścisz użytkownika w więzieniu chroot lub nie dostarczysz mu zmodyfikowanej ścieżki , która nie obejmuje dostępu do innych powłok, nic nie powstrzyma użytkownika od zwykłego pisaniabash polecenie i uzyskał nieograniczoną powłokę.

Ponadto, z założenia ograniczona powłoka zapobiega wielu typowym czynnościom, takim jak zmiana katalogów:

$ cd /tmp
rbash: cd: restricted

ale nie uniemożliwia tego innym skryptom lub programom w ścieżce . Oznacza to, że musisz starannie stworzyć środowisko użytkownika, a zwłaszcza, że ​​musisz uniemożliwić mu modyfikację ŚCIEŻKI w plikach startowych, ponieważ nawet jeśli rbash sprawia, że ŚCIEŻKA tylko do odczytu robi to po inicjalizacji.

Lepsze wybory

Nawet jeśli używasz rbash, musisz to zrobić jako część szerszego zestawu kontrolek. Niektóre przykłady mogą obejmować:

  • Uniemożliwić użytkownikom nietechnicznym z przypadkowo powołując niebezpiecznych poleceń poprzez dostarczanie aliasy domyślnych, takich jak rm -i, mv -ii cp -iw /etc/bash.bashrc pliku.

    • Biorąc pod uwagę twój oryginalny przykład, jest to prawdopodobnie najbardziej sensowne rozwiązanie.
    • Możesz to połączyć, enable -n aliasjeśli chcesz.
    • Nie uniemożliwi to znanym użytkownikom zmiany aliasów, ale może to wystarczyć, aby użytkownicy nietechniczni nie robili tego, o co się martwisz.
  • Tradycyjne uprawnienia Unix lub listy ACL POSIX do ochrony plików i katalogów.

  • Loginy, które wykonują pojedyncze nieinteraktywne polecenie. Na przykład:

    foo:x:2001:2001:run foo.sh:/home/foo:/usr/local/bin/foo.sh
  • Użyj wymuszonych poleceń SSH dla poszczególnych kluczy. Na przykład:

    # ~foo/.ssh/authorized_keys
    command="/usr/local/bin/foo.sh" [remainder of line]
  • Użyj opcji OpenSSH ForceCommand z blokiem warunkowego dopasowania.

  • Używaj specjalnych narzędzi, takich jak gitolite lub scponly, przeznaczonych do konkretnego zastosowania.

  • Użyj więzienia chroot .

  • Użyj wirtualizacji, takiej jak Xen, OpenVZ, LXC, VMware, VirtualBox lub innych technologii, aby zapewnić oddzielne środowisko.

Po dokładnym zdefiniowaniu modelu zagrożenia można zidentyfikować najbardziej odpowiednie elementy sterujące dla danego przypadku użycia. Bez dokładniejszego zrozumienia, dlaczego chcesz zapobiec aliasingowi (np. Jaki problem rozwiązuje w świecie rzeczywistym), nie możesz wybrać najbardziej odpowiednich elementów sterujących.

CodeGnome
źródło
+1 ogólnie, ale także specjalnie w celu sklasyfikowania tego jako problemu X / Y.
Joe
5

Jest to dość bezcelowe przedsięwzięcie, jak pokazuje odpowiedź Muru. Ale są pewne opcje, ale nie są one idealne.

Zgodnie z bashinstrukcją funkcje zawsze mają pierwszeństwo przed aliasami, dlatego możemy wykonać następujące czynności:

xieerqi@eagle:~$ function alias { echo "Aliases are no-no" ; }
xieerqi@eagle:~$ alias TEST='rm'
Aliases are no-no

Możesz umieścić definicję funkcji w całym systemie .bashrc, jednak, jak zauważył Muru, sprytni użytkownicy znajdą sposób na uzyskanie aliasu poprzez pozyskanie innegobashrc , na przykład pliku.

Innym pomysłem, w który grałem, jest enablewbudowany. aliasjest wbudowaną powłoką i bashma ładne enablepolecenie, które pozwala włączać lub wyłączać wbudowane. Na przykład tutaj wyłączam alias.

xieerqi@eagle:~$ enable -n alias
xieerqi@eagle:~$ alias
No command 'alias' found, did you mean:
 Command '0alias' from package 'zeroinstall-injector' (universe)
alias: command not found
xieerqi@eagle:~$ alias TEST='rm'
No command 'alias' found, did you mean:
 Command '0alias' from package 'zeroinstall-injector' (universe)
alias: command not found
xieerqi@eagle:~$ enable alias
xieerqi@eagle:~$ alias
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias ls='ls --color=auto'
xieerqi@eagle:~$ 

Ponownie użycie opcji systemowej bashrcjest tutaj opcją.

Sergiy Kolodyazhnyy
źródło
Nie blokuje wszystkich aliasów, tylko wbudowane polecenia, a nie sam alias :)
αғsнιη
@ Afshin.Hamedi Co to jest polecenie domyślne? Ten, który jest dostarczany z Ubuntu? Oznacza to, że musisz mieć listę wszystkich poleceń (plików binarnych), które były dostarczane z domyślną instalacją. Następnie za każdym razem, gdy użytkownik ładuje powłokę lub próbuje aliasu coś rm, sprawdza listę. Biorąc pod uwagę, że listy byłyby dość duże, uruchomienie zajęłoby dużo czasu, użytkownicy będą narzekać na ciebie i będą cię nienawidzić jako administrator systemu :)
Sergiy Kolodyazhnyy
Masz fajne, niesamowite pytanie, podoba mi się! Selektywne aliasing byłoby fajne. Ale wątpię, czy jest to osiągalne, chyba że deweloperzy powłoki uznają, że trzeba go zaimplementować :)
Sergiy Kolodyazhnyy
Pomysł funkcji był miły. Przyszło najbliżej.
muru
0

Państwo mogli określić (w /etc/profile) to funkcja o nazwie alias, która czyni walidację chcesz (prawdopodobnie za pomocą type -p) (po wszystkich „Ubuntu poleceń domyślnych” są „wykonywalne w $PATH”) przed wywołaniem polecenie wbudowane alias, ale, jak inni zwrócili uwagę, użytkownicy mogli uzyskać wokół tego. Dlaczego nie zdobyć innego zestawu użytkowników ani ich nie edukować („Zdefiniowanie aliaspolecenia zastępującego polecenie jest bardzo dobrym sposobem strzelania sobie w stopę i powodowania zamieszania (np. Dlaczego lsmonituje o hasło?))?

waltinator
źródło