Hallo Heiko,
Heiko Schlittermann (Sun, Feb 14, 2021 at 10:55:08PM +0100):
bert schulze bs@bescit.de (So 14 Feb 2021 09:12:18 CET):
Na, aber es wäre ja trotzdem denkbar, dass diese Libraries auch die Configfiles lesen, wenn sie vorhanden sind. Noch weiss ich nicht, ob ich das eher gut oder schlecht finden sollte.
Denke ich eher nicht. (Ich bin ein Freund die Dienste sauber zu trennen, bei mir läuft der Exim in einem LXC Container der mit debootstrap --varaint minbase installiert ist und in der apt.conf sowohl Recommends, als auch Suggests deaktiviert. Kann mir nicht vorstellen dort einen SQL Client zu installieren).
Bei LDAP, wo die Client-Libraries, die der Exim verwendet, dann _anscheinend_ auch gerne mal in der `ldap.conf` nachsehen (ohne das das im Exim explizit erwähnt würde), hat es mich schon geärgert, dass so magische-hinter-dem-Rücken-Abhängigkeiten da sind. Anderseits ist es aber auch cool, systemweit festlegen zu können, wie sich die diversen Clients an diversen Stellen verhalten.
Gut, aber das ist jetzt nicht der Diskussionspunkt.
Nur so so als Gedanke, wir haben schon jetzt MariaDB und MySQL (dann wären da noch postgres und evtl. Oracle).
Die Konfigurationsdateien haben keinen eindeutigen Pfad, liegen entweder in /etc/mysql/mariadb.conf.d oder /etc/mysql/mysql.conf.d. In Debian werden die als 50-{client|server}.cnf benannt. Andere Distris mögen andere Pfade nutzen oder gleich eine einzelne my.cnf nehmen und die Konfiguration in [server] und [client] Sections stellen.
Dann sind die Optionen wieder davon abhängig ob jetzt OpenSSL, GnuTLS, YaSSL oder wolfSSL gelinkt wurde…
Der patched mit etwas Fuzz und läßt sich mit den letzten Committs des Master-Branches sogar problemlos übersetzen. Danke.
Soll ich gegen https://git.exim.org/exim.git/shortlog/refs/heads/master weiter arbeiten?
Ja, weil das diese Option als Liste von Servern geparsed wird, wo der Doppelpunkt per Default (aber änderbar) als Trenner verwendet wird.
Ok, das war dann die "<;" Syntax, die ich nie verwenden musste :)
Ich gucke mir mal an, wie das jetzt funktioniert. Danke schon mal.
Bei vorhander Langeweile, würde ich weitermachen und (für MariaDB / MySQL) den gemeinsamen Nenner bezüglich Validierung von CA und Client Zertifikaten einpflegen.
Der Plan ist folgende Konfigurations Direktiven mit String Expansion einzuführen:
sql_tls_ca_cert = /pfad/zum/${sql_host}/ca.pem sql_tls_cert = /pfad/zum/${sql_host}/${sql_db}/${sql_user}-cert.pem sql_tls_key = /pfad/zum/${sql_host}/${sql_db}/${sql_user}-key.pem
Der prefix sql_* weil das für LOOKUPS_MYSQL / PGSQL und ORACLE nutzbar werden kann.
Die 3 Variablen müssen in den entsprechenden perform_*_search() Methoden befüttert werden.
Die Datenbankverbindung wird nur einmal wenn notwendig aufgebaut und dann mittels key "tls@host/db/user" gecached, damit funktioniert dann auch die explizite "mysql_servers =" und implizite "inline" Variante.
Die Konfiguration von MariaDB und MySQL ist komplett auseinander gedriftet. In MariaDB gibt es z.B. MYSQ_OPT_SSL_VERIFY_SERVER_CERT als einzelne Option um den Host gegen CN/SAN des Server Zertifikats zu validieren egal ob ich ein CA Zertifikat angebe oder nicht.
Bei MySQL wurde diese entfernt und durch MYSQL_OPT_SSL_MODE ersetzt.
SSL_MODE_REQUIRED // wie jetzt umgesetzt => TLS erzwingen SSL_MODE_VERIFY_CA // wie REQUIRED nur + CA Zertifikat prüfen SSL_MODE_VERIFY_IDENTITY // wie CA + Subject CN/SAN prüfen
Würde entsprechend wenn: "sql_tls_ca_cert" gesetzt ist für MariaDB auch VERIFY_SERVER_CERT aktivieren und bei MySQL dann auch gleich SSL_MODE_VERIFY_IDENTITY verwenden.
Client Zertifikate werden per User auf dem *SQL Server mittels "ALTER USER [..] REQUIRE SUBJECT 'cn=client…'" konfiguriert.
Das ist auch der Grund die "sql_tls_cert/key" Konfiguration granular bis zur Verwendung der ${sql_user} Variable zu gestalten.
In der *SQL Dokumentation wird von "one way/two way" TLS gesprochen, entsprechend bauen die Direktiven dann aufeinander auf:
- Wenn keine der "sql_tls_*" Optionen angegeben ist, wird nur eine eine TLS-Verbindung erzwungen.
- Wenn "sql_tls_cert/key" angegeben, muss auch "sql_tls_ca_cert" gesetzt sein.
Hast du Einwände, Kommentare, Verbessungsvorschläge?
-- Heiko
Gruß Bert