log oder schränke den Quellbenutzer von ssh login ein

1

Ist es möglich, den Quellbenutzer eines SSH-Logins zu protokollieren und / oder einzuschränken?

Zum Beispiel:

user1@server1meldet sich an server2als user2.

Auch user3@server1meldet sich an server2als user2.

Mit "Quellbenutzer" meine ich user1oder user3darüber.

Ich möchte nachverfolgen können, von welcher Sitzung user1@server1welche Sitzung initiiert wurde user3@server1.

Der Zweck hierfür ist, dass mehrere Benutzer das user2Konto verwenden, um z. B. Prozesse auf Server2 zu verwalten. (Mir ist klar, dass dies Auswirkungen auf die Sicherheit hat, aber ein Teil dieser Frage besteht darin, das Ausmaß dieser Auswirkungen zu bewerten.)

Wie in der Manpage von erwähnt sshd_config(5), sshdkann der Zugriff auf einen bestimmten Benutzer mit der AllowUsersOption config in eingeschränkt werden sshd_config.

AllowUsers

Diesem Schlüsselwort kann eine Liste von Benutzernamensmustern folgen, die durch Leerzeichen getrennt sind. Wenn angegeben, ist die Anmeldung nur für Benutzernamen zulässig, die mit einem der Muster übereinstimmen. Es sind nur Benutzernamen gültig. Eine numerische Benutzer-ID wird nicht erkannt. Standardmäßig ist die Anmeldung für alle Benutzer zulässig. Wenn das Muster die Form USER @ HOST hat, werden USER und HOST separat geprüft, um die Anmeldung auf bestimmte Benutzer von bestimmten Hosts zu beschränken. Die Anweisungen zum Zulassen / Verweigern werden in der folgenden Reihenfolge verarbeitet: DenyUsers, AllowUsers, DenyGroup und schließlich AllowGroups.

Die USERin der obigen Manpage angegebene Beschreibung scheint jedoch den Benutzernamen auf dem TARGET-Computer zu beschreiben ( server2im Beispiel).

Ich habe dies getestet, indem ich die Option AllowUsers auf gesetzt habe user2@server1und festgestellt, dass ich mich immer noch von user1@server1-> aus anmelden kann user2@server2.

Außerdem scheint das Protokoll keinen Quellbenutzer anzuzeigen.

Dies ist die Anmeldung /var/log/securean RHEL6, nachdem Sie sich von user1@server1-> angemeldet habenuser2@server2

17. November 16:14:59 server2 sshd [28349]: Setzen Sie / proc / self / oom_score_adj auf 0

17. November 16:14:59 server2 sshd [28349]: Verbindung von 10.1.2.3 Port 36508

17. November 16:14:59 server2 sshd [28349]: Passenden RSA-Schlüssel gefunden: aa: bb: cc: dd: ee: ff: gg: ..

17. November 16:14:59 server2 sshd [28350]: Publickey für Benutzer2 von 10.1.2.3 Port 36508 ssh2 verschoben

17. November 16:14:59 server2 sshd [28349]: Passenden RSA-Schlüssel gefunden: aa: bb: cc: dd: ee: ff: gg: ..

17. November 16:14:59 server2 sshd [28349]: Akzeptierte publickey für user2 von 10.1.2.3 Port 36508 ssh2

17. November 16:14:59 server2 sshd [28349]: pam_unix (sshd: session): Session für Benutzer user2 geöffnet von (uid = 0)

17. November 16:14:59 server2 sshd [28349]: Benutzer Kind ist auf PID 28351

Also, gibt es einen Weg zu

(a) Ändern Sie die Protokollierung oder das Verhalten von sshdso, dass der Quellbenutzer, der die SSH-Verbindung herstellt, nachverfolgt wird.

(b) sshd einschränken, um Verbindungen basierend auf dem Quellbenutzer einzuschränken?

hilcharge
quelle
Erfolgen die Anmeldungen bei Server2 (als Benutzer2) mit Kennwörtern oder öffentlichen Schlüsseln? Wenn letzteres der Fall ist, schauen Sie sich das an AUTHORIZED_KEYS FILE FORMATund sehen Sie, ob commandoder ob environmentes Ihnen helfen könnte.
Ikarus

Antworten:

1

Die kurze Antwort lautet "Nein". Der Server akzeptiert aus serverseitiger Sicht alle gültigen Anmeldungen.

Es gibt jedoch einige mögliche Problemumgehungen, um das zu erreichen, was Sie möchten. Testen Sie, ob das Folgende Ihren Anforderungen entspricht.

Beachten Sie, dass dies für "durchschnittliche" Benutzer ausreichend sein kann und erfordert, dass Sie auch die Clients steuern. Erfahrene Benutzer finden eine Möglichkeit, die CLIENTUSERunten verwendete Variable zu fälschen .

Wenn Sie die AcceptEnvDirektive in verwenden /etc/ssh/sshd_config, können Sie beispielsweise eine Variable namens CLIENTUSER akzeptieren:

AcceptEnv CLIENTUSER

Der nächste Schritt besteht darin, den Login-Befehl des Benutzers zu einer Login-Shell wie folgt zu zwingen:

ForceCommand /bin/bash -l

Starten Sie Ihren sshd-Dienst neu und fügen Sie Folgendes zu / etc / profile hinzu

if [ -z "$CLIENTUSER" ] || [ "$CLIENTUSER" != "user3" ] && [ ! -z "$SSH_CLIENT" ]
then
       echo 'Client logon not allowed'
       logout
fi

Mit dem obigen Befehl wird jeder Client abgemeldet, der die CLIENTUSERVariable nicht sendet oder die CLIENTUSERVariable mit einem anderen Wert als sendet user3.

Sie können dies mit der folgenden Clientbefehlszeile testen:

$ ssh user2@host
Client logon not allowed

$ CLIENTUSER=user3 ssh -o "SendEnv CLIENTUSER" user2@host
user2@host $

Wie Sie sehen können, CLIENTUSERkann das einfach über die Kommandozeile gefälscht werden. Um dies zu verhindern, können Sie dem Client `/ etc / profile Folgendes hinzufügen :

declare -r CLIENTUSER="$USER"

Wenn der Benutzer versucht, den Wert der CLIENTUSERVariablen zu ändern, wird der folgende Fehler angezeigt:

bash: CLIENTUSER: readonly variable
Lambert
quelle
+1 speziell für die kurze Antwort von nein. Ich verstehe, was Sie mit der Verwendung der Umgebungsvariablen meinen, obwohl ich die schreibgeschützte Variable umgangen habe, indem ich nach der ersten Anmeldung auf dem Quellcomputer einfach ksheine neue bashInstanz oder eine neue Instanz verwendet habe server1.
Hilcharge
@hilcharge, du hast recht. Deshalb habe ich den Hinweis über die Problemumgehung gesetzt.
Lambert