Der ursprüngliche Plan war: * keys.neuro.uni-bremen.de -> OpenPGP * smime.neuro.uni-bremen.de -> S/MIME keys.neuro.uni-bremen.de/sso ist der Keycloak für smime.neuro.uni-bremen.de * /root/keycloakpostgres : Datenbank postgres docker container für KeyCloak server * /root/keycloakserver : Server keycloak docker container * /root/keycloak-network : Infos zur Docker Netzwerk Erstellung * nginx als Proxy mit /etc/nginx/nginx.conf * LDAP 389ds (instance smime) * /etc/dirsrv/slapd-smime * /root/tools_389ds : Hier habe ich ein paar Tools für LDAP Nutzer löschen, ACI Anpassung und so * /certs: SSL Zertifikate Ich musste die CA+RI Kette für den 389ds in Einzelzertifikate aufteilen. :-( * /root/backup/make_backup.sh macht Backup und ist in Cron eintragen * /root/webapp: make_image.sh baut das Image aus dem Dockerfile * /root/webapp/data: Enhält den Quellcode die anderen .sh files steuern den Docker-Container, definiert in der compose.yaml. * /root/webapp/data/flask_session: Ich hatte Probleme dass der Session Cookie zu groß für den Browser war. Daher musste ich auf einen Server-basierten Server Cookie umstellen. Muss / müsste wahrscheinlich in regelmäßigen Abständen geleert werden. * /root/webapp/data/static : Uni-Logo * /root/webapp/data/templates : Template für die Webseite * /root/webapp/data/config.json ist die Config Datei. Wer hätte es gedacht... :-) * /root/webapp/data/run.sh ist wenn man den Container in den entrypoint: ["sh", "-c", "sleep infinity"] also Entwicklungsmodus -- durch die compose.yaml umschaltet, dann per exec.sh in den Container geht und dann manuell den Dienst starten will. -- * /root/webapp/data/wsgi.py: Default wie man die Flask Server App einbettet. * /root/webapp/data/functions/LDAPManager.py : Alles was die LDAP basierte Kommunikation angeht. - _get_connection: Methode zur Erzeugung des Verbindungsobjects (Interne Methode) - _check_for_user: Existiert ein User mit der übergebenen UID? (Interne Methode) - _create_ldap_user: Erzeugt einen Main-User Eintrag für den angemeldeten User (uid, cn, givenName, sn, mail, userSMIMECertificate, userCertificate;binary) (Interne Methode) - update_ldap_user: Zum Update des Main-Nutzers (uid, cn, givenName, sn, mail), wenn der Nutzer nicht vorhanden ist (_check_for_user) wird der Usereintag auto-created (_create_ldap_user) - get_smime_cert: Holt userSMIMECertificate aus dem User zum anzeigen, validaten und eMails extrahieren - set_smime_cert: Nimmt das Zertifikat certificate (Base64 kodiert) -> userSMIMECertificate und cert_post_data (Roh-Text). cert_post_data wird in DER format umgewandelt -> userCertificate;binary. - set_email: Updated die eMail für einen Main-User LDAP Eintrag. - delete_variants: Löscht alle Alias-User eines Main-User base_dn = f"ou=people,dc=smime,dc=uni-bremen,dc=de" search_filter = f'(uid=*{uid}#*)' - create_variant: Erstellt Alias-User eines Main-User-Eintrags um die anderen @uni-bremen.de eMail-Adressen im LDAP abzudecken. Alias: {uid}#{email},ou=people,dc=smime,dc=uni-bremen,dc=de * /root/webapp/data/functions/escape_ldap_string.py: Wird nicht benutzt, weil der 389ds dass schon selber kann. Also @ . und # escapen. Habe ich aber mal aufgehoben für schlechte Zeiten. * /root/webapp/data/functions/validate_smime_certificate.py: Schaut ob das Zertifikat okay ist und extrahiert die ganzen eMail Adressen, für die das Zertifikat erstellt wurde. * /root/webapp/data/functions/get_oidc_configuration.py: Erzeugt einen Teil der Open Connect ID Struktur. * /root/webapp/data/main.py: ``` @app.route("/static/", methods=["GET"]) def serve_static_files(path) -> Response: == Uni Logo == Liefert das Uni Logo aus ``` ``` @app.route("/error") def error_page(): == Error Page == Wenn was schief läuft kann ich jemanden hier hin redirecten. [Bin mir nicht sicher ob ich noch so einen Redirekt drin habe] ``` ``` @app.route("/", methods=["GET", "POST"]) def index_page(): == Hautpseite == ``` * Wenn der Nutzer nicht eingeloggt ist, wird er auf https://smime.neuro.uni-bremen.de/login weitergeleitet. * Wenn eingelogged: 1. Hole given_name, family_name, email (erster mail Eintrag im IdP), uid, email_all (alle eMail Adressen für den User) aus dem IdP 2. Es wir ein LDAP Hautpuser erzeugt bzw. aktualisiert (uid, given_name, family_name, email) falls sich was im IdP geändert hat. 3. [Wenn "POST" also ein neues Zertifikat angeliefert wird -> userSMIMECertificate und userCertificate;binary updaten.] 4. Hole Zertifikat aus userSMIMECertificate 5. Wenn das Zertifikat okay ist, dann werden die eMail Adressen extrahiert (Concatinate: [normal eMail, SAN] => san_emails). 6. Loop durch san_emails: 7. Loop durch alle mail eMail (email_all) vom IdP 8. Erste Überschneidung -> eMail vom Main-User-Eintrag wird entsprechend angepasst; break 9. Weitere Überschneidung -> (Erstes mal in 9., dann alle Alias User löschen), Alias User mit dieser eMail anlegen 10. Infos für die Webseite vorbereiten 11. Webseite rendern und ausliefern