Verwendung einer nicht standardmäßigen Anmeldeshell für die SSH-Anmeldung

9

Ich arbeite derzeit in einem Netzwerk, das LDAP zur Authentifizierung verwendet. Nachdem zshich mich als Login-Shell festgelegt hatte, stieß ich auf das Problem, Fernzugriff sshauf einen der Computer im Netzwerk zu erhalten, der anscheinend nicht zshinstalliert war. Die Anmeldung schlägt mit fehl

Dec 8 19:16:11 abert sshd[20649]: User sorokine not allowed because shell /bin/zsh does not exist

Die Frage lautet also im Grunde: Wie kann ich den Remotecomputer anweisen, eine andere Anmeldeshell als die in LDAP konfigurierte zu verwenden?

OpenSSH_6.0p1 Debian-4 + deb7u2, OpenSSL 1.0.1e

Sascha
quelle
Haben Sie darüber nachgedacht, Ihre LDAP-Shell in eine universellere zu ändern, z. B. /bin/shIhre Remote- ~/.profileExec die entsprechende Shell, falls verfügbar?
RobertL
Das wäre eine Option, aber keine sehr saubere, also würde ich es lieber vermeiden, wenn es möglich ist.
Sascha

Antworten:

9

Wenn Ihre Anmeldeshell auf einem Computer nicht ausgeführt werden kann, können Sie sich nicht über SSH oder mit den meisten anderen Methoden anmelden. Der SSH-Server führt immer Ihre Anmeldeshell aus. Wenn Sie einen Befehl in der sshBefehlszeile übergeben, wird die Anmeldeshell mit -cund der Befehlszeichenfolge¹ als Argument ausgeführt. Andernfalls wird die Anmeldeshell als Anmeldeshell ohne Argument ausgeführt.

Wenn es eine Möglichkeit gäbe, die Login-Shell zu umgehen, wäre dies eine Sicherheitslücke. Ein Konto kann als eingeschränktes Konto konfiguriert werden, indem seine Anmeldeshell zu einem Programm gemacht wird, das nur eine bestimmte Aufgabe ausführt. Beispielsweise könnte die Anmeldeshell git-shelldarin bestehen, nur den Zugriff auf ein Git-Repository rsshusw. zuzulassen .

Um sich bei diesem Computer anzumelden, müssen Sie entweder dafür sorgen /bin/zsh, dass Sie anwesend sind, oder Ihre Anmeldeshell in etwas ändern, das vorhanden ist.

In einer heterogenen Umgebung wie dieser empfehle ich, mich an /bin/shIhre Login-Shell zu halten, da sie überall vorhanden ist. Stellen Sie die SHELLUmgebungsvariable auf ein, /bin/zshwenn sie vorhanden ist. Auf diese Weise erhalten Sie zsh als interaktive Shell.

if [ -x /bin/zsh ]; then
  export SHELL=/bin/zsh
fi

Auf diese Weise können Sie vermeiden, den Pfad zu fest zu codieren zsh.

if SHELL=$(command -v zsh); then
  export SHELL
else
  unset SHELL
fi

Rufen Sie es von Ihrem auf, damit zsh automatisch für eine Anmeldung im Textmodus ausgeführt wird .profile. Wenn Sie .zprofilezum Einrichten verwenden möchten , machen Sie es zu einer Anmeldeshell (aber dann wird auf Computern, auf denen zsh nicht vorhanden ist, nicht dieselbe Umgebung angezeigt, daher empfehle ich dies nicht). Tun Sie dies nur, wenn dies eine interaktive Anmeldung ist, nicht wenn Ihre .profilevon einem Skript ausgeführt wird, während der Anmeldung im GUI-Modus usw.

if case $- in *i*) true;; *) false;; esac &&  # interactive shell
   [ -z "$ZSH_VERSION" ] &&                   # not running zsh yet
   type zsh >/dev/null 2>/dev/null; then      # zsh is present
  exec zsh
fi

¹ Der SSH-Client verkettet seine Nichtoptionsargumente mit Leerzeichen dazwischen und sendet die resultierende Zeichenfolge über die Verbindung. Die SSH-Protokolle definieren den Befehl als Zeichenfolge, nicht als Liste von Zeichenfolgen.

Gilles 'SO - hör auf böse zu sein'
quelle
Danke für die ausführliche Erklärung. Sieht so aus, als wäre dies der einzige Weg, bei dem zsh nicht auf dem Remote-Computer installiert werden muss, und es funktioniert einwandfrei, also bleibe ich dabei.
Sascha
Ich schlage auch vor, einen Test hinzuzufügen, [ "0$SHLVL" -lt 2 ]falls die Standard-Login-Shell dies unterstützt, $SHLVLdamit bash -lbei Bedarf eine andere Shell ausgeführt werden kann (z. B. falls zsh aus irgendeinem Grund fehlschlägt). Somit ssh -t host bash -lwürde eine bashLogin-Shell ausgeführt, ohne zsh dahinter auszuführen. Außerdem würde ich ersetzen exec zshdurch , exec zsh -lso dass die .zloginDatei stammt.
vinc17
1

Sie müssen die Shell auf dem angegebenen Computer installieren, wenn Sie auf andere Weise Zugriff haben, oder von einem Administrator anfordern, dies für Sie zu tun, oder Ihre Shell in ldap in eine Shell ändern, die auf dem Remotecomputer vorhanden ist.

(offen) sshd wird immer für die Shell - Benutzer überprüfen , und es wird immer diese Schale ausführen , was auch immer passiert ist auszuführen. Wenn eine andere Shell zur Ausführung übergeben wird, wird sie ausgeführt und als Argument an die Benutzer-Shell übergeben. Die Benutzer-Shell lautet beispielsweise '/ bin / sh', und Sie übergeben als Argument eine csh-Shell, die dann "/ bin /" ausführt. sh -c / bin / csh '.

nkms
quelle
Lesen Sie den redfast-Kommentar. Mit openssh können Sie die Standard-Shell umgehen.
Rui F Ribeiro
@Rui F Ribeiro Wenn es so wäre, würde die Logik hinter dem Setzen der Shell auf etwas wie '/ bin / false' oder '/ sbin / nologin' wegfallen. Wenn Sie sich darauf beziehen, die Shell nach dem Login zu ändern, dann ist dies in Ordnung, aber es funktioniert so, wie ich es oben geschrieben habe (sh -c othersh). Wenn es kein '/ bin / sh' gibt, haben Sie kein Glück. (Getestet auf Redhat).
nkms
In der Tat, wenn passwd eine Shell hat, die nicht in / etc / shells aufgeführt ist, werden Sie sich sowieso nicht anmelden. Wenn Sie sich jedoch anmelden können und sshd_config Sie nicht zu einer bestimmten Shell zwingt, ist jeder Befehl, den der Benutzer ausführen kann, ein faires Spiel. Wenn Sie beispielsweise ein paar weitere Tests durchführen, ssh -l user server "ps ax" | grep bashist es leicht zu bemerken, dass die Standard-Shell nicht immer aufgerufen wird. Was es wirklich verhindert, dass die andere Lösung funktioniert, ist die Sicherheitsüberprüfung, dass zsh nicht in / etc / shells ist
Rui F Ribeiro
@Rui F Ribeiro Führen Sie strace -f sshd auf der Serverseite aus. Sie werden so etwas wie "execve (" / bin / bash ", [" bash "," -c "," ps "] ..." sehen. Außerdem ist / sbin / nologin eine gültige Shell in / etc / shells.
nkms
Die Antwort von @RuiFRibeiro redfast00 ist einfach falsch. nkms ist richtig.
Gilles 'SO - hör auf böse zu sein'