smime_unibremen_ldap_exchan.../notes.md
2024-12-04 18:47:47 +01:00

5 KiB

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/<path:path>", 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