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ć:
Wyłączysz aliasy w /etc/bash.bashrc . Umożliwiają to, gdziekolwiek chcą.
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.
Uruchomisz polecenie, PROMPT_COMMANDktóre wyłącza niektóre aliasy. Redefiniują lub nie definiująPROMPT_COMMAND .
Ty łapiesz DEBUG i niezdefiniowane aliasy. Usuwają pułapkę.
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ą.
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.
...
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.
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:
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
fifi
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:
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.
+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ą.
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?))?
~/.bashrc
.Odpowiedzi:
W żaden sposób nie można uniemożliwić użytkownikowi zdefiniowania preferowanych aliasów. Rozważać:
/etc/bash.bashrc
. Umożliwiają to, gdziekolwiek chcą./etc/bash.bashrc
oraz wszystkie~/.bashrc
i~/.bash_aliases
za pomocą skryptu. Umieszczają swoje aliasy w innym pliku i źródłują je.PROMPT_COMMAND
które wyłącza niektóre aliasy. Redefiniują lub nie definiująPROMPT_COMMAND
.DEBUG
i niezdefiniowane aliasy. Usuwają pułapkę.unset
,builtin
orazenable
; wykonaćalias
funkcję ;declare -rf alias
aby uniemożliwić użytkownikom modyfikowanie funkcji; i wyeksportuj funkcję. Działają/bin/bash
z--rcfile
i,--init-file
aby uruchomić nową powłokę, w której wspomniane wbudowane funkcje są teraz włączone.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.
źródło
unalias alias
.\unalias unalias
.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:
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 :
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 pisania
bash
polecenie i uzyskał nieograniczoną powłokę.Ponadto, z założenia ograniczona powłoka zapobiega wielu typowym czynnościom, takim jak zmiana katalogów:
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 -i
icp -i
w /etc/bash.bashrc pliku.enable -n alias
jeśli chcesz.Tradycyjne uprawnienia Unix lub listy ACL POSIX do ochrony plików i katalogów.
Loginy, które wykonują pojedyncze nieinteraktywne polecenie. Na przykład:
Użyj wymuszonych poleceń SSH dla poszczególnych kluczy. Na przykład:
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.
źródło
Jest to dość bezcelowe przedsięwzięcie, jak pokazuje odpowiedź Muru. Ale są pewne opcje, ale nie są one idealne.
Zgodnie z
bash
instrukcją funkcje zawsze mają pierwszeństwo przed aliasami, dlatego możemy wykonać następujące czynności: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
enable
wbudowany.alias
jest wbudowaną powłoką ibash
ma ładneenable
polecenie, które pozwala włączać lub wyłączać wbudowane. Na przykład tutaj wyłączamalias
.Ponownie użycie opcji systemowej
bashrc
jest tutaj opcją.źródło
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 :)Państwo mogli określić (w
/etc/profile
) to funkcja o nazwiealias
, która czyni walidację chcesz (prawdopodobnie za pomocątype -p
) (po wszystkich „Ubuntu poleceń domyślnych” są „wykonywalne w$PATH
”) przed wywołaniem polecenie wbudowanealias
, ale, jak inni zwrócili uwagę, użytkownicy mogli uzyskać wokół tego. Dlaczego nie zdobyć innego zestawu użytkowników ani ich nie edukować („Zdefiniowaniealias
polecenia zastępującego polecenie jest bardzo dobrym sposobem strzelania sobie w stopę i powodowania zamieszania (np. Dlaczegols
monituje o hasło?))?źródło