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:
- Hole given_name, family_name, email (erster mail Eintrag im IdP), uid, email_all (alle eMail Adressen für den User) aus dem IdP
- Es wir ein LDAP Hautpuser erzeugt bzw. aktualisiert (uid, given_name, family_name, email) falls sich was im IdP geändert hat.
- [Wenn "POST" also ein neues Zertifikat angeliefert wird -> userSMIMECertificate und userCertificate;binary updaten.]
- Hole Zertifikat aus userSMIMECertificate
- Wenn das Zertifikat okay ist, dann werden die eMail Adressen extrahiert (Concatinate: [normal eMail, SAN] => san_emails).
- Loop durch san_emails:
- Loop durch alle mail eMail (email_all) vom IdP
-
Erste Überschneidung -> eMail vom Main-User-Eintrag wird entsprechend angepasst; break
-
Weitere Überschneidung -> (Erstes mal in 9., dann alle Alias User löschen), Alias User mit dieser eMail anlegen
- Infos für die Webseite vorbereiten
- Webseite rendern und ausliefern