From 0d6048ae93c6a83e34e678dadac91b7af0c809bb Mon Sep 17 00:00:00 2001 From: mirabilos <thorsten.glaser@teckids.org> Date: Wed, 12 May 2021 02:34:24 +0200 Subject: [PATCH] =?UTF-8?q?design=20for=20the=20next=20round=20of=20change?= =?UTF-8?q?s=20in=E2=80=A6=20well,=20design?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (the current code ended up having to recursively call itself; the NSS functions somehow need to be able to get to the token from having o̲n̲l̲y̲ the numeric uid whereas PAM only has the username) --- TODO | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 TODO diff --git a/TODO b/TODO new file mode 100644 index 0000000..c6ed7c9 --- /dev/null +++ b/TODO @@ -0,0 +1,86 @@ +turns out calling getpw{nam,uid} recursively is not such +a great idea… we need a fixed path (solution 1) or global +state (solution 2, although we cannot do away with a fixed +path by numeric uid totally) after all + +/var/ +- lib/ + - nss-pam-oidc/ + - by-uid/ + - 0 inode 555 + - FFF inode 556 + - 1000 inode 557 + - by-name/ + - root inode 555 root:root 0600 + - foo inode 556 foo:root 0600 + - bar inode 557 bar:root 0600 + +1. Loginversuch +2. PAM-Modul wird geladen +3. PAM-Modul macht HTTP-Request, bekommt erfolgreiche Antwort +4. PAM-Modul legt /var/lib/nss-pam-oidc/by-name/%s an… + open(path, O_RDWR|O_CREAT|O_TRUNC, 0600) + … schreibt das Token rein. +5. PAM-Modul macht setenv("NSS_PAM_OIDC_OVERRIDE", "/var/lib/nss-pam-oidc/by-name/%s"); +6. PAM-Modul macht getpwnam() +7a. NSS-Modul ist nicht im Einsatz, UID wird zurückgegeben +7b. NSS-Modul ist im Einsatz + .1. NSS-Modul wird im PAM-Kontext aufgerufen, läuft also als root + .2. Die Variable NSS_PAM_OIDC_OVERRIDE ist gesetzt, also nimmt er + das Token aus jener Datei (die zu dem Zeitpunkt noch root gehört) + (falls sie existiert, ansonsten das Systemtoken) + .3. NSS-Modul macht Request/Auflösung/usw. mit dem Token aus 7b.2 + .4. NSS-Modul gibt UID (bzw. struct passwd) zurück +8. PAM-Modul macht link("/var/lib/nss-pam-oidc/by-name/%s", "/var/lib/nss-pam-oidc/by-uid/%X") +9. PAM-Modul macht chown("/var/lib/nss-pam-oidc/by-name/%s", numerische uid) +10. User ist eingeloggt, System läuft jetzt als User +11. User macht NSS-Aufruf (wir ignorieren mal Fall Modul wird nicht verwendet) +12. NSS-Modul läuft also als User +13. NSS_PAM_OIDC_OVERRIDE ist nicht gesetzt, also wir das Token + von "/var/lib/nss-pam-oidc/by-uid/%X" geladen (oder halt System) +14. usw. etc. usf. pp. + +Experiment (muß man sehen, ob der State vom NSS-Teil gelesen werden kann): + +1. Loginversuch +2. PAM-Modul wird geladen +3. pam_authenticate startet +4. PAM-Modul macht HTTP-Request, bekommt erfolgreiche Antwort +5. Token wird in globalen State der Library gelegt und dort ein Flag auf 1 gesetzt +6. PAM-Modul macht getpwnam() +7a. NSS-Modul ist nicht im Einsatz, UID wird zurückgegeben +7b. NSS-Modul ist im Einsatz + .1. NSS-Modul wird im PAM-Kontext aufgerufen, läuft also als root + .2. Das Flag ist gesetzt, also wird das Token aus dem globalen State gelesen + .3. NSS-Modul macht Request/Auflösung/usw. mit dem Token aus 7b.2 + .4. NSS-Modul gibt UID (bzw. struct passwd) zurück +8. PAM-Modul merkt sich UID aus Schritt 7 im globalen State +9. pam_authenticate zuende +10. pam_session startet (hier ist z.B. ecryptfs bereits geladen und ~ verfügbar) +11. PAM-Modul droppt temporär die Privilegien +12. PAM-Modul legt Token ins Homeverzeichnis +13. PAM-Modul wird wieder root +14. PAM-Modul legt "/var/lib/nss-pam-oidc/%X" als Symlink auf die Datei im User-Home an +15. pam_session endet +16. User ist eingeloggt, System läuft jetzt als User +17. User macht NSS-Aufruf (wir ignorieren mal Fall Modul wird nicht verwendet) +18. NSS-Modul läuft also als User +19. NSS-Modul lädt Token von "/var/lib/nss-pam-oidc/%X" +20. usw. etc. usf. pp. + +Berechtigungen: + +/var/lib/nss-pam-oidc (dir) user=root group=root mode=0711 +/var/lib/nss-pam-oidc/* (file) user=* group=root mode=0600 + +Stücke an globalem State, die vorzuhalten sind: +• Tokenpuffer, uninitialisiert + ‣ gesetzt durch pam_authenticate + ‣ genutzt durch NSS gdw Flag=1 (zum Holen der UID) + ‣ genutzt durch pam_session (zum Schreiben ins Home) +• Flag „Tokenpuffer gültig?“, auf 0 initialisiert + ‣ gesetzt durch PAM auf 1, nachdem Tokenpuffer gesetzt wurde + ‣ genutzt durch NSS (siehe oben) +• struct passwd-Inhalt für den User, uninitialisiert + ‣ gesetzt durch pam_authenticate + ‣ genutzt durch pam_session (zum Schreiben ins Home und nach /var/lib/…) -- GitLab