Verhindern Sie, dass alle Befehle als Alias ​​definiert werden

10

Gibt es eine Möglichkeit zu verhindern, dass alle Befehle als Alias ​​definiert werden?

Beispielsweise sollte ein Benutzer rmkeinen anderen Befehl (Ubuntu-Standardbefehle) als Aliasnamen definieren können.

αғsнιη
quelle
Was genau meinst du? Suchen Sie so etwas wie einen "weichen Block", um zu verhindern, dass Sie dies versehentlich tun?
Kos
4
Ich bin mir nicht sicher, wozu das gut ist, selbst wenn es möglich wäre.
Muru
4
Was wäre die Logik dafür? Es hindert einen Benutzer nicht daran, den eigentlichen Befehl einzugeben. Ich sehe also keinen Grund für jemanden, Aliase blockieren zu müssen.
Rinzwind
2
Wie Muru und Rinzwind sagten, worum geht es? Aliase können keine schlimmeren Dinge tun als die Dinge, die ein Benutzer bereits tun darf. Das Blockieren von Aliasen macht das Leben des Benutzers nur schwieriger. Was auch immer die Lösung sein mag (z. B. die Verwendung eines Alias ​​/ einer Funktion zum Überschreiben des integrierten Systems), kann ich mir keine Möglichkeit vorstellen, es für die Benutzer selbst nicht umgehbar zu machen, es sei denn, sie werden gesperrt ~/.bashrc.
Kos
Blockieren Sie nicht alle Aliasnamen, sondern verhindern Sie nur, dass er / sie den Standardbefehlsnamen nicht als Aliasnamen verwendet. Ich weiß, dass wir Aliasnamen auf viele Arten entkommen können, z. B. indem wir \ mit demselben Alias-Befehl verwenden, um den eigentlichen Befehl auszuführen. Das ist alles
αғsнιη

Antworten:

24

Sie können einen Benutzer auf keinen Fall daran hindern, die von ihm bevorzugten Aliase zu definieren. Erwägen:

  1. Sie deaktivieren Aliase in /etc/bash.bashrc. Sie ermöglichen es, wo immer sie wollen.
  2. Sie löschen alle Aliase erwähnt in /etc/bash.bashrc, und alle ~/.bashrcund ~/.bash_aliasesüber ein Skript. Sie legen ihre Aliase in eine andere Datei und beschaffen sie.
  3. Sie führen einen Befehl aus PROMPT_COMMAND, der bestimmte Aliase deaktiviert. Sie definieren neu oder undefinieren PROMPT_COMMAND.
  4. Sie fangen DEBUGAliase ein und definieren sie nicht mehr. Sie entfernen die Falle.
  5. Sie haben alle Dateien aufgerufen, die beim Aufruf von root bezogen wurden. Sie verwenden eine andere Datei und geben sie manuell als ersten Befehl ein, den sie ausführen.
  6. Sie deaktivieren die builtins unset, builtinund enable; macht aliaseine Funktion ; declare -rf aliasum zu verhindern, dass Benutzer die Funktion ändern; und exportieren Sie die Funktion. Sie laufen /bin/bashmit --rcfileund --init-filestarten eine neue Shell, in der die eingebauten Funktionen jetzt aktiviert sind.
  7. ...

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.

muru
quelle
4
Ich hatte allerdings eine lustige Idee: Sie können Alias ​​Alias: =)
Rinzwind
4
Und sie unalias alias.
Muru
4
@ Guru sicher, aber Sie können auch Alias ​​Unalias: +
Rinzwind
8
@Rinzwind und sie rennen \unalias unalias.
Muru
10

TL; DR

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.

Verwenden der Bash Restricted Shell

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

Vorsichtsmaßnahmen

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 bashan 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.

Bessere Entscheidungen

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 -iund cp -iin der /etc/bash.bashrc Datei.

    • In Anbetracht Ihres ursprünglichen Beispiels ist dies wahrscheinlich die sinnvollste Lösung.
    • Sie können dies mit kombinieren, enable -n aliaswenn Sie möchten.
    • Dies hindert sachkundige Benutzer nicht daran, die Aliase zu ändern, kann jedoch ausreichen, um zu verhindern, dass nicht technische Benutzer das tun, worum es Ihnen geht.
  • 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.

CodeGnome
quelle
+1 im Allgemeinen, aber auch speziell, um dies als X / Y-Problem zu klassifizieren.
Joe
5

Dies ist ein ziemlich sinnloses Unterfangen, wie Murus Antwort zeigt. Es gibt zwar einige Optionen, aber sie sind nicht perfekt.

Laut bashHandbuch 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 bashrcDatei beziehen .

Eine andere Idee, mit der ich gespielt habe, ist enableeingebaut. aliasist eine integrierte Shell und bashverfügt über einen netten enableBefehl, 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 bashrceine Option.

Sergiy Kolodyazhnyy
quelle
Nicht alle Alias ​​blockieren, nur eingebaute Befehle, nicht Alias ​​selbst :)
αғsнιη
@ Afshin.Hamedi Nun, was ist ein Standardbefehl? Der, der mit Ubuntu kommt? Das bedeutet, dass Sie eine Liste aller Befehle (Binärdateien) haben müssen, die mit der Standardinstallation geliefert wurden. Jedes Mal, wenn ein Benutzer eine Shell lädt oder versucht, einen Alias ​​zu rmerstellen, 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 :)
Sergiy Kolodyazhnyy
Es ist eine lustige, großartige Frage, die du hast, ich mag es! Selektives Aliasing wäre schön. Aber ich bezweifle, dass es erreichbar ist, es sei denn, Shell-Entwickler finden eine Notwendigkeit für die Implementierung :)
Sergiy Kolodyazhnyy
Die Funktionsidee war nett. Es kam am nächsten.
Muru
0

Sie können (in /etc/profile) eine aufgerufene Funktion definieren, aliasdie 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 aliaseinen Befehl überschreibt, ist eine sehr gute Möglichkeit, sich selbst in den Fuß zu schießen und Verwirrung zu stiften (z. B. Warum wird lsmein Passwort abgefragt?)).

Walzer
quelle