100 lines
5 KiB
Markdown
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
|
|
|
|
|