Czy istnieje sposób, aby zapobiec zdefiniowaniu wszystkich poleceń jako alias?
Na przykład użytkownik nie powinien mieć możliwości zdefiniowania rm
ani żadnego innego polecenia (polecenia domyślne Ubuntu) jako nazwy aliasu.
~/.bashrc
.
Czy istnieje sposób, aby zapobiec zdefiniowaniu wszystkich poleceń jako alias?
Na przykład użytkownik nie powinien mieć możliwości zdefiniowania rm
ani żadnego innego polecenia (polecenia domyślne Ubuntu) jako nazwy aliasu.
~/.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
oraz enable
; 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.
unalias alias
.
\unalias unalias
.
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.
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
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.
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
i cp -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:
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.
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:
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 enable
wbudowany.
alias
jest wbudowaną powłoką i bash
ma ładne enable
polecenie, 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 bashrc
jest tutaj opcją.
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 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 alias
polecenia zastępującego polecenie jest bardzo dobrym sposobem strzelania sobie w stopę i powodowania zamieszania (np. Dlaczego ls
monituje o hasło?))?