Das Sicherheitsrisiko beim Betreiben von Docker MariaDB/MySQL mit MYSQL_ALLOW_EMPTY_PASSWORD=yes
Dies ist Teil einer häufig im Internet zu findenden docker-compose.yml
services:
mariadb:
image: 'mariadb:latest'
environment:
- MYSQL_ALLOW_EMPTY_PASSWORD=yes
- MYSQL_DATABASE=redmine
volumes:
- './mariadb_data:/var/lib/mysql'
[...]Einfach und sicher, richtig? Eine MariaDB-Instanz ohne Root-Passwort, die in einem separaten Container läuft und deren Port 3306 nicht exponiert ist – sodass nur Dienste aus derselben docker-compose.yml sie erreichen können, da docker-compose alle diese Dienste in einem separaten Netzwerk platziert.
Falsch.
Während die MariaDB-Instanz nicht aus dem Internet erreichbar ist, da kein Port exponiert ist, kann sie von jedem Prozess über ihre interne IP-Adresse erreicht werden.
Um zu verstehen, was passiert, werfen wir einen Blick auf die Docker-Netzwerke. In diesem Fall heißt meine docker-compose-Konfiguration redmine.
$ docker network ls | grep redmine
ea7ed38f469b redmine_default bridge localDies ist das Netzwerk, das docker-compose ohne explizite Netzwerkkonfiguration erstellt. Lassen Sie uns das Netzwerk inspecten, um die Hosts anzuzeigen:
[
// [...]
"Containers": {
"2578fc65b4dab9f204d0a252e421dd4ddd9f41c35642d48350f4e59370581757": {
"Name": "redmine_mariadb_1",
"EndpointID": "1e6d81acc096a12fc740173f4e107090333c42e8a86680ac5c9886c148d578e7",
"MacAddress": "02:42:ac:12:00:02",
"IPv4Address": "172.18.0.2/16",
"IPv6Address": ""
},
"7867f71d2a36265c34c133b70aea487b90ea68fcf30ecb42d6e7e9a376cf8e07": {
"Name": "redmine_redmine_1",
"EndpointID": "f5ac7b3325aa9bde12f0c625c4881f9a6fc9957da4965767563ec9a3b76c19c3",
"MacAddress": "02:42:ac:12:00:03",
"IPv4Address": "172.18.0.3/16",
"IPv6Address": ""
}
},
// [...]
]Wir können sehen, dass die IP-Adresse des redmine_mariadb_1-Containers 172.18.0.2 ist.
Über die interne IP 172.18.0.2 können Sie auf den MySQL-Server zugreifen.
Jeder Prozess auf dem Host (sogar von unprivilegierten Benutzern) kann sich ohne Passwort mit dem Container verbinden, z.B.
$ mysqldump -uroot -h172.18.0.2 --all-databases
// Dies zeigt den Dump der gesamten MariaDB-DatenbankWie kann dieses Sicherheitsrisiko gemildert werden?
Die Milderung ist recht einfach, da wir nur ein Root-Passwort für die MariaDB-Instanz setzen müssen.
Meine empfohlene Best Practice ist es, doppelte Passwörter zu vermeiden. Um dies zu tun, erstellen Sie eine .env-Datei in dem Verzeichnis, in dem sich docker-compose.yml befindet.
MARIADB_ROOT_PASSWORD=aiPaipei6ookaemue4voo0NooC0AeHDenken Sie daran, das Passwort durch ein zufälliges Passwort zu ersetzen oder verwenden Sie dieses Shell-Skript, um es automatisch zu erstellen:
echo MARIADB_ROOT_PASSWORD=$(pwgen 30) > .envNun können wir ${MARIADB_ROOT_PASSWORD} in docker-compose.yml verwenden, wo immer das MariaDB-Root-Passwort benötigt wird, zum Beispiel:
services:
mariadb:
image: 'mariadb:latest'
environment:
- MYSQL_ROOT_PASSWORD=${MARIADB_ROOT_PASSWORD}
- MYSQL_DATABASE=redmine
volumes:
- './mariadb_data:/var/lib/mysql'
redmine:
image: 'redmine:latest'
environment:
- REDMINE_USERNAME=admin
- REDMINE_PASSWORD=redmineadmin
- [email protected]
- REDMINE_DB_MYSQL=mariadb
- REDMINE_DB_USERNAME=root
- REDMINE_DB_PASSWORD=${MARIADB_ROOT_PASSWORD}
ports:
- '3718:3000'
volumes:
- './redmine_data/conf:/usr/src/redmine/conf'
- './redmine_data/files:/usr/src/redmine/files'
- './redmine_themes:/usr/src/redmine/public/themes'
depends_on:
- mariadb