Gibt es eine Möglichkeit zu verhindern, dass alle Befehle als Alias definiert werden?
Beispielsweise sollte ein Benutzer rm
keinen anderen Befehl (Ubuntu-Standardbefehle) als Aliasnamen definieren können.
~/.bashrc
.
Gibt es eine Möglichkeit zu verhindern, dass alle Befehle als Alias definiert werden?
Beispielsweise sollte ein Benutzer rm
keinen anderen Befehl (Ubuntu-Standardbefehle) als Aliasnamen definieren können.
~/.bashrc
.
Antworten:
Sie können einen Benutzer auf keinen Fall daran hindern, die von ihm bevorzugten Aliase zu definieren. Erwägen:
/etc/bash.bashrc
. Sie ermöglichen es, wo immer sie wollen./etc/bash.bashrc
, und alle ~/.bashrc
und ~/.bash_aliases
über ein Skript. Sie legen ihre Aliase in eine andere Datei und beschaffen sie.PROMPT_COMMAND
, der bestimmte Aliase deaktiviert. Sie definieren neu oder undefinieren PROMPT_COMMAND
.DEBUG
Aliase ein und definieren sie nicht mehr. Sie entfernen die Falle.unset
, builtin
und enable
; macht alias
eine Funktion ; declare -rf alias
um zu verhindern, dass Benutzer die Funktion ändern; und exportieren Sie die Funktion. Sie laufen /bin/bash
mit --rcfile
und --init-file
starten eine neue Shell, in der die eingebauten Funktionen jetzt aktiviert sind.Sie könnten Aliase zur Kompilierungszeit deaktivieren. Dann liegt es an Ihnen, die Bash auf dem neuesten Stand zu halten und sicherzustellen, dass Sie nicht vom nächsten Shellshock betroffen sind. Natürlich könnten die Benutzer ihre eigene Bash erstellen.
unalias alias
.
\unalias unalias
.
Die einzige Möglichkeit, einen Benutzer daran zu hindern, Aliase zu erstellen, besteht darin, ihm eine Shell bereitzustellen, die kein Aliasing unterstützt. Dies ist im Allgemeinen ein X / Y-Problem, bei dem X tatsächlich ein Bedrohungsmodell ist, das mit geeigneten Steuerelementen oder Architekturen gelöst werden sollte, anstatt zu versuchen, das Problem post-facto zu lösen, nachdem einem Benutzer eine Shell auf einem gemeinsam genutzten System zugewiesen wurde.
Im Folgenden gebe ich eine technisch korrekte Antwort sowie eine Anleitung, welche Probleme dadurch gelöst werden und welche nicht. Ich gebe auch einige zusätzliche Anleitungen zu alternativen Kontrollen.
Sie können die eingeschränkte Shell von Bash verwenden, indem Sie rbash als Anmeldeshell des Benutzers zuweisen. Beispielsweise:
foo:x:2001:2001:restricted user:/home/foo:/bin/rbash
Sie müssen dann den für den Benutzer integrierten Alias deaktivieren , vorzugsweise ohne die Shell aller anderen zu beschädigen. Als Beispiel könnten Sie einer Datei wie /etc/profile.d/rbash.sh Folgendes hinzufügen :
# 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
Wenn Sie den Benutzer nicht in ein Chroot-Gefängnis gesteckt oder ihm einen modifizierten PATH zur Verfügung gestellt haben , der keinen Zugriff auf andere Shells enthält, hindert nichts den Benutzer daran, einfach bash
an der Eingabeaufforderung zu tippen und eine uneingeschränkte Shell zu erhalten.
Darüber hinaus verhindert die eingeschränkte Shell aufgrund ihres Designs viele häufige Aktivitäten wie das Ändern von Verzeichnissen:
$ cd /tmp
rbash: cd: restricted
verhindert jedoch nicht, dass andere Skripte oder Programme im PATH dies tun. Das heißt , Sie müssen sorgfältig die Umgebung des Benutzers herstellt, und speziell , dass man sie von der Möglichkeit, zu modifizieren , um zu verhindern , müssen PATH in ihre Startdateien, denn obwohl rbash macht PATH read-only tut sie dies nach der Initialisierung.
Selbst wenn Sie rbash verwenden, müssen Sie dies als Teil eines breiteren Satzes von Steuerelementen tun. Einige Beispiele können sein:
Verhindern , dass nicht-technischer Anwender aus Versehen Aufruf gefährlichen Befehlen durch Standardaliasnamen wie die Bereitstellung rm -i
, mv -i
und cp -i
in der /etc/bash.bashrc Datei.
enable -n alias
wenn Sie möchten.Herkömmliche Unix-Berechtigungen oder POSIX-ACLs zum Schutz von Dateien und Verzeichnissen.
Anmeldungen, die einen einzelnen nicht interaktiven Befehl ausführen. Beispielsweise:
foo:x:2001:2001:run foo.sh:/home/foo:/usr/local/bin/foo.sh
Verwenden Sie erzwungene SSH-Befehle pro Schlüssel. Beispielsweise:
# ~foo/.ssh/authorized_keys
command="/usr/local/bin/foo.sh" [remainder of line]
Verwenden Sie die OpenSSH ForceCommand- Option mit einem bedingten Match-Block.
Verwenden Sie spezielle Werkzeuge wie Gitolite oder Scponly, die für Ihren speziellen Anwendungsfall entwickelt wurden.
Verwenden Sie ein Chroot-Gefängnis .
Verwenden Sie Virtualisierung wie Xen, OpenVZ, LXC, VMware, VirtualBox oder andere Technologien, um eine getrennte Umgebung bereitzustellen.
Sobald Sie Ihr Bedrohungsmodell genau definiert haben, können Sie die am besten geeigneten Steuerelemente für Ihren Anwendungsfall identifizieren. Ohne ein besseres Verständnis dafür, warum Sie Aliasing verhindern möchten (z. B. welches reale Problem löst es?), Können Sie nicht die am besten geeigneten Steuerelemente auswählen.
Dies ist ein ziemlich sinnloses Unterfangen, wie Murus Antwort zeigt. Es gibt zwar einige Optionen, aber sie sind nicht perfekt.
Laut bash
Handbuch haben Funktionen immer Vorrang vor Aliasnamen, daher können wir Folgendes tun:
xieerqi@eagle:~$ function alias { echo "Aliases are no-no" ; }
xieerqi@eagle:~$ alias TEST='rm'
Aliases are no-no
Sie könnten die Funktionsdefinition systemweit einfügen .bashrc
, aber wie muru betonte, finden intelligente Benutzer einen Weg, Aliase zu erhalten, indem sie beispielsweise eine andere bashrc
Datei beziehen .
Eine andere Idee, mit der ich gespielt habe, ist enable
eingebaut.
alias
ist eine integrierte Shell und bash
verfügt über einen netten enable
Befehl, mit dem integrierte Funktionen aktiviert oder deaktiviert werden können. Zum Beispiel deaktiviere ich mich hier 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:~$
Auch hier ist die systemweite Verwendung bashrc
eine Option.
rm
erstellen, wird die Liste überprüft. In Anbetracht der Tatsache, dass die Listen ziemlich groß wären, würde der Start lange dauern, Ihre Benutzer werden sich viel bei Ihnen beschweren und Sie als Systemadministrator hassen :)
Sie können (in /etc/profile
) eine aufgerufene Funktion definieren, alias
die die gewünschte Validierung durchführt (wahrscheinlich mit type -p
) (nachdem "Ubuntu-Standardbefehle" "ausführbare Dateien in $PATH
" sind), bevor Sie das integrierte Programm aufrufen alias
, ABER, wie andere darauf hingewiesen haben, könnten Ihre Benutzer es erhalten darum herum. Warum nicht eine andere Gruppe von Benutzern holen oder sie schulen ("Das Definieren eines Benutzers, der alias
einen Befehl überschreibt, ist eine sehr gute Möglichkeit, sich selbst in den Fuß zu schießen und Verwirrung zu stiften (z. B. Warum wird ls
mein Passwort abgefragt?)).