Das Sicherheitsrisiko beim Betreiben von Docker MariaDB/MySQL mit MYSQL_ALLOW_EMPTY_PASSWORD=yes

English Deutsch

Dies ist Teil einer häufig im Internet zu findenden docker-compose.yml

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.txt
$ docker network ls | grep redmine
ea7ed38f469b        redmine_default           bridge              local

Dies ist das Netzwerk, das docker-compose ohne explizite Netzwerkkonfiguration erstellt. Lassen Sie uns das Netzwerk inspecten, um die Hosts anzuzeigen:

docker_network_inspect.json
[
    // [...]
        "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_no_password.sh
$ mysqldump -uroot -h172.18.0.2 --all-databases
// Dies zeigt den Dump der gesamten MariaDB-Datenbank

Wie 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.env
MARIADB_ROOT_PASSWORD=aiPaipei6ookaemue4voo0NooC0AeH

Denken Sie daran, das Passwort durch ein zufälliges Passwort zu ersetzen oder verwenden Sie dieses Shell-Skript, um es automatisch zu erstellen:

generate_mariadb_env.sh
echo MARIADB_ROOT_PASSWORD=$(pwgen 30) > .env

Nun können wir ${MARIADB_ROOT_PASSWORD} in docker-compose.yml verwenden, wo immer das MariaDB-Root-Passwort benötigt wird, zum Beispiel:

docker-compose.yml
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

Check out similar posts by category: Databases, Docker, Linux