Hallo Bert, noch ein paar weitere unsortierte Gedanken:
- Vewenden die MySQL/MariaDB Libraries nicht auch Konfigurationsfiles (mehr oder weniger implizit), in denen man dann solche Dinge erledigen könnte?
- Möchte MariaDB nicht API-kompatibel zu MySQL sein? Exim behandelt aktuell beide Libraries gleich (bis auf etwas Magie zum ermitteln der aktuellen Version, da gab es wohl unterschiedliche Defines in den beiden Libs)
An ssh -NL localhost:3306:localhost:3306 mittels pubkey auth hatte ich auch schon gedacht, aber ja das ist wieder manueller Aufwand und ein weiteres vermeidbares Scheunentor.
Na, als Scheunentor würde ich einen SSH-Tunnel jetzt nicht bezeichnen, aber Aufwand, ja, das wäre es.
Vielleicht mysql_servers = <; [tls://]localhost[:port]/DB/User/Passwort
Das würde dann das Verhalten implizieren TLS zu erzwingen wenn tls:// als Protokoll angegeben wurde und darauf bestehen verschlüsselt zu kommuizieren?
So war der Gedanke. Aber wie Du selbst weiter unten ausführst, wird es schnell unübersichtlich, wenn man da noch weitere Optionen mit einbauen möchte (CA, Client-Cert, Ciphers, …)
Hier geht es dann weiter und man müsste mindestens prüfen ob das Server Zertifikat durch eine vertrauenswürdige CA ausgestellt wurde (und ggf. noch nicht revoked). Dafür brauchen wir:
MYSQL_OPT_SSL_CA || MYSQL_OPT_SSL_CAPATH MYSQL_OPT_SSL_CRL || MYSQL_OPT_SSL_CRLPATH
Worauf ich hinaus will: mit mysql_servers ist es bestimmt nicht getan.
Full Ack.
tls_mysql_servers // für den connection string tls_mysql_servers_verify // default true, anderenfalls fallback unencrypted
Na, aber z.B. kann man den MySQL-Server auch direkt beim Lookup mitgeben
… = ${lookup mysql,servers=… {SELECT ...}} und ich glaube, auch so: … = mysql,servers=…;SELECT ...
Es wäre also gut, wenn man alle erforderliche Information in *einen* String bekäme.
mysql_servers = host[:port]/db/user/password/tls=required,ca=…,
Dann gäbe es nur ein Problem, wenn das Passwort einen Slash enthält, aber ich denke, das Problem haben wir jetzt schon (habe jetzt nicht in den Sourcen nachgeschaut, ob wir das mit Quting oder Escaping umgehen könnten.
Wenn also alle erforderliche Info in einem String steckt, könnten wir das auch problemlos bei der expliziten Verwendung unterbringen. Wird natürlich dann nicht mehr schön
… = ${lookup mysql,servers=localhost/db/user/password/tls=required,ca=…{SELECT …}}
Aber wir haben ja Macros.
Zur Zertifikatsprüfung: Ich würde jetzt mal unterstellen, dass die MySQL libs sich da mit irgendwelchen dazugenommen TLS libs auch selbst kümmern, oder? Wenn man an die Verbindungsdetails dran kommt, könnte man aber sicher auch Zertifikats-Prüfungs-Funktionen nutzen, die der Exim schon bringt (wobei auch der m.W. sich dort auf GnuTLS bzw. OpenSSL verlässt).
Denke die Ausführungen erklären was ich meinte, es ging mir darum wie dreckig man sich die Finger machen müsste:)
Ich glaube, es wird nicht soo schlimm.
Wenn Du das selbst machen möchtest, gib Bescheid, ich unterstütze Dich gerne dabei.
Zunächst habe ich mir mal darüber Gedanken gemacht, je nachdem wie komplex die Geschichte werden soll, würde ich mich daran beteiligen.
Es würde mich freuen. Pro-Tip: Wir können Leute gebrauchen, die sich gerne an OpenSource beteiligen.