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

100 lines
5 KiB
Markdown

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