Welche Schritte durchläuft das System beim Umgang mit einer SSH-Verbindung?

9

Welche Schritte durchläuft das System beim Umgang mit einer SSH-Verbindung?

  1. Wir versuchen uns über ssh einzuloggen
  2. sshd Startet pam und pam module, um uns zu authentifizieren
  3. Abhängig von der Pam-Konfiguration müssen wir Benutzername und Passwort angeben (Pam-Checks passwdund shadow-Dateien).
  4. pam prüft hosts.allow/deny, /etc/shellsund andere Dinge
  5. Wenn alles gut geht, sind wir eingeloggt
  6. ???
  7. Shell wird gestartet

Meine Frage ist also, welcher Mechanismus dafür verantwortlich ist, zu überprüfen, welche Shell dem Benutzer in seiner passwdDatei zugewiesen ist (in Schritt 6). Ist es Pam selbst, ein bestimmtes Pam-Modul sshdoder etwas anderes? Ich weiß, dass ich die passwdDatei (zum Überprüfen von Benutzername und Passwort) durch Schreiben eines Pam-Moduls ersetzen kann, aber wie kann ich die passwdDatei für den Shell-Eintrag ersetzen ?

pbm
quelle

Antworten:

8

Soweit ich weiß, bestimmt PAM nicht die Shell des Benutzers, dies bleibt der Anwendung überlassen. Die Sitzungsmodule von PAM führen allgemeine Aktionen und Überprüfungen aus, die bei jeder Anmeldung mit diesem bestimmten Dienst durchgeführt werden müssen. Wenn die Anwendung dann eine Shell starten möchte, ist dies kostenlos und schlägt die Shell normalerweise in der Benutzerdatenbank nach.

Angenommen, Ihre Frage bezieht sich auf OpenSSH , dann ist es genau das, was es tut: Sobald der Benutzer authentifiziert ist und die PAM-Sitzung abgeschlossen ist (sofern für die Verwendung von PAM¹ konfiguriert), sucht der SSH-Server die Shell in der Benutzerdatenbank (direkt, nicht) durch die PAM-Bibliothek).

Die Benutzerdatenbank ist nicht auf /usr/passwdund Freunde beschränkt. Unter Linux (von dem ich annehme, dass Sie es verwenden, seit Sie es erwähnt haben shadow) wird die Zusammensetzung der Benutzerdatenbank durch die passwdEinstellung in bestimmt /etc/nsswitch.conf. In Setups mit mehreren Computern werden NIS und LDAP häufig zur lokalen Datenbank hinzugefügt . Wenn Sie eine Shell verwenden möchten, in der /etc/passwddies nicht der Fall ist , müssen Sie diese möglicherweise konfigurieren (obwohl dies etwas seltsam wäre und die Leute möglicherweise bessere Vorschläge machen können, wenn Sie uns mitteilen, was Sie erreichen möchten).

Wenn Sie Benutzer ohne vollständigen Shell-Zugriff haben möchten, besteht die natürliche Lösung /etc/passwddarin, eine eingeschränkte Shell zu verwenden - möglicherweise rssh , um nur wenige Anwendungen vom Typ Dateikopie wie scp, rsync und cvs zuzulassen. Sie können auch erzwungene Befehle in der Benutzerdatei ~/.ssh/authorized_keysverwenden .

Wenn Sie sehen möchten, was der SSH-Server tut, starten Sie den Daemon als ssh -ddd. Sie können auch die Ansicht des Clients abrufen ssh -vvv, wobei Sie hier die Ansicht des Servers am meisten interessieren.

¹ OpenSSH verwendet PAM nur, wenn es mit PAM-Unterstützung konfiguriert ist und die UsePAMDirektive auf yesin gesetzt ist sshd_config. Selbst wenn PAM verwendet wird, bietet es neben PAM auch andere Authentifizierungsmethoden. Insbesondere erfolgt die Authentifizierung mit öffentlichem Schlüssel nicht über PAM.

Gilles 'SO - hör auf böse zu sein'
quelle
Ich möchte Benutzern meiner Anwendung ermöglichen, sich als normaler Benutzer bei der Shell anzumelden, ohne ein Konto im System zu erstellen. Benutzerdaten (Benutzername, Pass und Shell) werden in sqlite db gespeichert. Der erste Schritt ist das SQLite-Pam-Modul, mit dem Benutzer gegen DB authentifiziert werden. Der zweite Schritt besteht darin, eine aus der Datenbank gelesene Shell bereitzustellen. Ich denke, es könnte durch das Schreiben eines geeigneten nis-Moduls erreicht werden. Danke für die Antwort ...
pbm
@pbm: Ich glaube nicht , Sie wollen nis, eher db(oder vielleicht ein benutzerdefiniertes Modul).
Gilles 'SO - hör auf böse zu sein'
Es ist Tippfehler. Ich meinte "indem ich das richtige (benutzerdefinierte) NSS-Modul schreibe" ...
pbm