Login und su Interna

10

Ich versuche zu verstehen, wie Benutzerberechtigungen unter Linux funktionieren. Der Kernel bootet und startet initals Root, oder? Init führt dann Startskripte aus und führt getty( agetty) erneut als root aus. Agetty liest nur den Benutzernamen und läuft login, glaube ich, immer noch als root. Noch nichts Interessantes. Aber was macht der Login ? Ich konnte nichts Besseres finden als "es versucht sich einzuloggen". Angenommen, die Anmeldung stellt fest, dass das Kennwort übereinstimmt (und wir versuchen, uns wie gewohnt anzumelden). Wie ändert sich die Benutzer-ID? Ich dachte, dass es dafür einen Systemaufruf geben sollte, aber ich konnte ihn nicht finden (vielleicht bin ich nur blind?)


Auch über su. suWenn das Bit 'setuid' gesetzt ist, wird es beim Ausführen immer als root ausgeführt. Wenn wir ihm jedoch mitteilen, dass er sich wie gewohnt anmelden soll, muss die Benutzer-ID erneut geändert werden. Verstehe ich richtig, dass die gleiche "Magie" in suund loginwenn sie den Benutzer wechseln müssen, passiert ? Wenn ja, warum zwei verschiedene Programme? Gibt es zusätzliche ernsthafte Geschäfte, wenn Sie sich anmelden?

Anton Barkovsky
quelle

Antworten:

9

Die Funktionsweise von Anmeldeprogrammen besteht aus mehreren Teilen. Anmeldeprogramme unterscheiden sich darin, wie sie mit dem Benutzer interagieren, der versucht, sich anzumelden. Hier einige Beispiele:

  • login: Liest die Eingabe auf einem Textterminal
  • su: Wird von einem bereits angemeldeten Benutzer aufgerufen und bezieht die meisten Daten aus seinen Befehlszeilenargumenten sowie Authentifizierungsdaten (Kennwort) von einem Terminal
  • gksu: ähnlich su, liest jedoch Authentifizierungsdaten in X.
  • rlogind: Erhält Eingaben über eine TCP-Verbindung über das Protokoll rlogin
  • sshd: Erhält Eingaben über eine TCP-Verbindung über das SSH- Protokoll
  • X-Display-Manager (xdm, gdm, kdm,…): ähnlich login, aber Eingaben auf einem X-Display lesen

Diese Programme funktionieren auf ähnliche Weise.

  1. Der erste Teil ist die Authentifizierung : Das Programm liest einige Eingaben des Benutzers und entscheidet, ob der Benutzer zum Anmelden berechtigt ist. Die herkömmliche Methode besteht darin, einen Benutzernamen und ein Kennwort zu lesen und zu überprüfen, ob der Benutzer in der Benutzerdatenbank und im System erwähnt wird dass das vom Benutzer eingegebene Passwort das in der Datenbank ist. Es gibt aber noch viele andere Möglichkeiten (Einmalpasswörter, biometrische Authentifizierung, Autorisierungsübertragung,…).

  2. Sobald festgestellt wurde, dass der Benutzer berechtigt ist, sich anzumelden und in welchem ​​Konto, erstellt das Anmeldeprogramm die Berechtigung des Benutzers, z. B. zu welchen Gruppen der Benutzer in dieser Sitzung gehört.

  3. Das Anmeldeprogramm überprüft möglicherweise auch Kontobeschränkungen. Beispielsweise kann eine Anmeldezeit oder eine maximale Anzahl angemeldeter Benutzer erzwungen oder bestimmte Benutzer auf bestimmten Verbindungen abgelehnt werden.

  4. Schließlich richtet das Anmeldeprogramm die Sitzung des Benutzers ein. Es gibt mehrere Unterschritte:

    1. Stellen Sie die Prozessberechtigungen auf das ein, was in der Autorisierung festgelegt wurde: Benutzer, Gruppen, Grenzwerte usw. Hier sehen Sie ein einfaches Beispiel für diesen Unterschritt (es werden nur Benutzer und Gruppen behandelt). Die Grundidee ist, dass das Anmeldeprogramm zu diesem Zeitpunkt noch als Root ausgeführt wird, sodass es über maximale Berechtigungen verfügt. Zunächst werden alle Berechtigungen außer dem Root-Benutzer entfernt und schließlich setuidaufgerufen, diese nicht zuletzt Berechtigung zu löschen.
    2. Mounten Sie möglicherweise das Home-Verzeichnis des Benutzers, zeigen Sie die Meldung "Sie haben E-Mail" an usw.
    3. Rufen Sie ein Programm als Benutzer auf, normalerweise die Shell des Benutzers (für loginund suoder sshdwenn kein Befehl angegeben wurde; ein X-Anzeigemanager ruft einen X-Sitzungsmanager oder Fenstermanager auf).

Die meisten Unices verwenden heutzutage PAM (Pluggable Authentication Modules) , um eine einheitliche Methode zur Verwaltung von Anmeldediensten bereitzustellen. PAM unterteilt seine Funktionalität in vier Teile : "auth" umfasst sowohl die Authentifizierung (1 oben) als auch die Autorisierung (2 oben); "Konto" und "Sitzung" sind wie oben 3 und 4; und es gibt auch ein "Passwort", das nicht für Anmeldungen verwendet wird, sondern zum Aktualisieren von Authentifizierungstoken (z. B. Passwörtern).

Gilles 'SO - hör auf böse zu sein'
quelle
4

Die Systemaufrufe, nach denen Sie suchen, heißen Dinge wie setuidund seteuidobwohl es tatsächlich eine ganze Familie von Säumen gibt, hängt es davon ab, welche Varianten der Benutzeridentität Sie ändern möchten.

Es gibt auch parallele Aufrufe setgidzum Ändern der Gruppe, als die ein Prozess ausgeführt wird.

TomH
quelle
4

loginlöscht bei Bedarf Root-Rechte. Viele Programme, die zunächst nur Root-Berechtigungen benötigen, werden als Root gestartet, tun das, was sie tun müssen, und gehen dann zu einem normalen Benutzerkonto, damit sie sich keine Sorgen machen müssen, dass jemand einen Fehler in der Binärdatei verwendet, um Zugriff auf a zu erhalten Wurzelschale. loginNatürlich hält die Privilegien länger, aber das Prinzip ist das gleiche.

Das Löschen von Root-Rechten ist eigentlich ziemlich trivial. POSIX definiert setuid()und setgid()funktioniert, wodurch sich Ihre Benutzer- und Gruppen-IDs ändern (real und effektiv, wenn Sie als Root beginnen). loginruft beide auf und richtet initgroups()möglicherweise zusätzliche Gruppen ein (da dies setgidnur zum Festlegen Ihrer primären Gruppen-ID dient).

Natürlich ist es der Kernel, der die Änderung der UID / GID des Prozesses übernimmt. Wie finde ich die Implementierungen von Linux-Kernel-Systemaufrufen? erklärt viel über Systemaufrufe; In meiner Kernelquelle habe ich:

#define __NR_setgid 144
__SYSCALL(__NR_setgid, sys_setgid)
#define __NR_setuid 146
__SYSCALL(__NR_setuid, sys_setuid)

144 und 146 sind also die Systemrufnummern für diese Funktionen auf meinem Computer


Ich habe die suQuelle nicht überprüft, um zu sehen, was sie tut, aber ich vermute, dass sie auch Root-Berechtigungen direkt vor dem exec()Erstellen einer Shell mit derselben Methode löscht

Michael Mrozek
quelle