Kinit mit systemd im Benutzermodus

552
Kartik

Ich habe eine keytabDatei unter dem Benutzerverzeichnis erstellt $HOME/client.keytab. Die Authentifizierungs-Cachedatei befindet sich an ihrem Standardspeicherort /tmp/krb5cc_%U(wobei% U die UID ist). Nun habe ich diese einfache systemd unitDatei, um den Dienst zu starten und Authentifizierungsschlüssel zu erhalten:

[Unit] Description=Initializes, caches and renews Kerberos tickets for user After=default.target  [Service] Type=oneshot RemainAfterExit=yes ExecStartPre=/usr/bin/kdestroy -q -c /tmp/krb5cc_%U ExecStart=/usr/bin/kinit -V -l 30d -r 365d -k -t %h/client.keytab -c /tmp/krb5cc_%U %i@EXAMPLE.COM ExecStartPost=/usr/bin/krenew -b -K 60 -k /tmp/krb5cc_%U StandardOutput=syslog StandardError=syslog SyslogIdentifier=KerberosTicketing  [Install] WantedBy=default.target 

Dies funktioniert einwandfrei und erstellt und speichert die Kerberos-Authentifizierungstickets, wenn Afterdarauf verwiesen wird default.target. Warum aber default.target? Das ist ziemlich spät im Bootprozess. Ich hätte lieber, dass es funktioniert multi-user.target, so dass ich die generierten Tickets verwenden kann, um Remote-Dateisysteme von Servern bereitzustellen, die keine öffentliche / private Authentifizierung akzeptieren.

BEARBEITEN : Wenn das Afteralles ist default.targetoder später, kinitschlägt der Fehler fehl kinit: Cannot find KDC for realm "EXAMPLE.COM" while getting initial credentials.

Ich versuche im Grunde Folgendes : SSHFS-Automount über FSTAB mit Kerberos (GSSAPI) .

0

1 Antwort auf die Frage

1
grawity

Bei systemd --user- Geräten beginnt die Zeit. Der gesamte --user-Manager wird zu einem späten Zeitpunkt des Startvorgangs gestartet. Hierbei handelt es sich um einen Systemdienst (Benutzer @ .service), der von systemd-logind gestartet wird. Dieser Dienst wird immer während des späten Startvorgangs gestartet.

Um den Dienst gegen frühere Einheiten (wie remote-fs.target) zu bestellen, müssen Sie diesen in einen Systemdienst konvertieren . Dann können Ihre .mount-Einheiten (oder Ihre fstab-Einträge) auch Abhängigkeiten von Ihrem Dienst angeben.


Beachten Sie, dass WantedBy = nicht definiert, wann Ihre Einheit in die Warteschlange gestellt wird (in gewisser Weise das Gegenteil). Stattdessen wird dies durch die Optionen (implizit und explizit) Before = / After = definiert. Eine Einheit mit "WantedBy = multi-user.target", aber auch "DefaultDependencies = no" und "Before = remote-fs.target" ist durchaus möglich und üblich.


Als Randbemerkung sollten Sie keine Daemons ausführen, z. B. krenew -Küber ExecStartPost =. Der einzige Ort, an dem "offiziell" lang laufende Prozesse möglich sind (und solche Funktionen wie Restart = bereitstellt) ist der Haupt-ExecStart =. Wenn Sie also eine periodische Erneuerung wünschen, setzen Sie die Option krenew -Kdort ein.

Sie können kinit als zweites ExecStartPre = ausführen oder verwenden, k5start -Kwodurch die Notwendigkeit eines manuellen Kinitings vermieden wird.

ExecStart=/usr/bin/k5start -L -b -K 30 -f %h/client.keytab -k /tmp/krb5cc_%U -u %i@EXAMPLE.COM 
Cool! Eigentlich arbeitet meine `systemd`` unit`-Datei mit Ihrem `ExecStart` und` After = multi-user.target` zusammen. So Problem gelöst! Ich habe die `-b`-Flagge von` k5start` verpasst und verbrachte deshalb die ganze Zeit mit der Verfolgungsjagd. Tausend Dank! Kartik vor 5 Jahren 0
** Nach = ** Multi-User.target? Das macht nach Ihrer ursprünglichen Frage keinen Sinn. Dadurch wird der Dienst _later_ als normale Einheiten gestartet (selbst die "späten" Einheiten werden implizit vor diesem Ziel angeordnet). grawity vor 5 Jahren 0
Sie müssen die von Ihnen verwendeten Servicetypen überprüfen. Reguläres `k5start` ist ein langwieriger Vordergrundprozess, der mit` Type = simple` funktioniert hätte. Wenn Sie `k5start -b` verwenden, versucht es, die Daemonisierung durchzuführen, was` Type = forking` erfordert. Keines davon ist kompatibel mit `Type = oneshot` (was für momentane Dienste gilt, die zum Beispiel nur einen schnellen Kinit machen und nichts mehr). grawity vor 5 Jahren 0
Selbst nach der Umwandlung in einen Systemdienst wird der Dienst daher nicht vor "multi-user.target" gestartet. Ich bekomme das KDC nicht gefunden für Bereichsfehler. Deshalb funktioniert es nur mit After-Multi-User-Ziel. Ich weiß nicht was ich hier vermisse. Kartik vor 5 Jahren 0
Wenn ein Netzwerk erforderlich ist, müssen Sie es ** nach dem Dienst bestellen, der das Netzwerk aktiviert. ** (Obwohl die Bestellung nach multi-user.target in einem großen Durchlauf erfolgt, führt dies zu einem weiteren Problem: Alle .mounts werden gestartet lange vor diesem Ziel, also wird Ihr Dienst für sshfs zu spät ausgeführt.) Möglicherweise benötigen Sie `DefaultDependencies = no`,` Before = remote-fs-pre.target`, `After = network-online.target` , `Wants = network-online.target`. (Alle. Beachten Sie, dass das Online-Netzwerk zwischen den einzelnen Distros variiert.) grawity vor 5 Jahren 0
Ja, das habe ich gemacht. Auf Ubuntu deckt `network.target` das gesamte Netzwerk ab. Immer noch keine Würfel. Ich habe `DefaultDependencies` und` Before = remote-fs-pre.target` nicht versucht. Derzeit habe ich die `sshfs` als` bash`-Alias ​​und führe es manuell aus. Kartik vor 5 Jahren 0
Mein Ziel ist es, Kerberos-Tickets beim Systemstart zu haben und ein Remote-Verzeichnis bereitzustellen. Die Kerberos-Tickets werden auch für das SSH in den Cluster mit dem Remote-Speicher verwendet. Der von mir verwendete Desktop wird mit einem anderen Benutzer in meinem Team geteilt. Daher ist es besser, dass ich mich an meinen Benutzerraum halte und nichts global mache. Darüber hinaus muss mein Kollege auch seine eigene Kerberos-Authentifizierung für den Cluster einrichten und auch sein Remote-Arbeitsverzeichnis bereitstellen. Kartik vor 5 Jahren 0
Sie sprachen jedoch über das Einhängen von Dateisystemen vor multi-user.target. Das ist ** bereits global **, da dies nur durch die systemweiten fstab- oder .mount-Units geschieht. Wenn Sie dagegen vorhaben, Ihre Mounts über ~ / .config / systemd / user / sshfs @ .service (nicht-global) auszuführen, hat multi-user.target keinerlei Relevanz und Ihre ursprüngliche Frage nicht Sinn ergeben. grawity vor 5 Jahren 0
Ich glaube, ich möchte so etwas tun. Ich bin jetzt selbst verwirrt. Empfehlen Sie eine Ressource, in der ich mich selbst lesen und erziehen kann? Vielleicht kann ich dann eine bessere Frage stellen. Das Problem, dem ich gegenüberstand, als ich diese Frage schrieb, ist, dass After-default.target sehr spät im Boot-Prozess war. Das ließ nirgendwo einen `sshfs @ .service` zwischen` k5start @ .service` und `default.target`. Jetzt kann ich mit Ihrer Hilfe `After = multi-user.target` verwenden, wodurch Platz für einen` sshfs @ -Service 'vorhanden ist. Danke für den Tipp über 'Type = forking'. Kartik vor 5 Jahren 0
Was meinst du mit "Platz zum Steckplatz"? ** Es gibt keine Slots. ** Wenn Sie zwei Services nach dem gleichen Ziel bestellt haben, bedeutet _ bedeutet nicht, dass es keine interne Bestellung zwischen diesen beiden Services gibt. Sie hätten in Ihrem sshfs-Dienst etwas wie "After = k5start @ .... service" verwenden können, ohne sich um Ziele zu kümmern. Ich denke, Sie stellen sich After als streng vor: "Das wird sofort passieren * ohne Ausnahmen", aber das ist es nicht. Es wird keine verknüpfte Liste erstellt. Es baut einen Abhängigkeitsbaum auf und ist ein bisschen flexibler als Sie denken. grawity vor 5 Jahren 0
Nein, ich habe es versucht. Ich habe einen Fehler, an den ich mich jetzt nicht erinnere. Es wurde jedoch der `sshfs @ .service` gelöscht. Ich meine Slots nicht wörtlich. Ich verstehe den Unterschied zwischen einer verknüpften Liste und einem Abhängigkeitsbaum. Ich weiß nicht, wie flexibel der Baum ist. Das Problem war `k5start @ .service` war nach` default.target` und `sshfs @ .service` hatte` After = k5start.service`, wurde aber von `default.target` in Install gesucht. Ich weiß, dass Dienste von anderen Diensten abhängen können, nicht nur von Zielen. Kartik vor 5 Jahren 0