Wie aktiviere ich die Authentifizierung in MongoDB über Docker?


73

Ich möchte ein Docker für starten, mongodb:latestaber nur bestimmten Benutzern erlauben, auf bestimmte Datenbanken zuzugreifen (dh zu aktivieren --auth). Niemand sonst sollte auf Mongodb zugreifen! Wie soll ich das im Rahmen der Docker-Initiierung tun?

Übrigens, data directorysitzt auf dem Host, indem der folgende Befehl während der Initiierung verwendet wird : -v /my/own/datadir:/data/db.

Antworten:


98

Wenn Sie sich Folgendes ansehen:

Sie werden feststellen, dass zwei Variablen verwendet werden docker-entrypoint.sh:

  • MONGO_INITDB_ROOT_USERNAME
  • MONGO_INITDB_ROOT_PASSWORD

Sie können sie verwenden, um den Root-Benutzer einzurichten. Zum Beispiel können Sie folgende docker-compose.ymlDatei verwenden:

mongo-container:
  image: mongo:3.4.2
  environment:
      # provide your credentials here
      - MONGO_INITDB_ROOT_USERNAME=root
      - MONGO_INITDB_ROOT_PASSWORD=rootPassXXX
  ports:
    - "27017:27017"
  volumes:
      # if you wish to setup additional user accounts specific per DB or with different roles you can use following entry point
    - "$PWD/mongo-entrypoint/:/docker-entrypoint-initdb.d/"
  # no --auth is needed here as presence of username and password add this option automatically
  command: mongod

Wenn Sie nun den Container starten docker-compose up, sollten Sie folgende Einträge beachten:

...
I CONTROL  [initandlisten] options: { net: { bindIp: "127.0.0.1" }, processManagement: { fork: true }, security: { authorization: "enabled" }, systemLog: { destination: "file", path: "/proc/1/fd/1" } }
...
I ACCESS   [conn1] note: no users configured in admin.system.users, allowing localhost access
...
Successfully added user: {
    "user" : "root",
    "roles" : [
        {
            "role" : "root",
            "db" : "admin"
        }
    ]
}

Um benutzerdefinierte Benutzer neben root hinzuzufügen, verwenden Sie das exectuable-Skript für den Einstiegspunkt (platziert unter $ PWD / mongo-entrypoint dir, wenn es docker-composeam Einstiegspunkt bereitgestellt wird):

#!/usr/bin/env bash
echo "Creating mongo users..."
mongo admin --host localhost -u USER_PREVIOUSLY_DEFINED -p PASS_YOU_PREVIOUSLY_DEFINED --eval "db.createUser({user: 'ANOTHER_USER', pwd: 'PASS', roles: [{role: 'readWrite', db: 'xxx'}]}); db.createUser({user: 'admin', pwd: 'PASS', roles: [{role: 'userAdminAnyDatabase', db: 'admin'}]});"
echo "Mongo users created."

Das Einstiegspunktskript wird ausgeführt und zusätzliche Benutzer werden erstellt.


4
Ich habe auf die Umgebungsvariablen für Benutzername und Kennwort umgestellt (wie Sie in Ihrer Antwort gezeigt haben), damit meine Mongo-Instanz automatisch im authentifizierten Modus gestartet werden kann. Zuvor musste ich es ungesichert starten, meine Benutzer mit einem Docker-Entrypoint-JS-Skript erstellen und dann die Instanz im authentifizierten Modus neu starten. Wenn ich versuche, mit Ihrem Bash-Skript einen neuen Benutzer zu erstellen (in einer neuen Datenbank - nicht in einem Administrator), wird der Fehler "Authentifizierung fehlgeschlagen" angezeigt. Ich habe versucht, direkt in meinem laufenden Mongo-Container zu laufen, und es wird immer noch der gleiche Fehler angezeigt. Gibt es einen Grund, an den Sie denken können?
littleK

2
Wenn Sie andere Benutzer als den Administrator in der Datenbank erstellt haben, müssen Sie wahrscheinlich eine zusätzliche Option angeben --authenticationDatabase, um dem Server mitzuteilen, wo nach dem Benutzer gesucht werden soll, bei dem Sie sich authentifizieren. Sie können überprüfen , ob die Authentifizierung auf 2 Arten funktioniert: - Verbinden von Shell mit mongo DB --host -u USER -p PASS --authenticationDatabase DB- oder über die Local Host - Modus verbinden: mongo --host localhostund dann use YOUR_DBgefolgt vondb.auth("USER","PASS")
jbochniak

Vielen Dank, mir war die Anweisung --authenticationDatabase bisher nicht bekannt. Das hat funktioniert.
littleK

Die env-Variablen erstellen keinen Benutzer in einer bereits erstellten Datenbank, stellen jedoch sicher, dass mongod mit --auth gestartet wird, da Sie es auch nach dem ersten Start benötigen docker-compose. Wenn da nichts Wichtiges drin ist, kannst du es immer docker-compose rm -fv <servicename>wieder versuchen ... Immer noch kein Glück? Wenn Sie ein freigegebenes Volume bereitgestellt haben, um die Daten zu erhalten, müssen Sie dieses leeren. github.com/docker-library/mongo/issues/…
pulkitsinghal


32

ein. Sie können Umgebungsvariablen über das Terminal verwenden:

$ docker run -d --name container_name \
      -e MONGO_INITDB_ROOT_USERNAME=admin \
      -e MONGO_INITDB_ROOT_PASSWORD=password \
      mongo

Wenn Sie testen möchten, ob alles funktioniert:

// ssh into the running container
// Change container name if necessary
$ docker exec -it mongo /bin/bash

// Enter into mongo shell
$ mongo

// Caret will change when you enter successfully
// Switch to admin database
$> use admin
$> db.auth("admin", passwordPrompt())

// Show available databases
$> show dbs

Wenn Sie eine Datenbank beim ersten Ausführen instanziieren möchten, aktivieren Sie die Option b.

b. Sie können Umgebungsvariablen in Ihrer Docker-Stack-Bereitstellungsdatei verwenden oder eine Datei für die Versionen 3.4 bis 4.1 erstellen.

Da es auf dem Schnellreferenzteil des erläutert offiziellen Mongo BildsatzesMONGO_INITDB_ROOT_USERNAME und MONGO_INITDB_ROOT_PASSWORDin Ihrer YAML - Datei:

mongo:
    image: mongo
    environment:
      MONGO_INITDB_ROOT_USERNAME: admin
      MONGO_INITDB_ROOT_PASSWORD: password

Die Datei docker-entrypoint.sh im Mongo-Image prüft, ob diese beiden Variablen vorhanden sind, und setzt das --authFlag entsprechend.

c. Sie können auch Docker-Geheimnisse verwenden.

MONGO_INITDB_ROOT_USERNAMEund MONGO_INITDB_ROOT_PASSWORDwird indirekt von docker-entrypoint.sh von MONGO_INITDB_ROOT_USERNAME_FILEund MONGO_INITDB_ROOT_PASSWORD_FILEVariablen festgelegt:

mongo:
    image: mongo
    environment:
        - MONGO_INITDB_ROOT_USERNAME_FILE=/run/secrets/db_root_username
        - MONGO_INITDB_ROOT_PASSWORD_FILE=/run/secrets/db_root_password
    secrets:
      - db_root_username
      - db_root_password

docker-entrypoint.sh konvertiert MONGO_INITDB_ROOT_USERNAME_FILEund MONGO_INITDB_ROOT_PASSWORD_FILEnach MONGO_INITDB_ROOT_USERNAMEund MONGO_INITDB_ROOT_PASSWORD.

Sie können MONGO_INITDB_ROOT_USERNAMEund MONGO_INITDB_ROOT_PASSWORDin Ihrem .shoder .jsSkripten im docker-entrypoint-initdb.dOrdner verwenden, während Sie die Datenbankinstanz initialisieren.

Wenn ein Behälter zum ersten Mal gestartet wird es Dateien mit den Erweiterungen ausgeführt wird .shund .jsdass gefunden werden /docker-entrypoint-initdb.d. Dateien werden in alphabetischer Reihenfolge ausgeführt. .jsDateien werden von Mongo unter Verwendung der von der MONGO_INITDB_DATABASEVariablen angegebenen Datenbank ausgeführt , sofern vorhanden, oder auf andere Weise getestet. Sie können auch die Datenbank innerhalb des .jsSkripts wechseln .

Diese letzte Methode befindet sich nicht in den Referenzdokumenten, sodass sie ein Update möglicherweise nicht überlebt.


1
Ich habe Option b ausprobiert und kann immer noch ohne Authentifizierung eine Remoteverbindung zu Mongo herstellen - ich meine nur durch Eingabe vonmongo ip:port
sbk

@sbk Es gab einmal einen Fehler in Mongodb in dieser Art, aber soweit ich weiß, wurde er behoben. Es muss etwas mit Ihren Einstellungen zu tun haben. Stellen Sie sicher, dass Sie die richtigen Einstellungen haben, und versuchen Sie einen Neustart.
snnsnn

26

Bessere Lösungen für die Weiterentwicklung:
https://blog.madisonhub.org/setting-up-a-mongodb-server-with-auth-on-docker/ https://docs.mongodb.com/v2.6/tutorial/add -user-Administrator /

Hier ist, was ich für das gleiche Problem getan habe, und es hat funktioniert.

  1. Führen Sie die Mongo Docker-Instanz auf Ihrem Server aus

    docker run -d -p 27017:27017 -v ~/dataMongo:/data/db mongo
    
  2. Öffnen Sie die Bash auf der laufenden Docker-Instanz.

    docker ps
    

    BEHÄLTER-IDIMAGE-BEFEHL ERSTELLTE STATUS-PORTS-NAMEN

    b07599e429fb mongo "docker-entrypoint ..." vor 35 Minuten Up 35 Minuten 0.0.0.0:27017->27017/tcp musing_stallman

    docker exec -it b07599e429fb bash
    root@b07599e429fb:/#
    

    Referenz- https://github.com/arunoda/meteor-up-legacy/wiki/Accessing-the-running-Mongodb-docker-container-from-command-line-on-EC2

  3. Betreten Sie die Mongo-Shell, indem Sie Mongo eingeben.

    root@b07599e429fb:/# mongo
    
  4. In diesem Beispiel werde ich einen Benutzer namens ian einrichten und diesem Benutzer Lese- und Schreibzugriff auf die Datenbank cool_db gewähren.

    > use cool_db
    
    > db.createUser({
        user: 'ian',
        pwd: 'secretPassword',
        roles: [{ role: 'readWrite', db:'cool_db'}]
    })
    

    Referenz: https://ianlondon.github.io/blog/mongodb-auth/ (nur erster Punkt)

  5. Verlassen Sie die Mongod-Muschel und schlagen Sie.

  6. Stoppen Sie die Docker-Instanz mit dem folgenden Befehl.

    docker stop mongo
    
  7. Führen Sie nun den Mongo Docker mit aktivierter Authentifizierung aus.

    docker run -d -p 27017:27017 -v ~/dataMongo:/data/db mongo mongod --auth
    

    Referenz: Wie aktiviere ich die Authentifizierung in MongoDB über Docker? (Usman Ismails Antwort auf diese Frage)

  8. Mit dem folgenden Befehl konnte ich von meinem lokalen Windows-Laptop aus eine Verbindung zu der auf einem Google Cloud-Server ausgeführten Instanz herstellen.

    mongo <ip>:27017/cool_db -u ian -p secretPassword
    

    Referenz: Wie kann ich vom Mac OS-Terminal aus eine Verbindung zu einem Remote-Mongo-Server herstellen?


Wie docker run -d -p 27017:27017 -v ~/dataMongo:/data/db mongostartet dieser Befehl ungesicherte Mongo DB? Welche helfen uns, erste Befehle hinzuzufügen.
Ankur Loriya

1
Hallo, danke für diese Antwort, aber ich stecke bei Schritt 6 fest. Wie können Sie davon ausgehen run, dass Sie bereits einen Container für MongoDB haben? Sie müssen den Container beenden, mit dem Sie auth einrichten können, und ihn dann mit auth erneut ausführen? Ich verstehe es nicht
Eric Burel

2
@Eric Ja, Sie müssen die laufende Docker-Instanz stoppen, bevor Sie den Befehl 'run' erneut ausführen. Ich habe die Antwort mit diesen Informationen aktualisiert. Vielen Dank für den Hinweis.
Sankaran Srinivasan

1
@Ankur, Ja, der Befehl startet ungesichertes Mongo, über das Sie Sicherheit hinzufügen können.
Sankaran Srinivasan

1
Vielen Dank, aber dies führt dazu, dass die Anmeldung fehlgeschlagen ist, da ich jetzt zwei verschiedene Container habe: einen mit einem Benutzer, dessen Authentifizierung jedoch nicht festgelegt ist, und einen mit einer Authentifizierung ohne Benutzer, sodass ich keine Verbindung herstellen kann. Ich denke, das ist das -v ~/dataMonogo/data/db, was ich nicht bekomme, ich kenne mich nicht mit Devops / Hosting aus
Eric Burel

15

Es fällt mir schwer, es zu versuchen

  • Erstellen Sie eine andere Datenbank als admin
  • Fügen Sie neue Benutzer hinzu und aktivieren Sie die Authentifizierung für die obige Datenbank

Also habe ich 2020 hier antworten lassen

Mein Verzeichnis sieht so aus

├── docker-compose.yml
└── mongo-entrypoint
    └── entrypoint.js

Mein docker-compose.ymlsieht so aus

version: '3.4'
services:
  mongo-container:
    # If you need to connect to your db from outside this container 
    network_mode: host
    image: mongo:4.2
    environment:
        - MONGO_INITDB_ROOT_USERNAME=admin
        - MONGO_INITDB_ROOT_PASSWORD=pass
    ports:
      - "27017:27017"
    volumes:
      - "$PWD/mongo-entrypoint/:/docker-entrypoint-initdb.d/"
    command: mongod

Bitte ändern Sie adminund passmit Ihrem Bedarf.

Im Inneren habe mongo-entrypointich entrypoint.jsDatei mit diesem Inhalt:

var db = connect("mongodb://admin:pass@localhost:27017/admin");

db = db.getSiblingDB('new_db'); // we can not use "use" statement here to switch db

db.createUser(
    {
        user: "user",
        pwd: "pass",
        roles: [ { role: "readWrite", db: "new_db"} ],
        passwordDigestor: "server",
    }
)

Auch hier müssen Sie admin:passIhre Root-Mongo-Anmeldeinformationen in Ihren docker-compose.ymlzuvor angegebenen ändern . In weiteren müssen Sie ändern new_db, user, passzu Ihrem neuen Datenbanknamen und Anmeldeinformationen , die Sie benötigen.

Jetzt kannst du:

docker-compose up -d

Und stellen Sie von localhost aus eine Verbindung zu dieser Datenbank her. Bitte beachten Sie, dass ich bereits mongo cli habe. Sie können es installieren oder im obigen Container ausführen, um den folgenden mongoBefehl zu verwenden :

mongo new_db -u user -p pass

Oder Sie können eine Verbindung von einem anderen Computer aus herstellen

mongo host:27017/new_db -u user -p pass

Mein Git-Repository: https://github.com/sexydevops/docker-compose-mongo

Hoffe es kann jemandem helfen, ich habe meinen Nachmittag dafür verloren;)


Vielen Dank, dass Sie dies geschrieben haben. Das war genau das, was ich brauchte. Eine Änderung, die ich brauchte, war, dass $PWDsie durch .Hinweis ersetzt werden musste. Der Administrator-Benutzername muss sich von dem Benutzernamen unterscheiden, den Sie für die neue Datenbank erstellen möchten
Joe Caruso

1
db = new Mongo().getDB("myDatabase"); Übrigens
AD

Vielen Dank, dass Sie mir das Leben gerettet haben. Ich war schon seit fast einer Woche verrückt danach.
Cdaiga

8

Das Dockerfile für das offizielle Mongo-Bild ist hier . Der Standardbefehl ist mongod, aber Sie können ihn überschreiben, um den Schalter --auth hinzuzufügen, vorausgesetzt, die Benutzer sind bereits konfiguriert.

docker run -d .... mongodb:latest mongod --auth

Wenn der Benutzer erstellt werden muss, müssen Sie ein Startskript in ein Volume einbinden /entrypoint.sh, um das Standardstart- Skript zu ersetzen. Anschließend muss dieses Skript Benutzer erstellen und mongo mit dem Auth-Schalter starten.

docker run -d .... -v $PWD/my_custom_script.sh:/entrypoint.sh mongodb:latest

Wenn ich versuche, das Skript als Volume zu mounten, erhalte ich die Fehlermeldung "kein Verzeichnis"
Janus Troelsen

1
Ich denke, Docker unterstützt nur Mount-Verzeichnis anstelle von Datei.
Joey Yi Zhao

8

Das Ablegen einer .js-Datei in den Einstiegspunkt-Init-Ordner funktioniert hierfür

zB entrypoint.js

var db = connect("mongodb://localhost/admin");

db.createUser(
    {
        user: "yourAdminUserName",
        pwd: "yourAdminPassword",
        roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
    }
)

docker-compose.yml:

db:
  image: mongo:3.2
  volumes:
   - /my/own/datadir:/data/db
   - ../mongo-entrypoint:/docker-entrypoint-initdb.d

Den Rest von Hand oder mehr der gleichen Arbeiten erledigen.

Wenn Sie möchten, können Sie auch eine .sh-Datei in den init-Ordner legen, um die Dateien zu bereinigen, damit sie nicht herumliegen: zz-cleanup.sh.


6

Ich möchte einen Kommentar abgeben, habe aber nicht genug Ruf.

Das oben gezeigte ausführbare Skript zum Hinzufügen von Benutzern muss mit --authenticationDatabase admin und NEWDATABASENAME geändert werden .

mongo --authenticationDatabase admin --host localhost -u USER_PREVIOUSLY_DEFINED -p PASS_YOU_PREVIOUSLY_DEFINED NEWDATABASENAME --eval "db.createUser({user: 'NEWUSERNAME', pwd: 'PASSWORD', roles: [{role: 'readWrite', db: 'NEWDATABASENAME'}]});"

https://i.stack.imgur.com/MdyXo.png


Die Variable MONGO_INITDB_DATABASE kann verwendet werden, um den Datenbanknamen (z. B. NEWDATABASENAME) für Skripte unter festzulegen /docker-entrypoint-initdb.d. Der Standardwert ist test.
Mohnish

4

@jbochniak: Danke, obwohl ich beim ersten Lesen dachte, ich hätte das alles bereits entdeckt, stellte sich heraus, dass Ihr Beispiel (insbesondere die Version des Mongo Docker-Bildes) mir geholfen hat!

Diese Version (v3.4.2) und die Version 3.4 (die derzeit v3.4.3 entspricht) unterstützen weiterhin 'MONGO_INITDB_ROOT', die über diese Variablen angegeben wurden, ab Version 3.5 (mindestens Tags '3' und 'neueste') NICHT Arbeiten Sie wie in Ihrer Antwort und in den Dokumenten beschrieben.

Ich habe mir schnell den Code auf GitHub angesehen, aber eine ähnliche Verwendung dieser Variablen festgestellt und konnte den Fehler nicht sofort finden. Sollte dies tun, bevor ich ihn als Fehler einreiche ...


Vielen Dank für die Warnung, überprüfen Sie die Quelle für 3.5und es hat sie jetzt auch: github.com/docker-library/mongo/blob/master/3.5/…
pulkitsinghal

4

Verwenden Sie diese Bilder, um Folgendes zu beheben:

Mit docker-compose.yml

services:
  db:
    image: aashreys/mongo-auth:latest
    environment:
      - AUTH=yes
      - MONGODB_ADMIN_USER=admin
      - MONGODB_ADMIN_PASS=admin123
      - MONGODB_APPLICATION_DATABASE=sample
      - MONGODB_APPLICATION_USER=aashrey
      - MONGODB_APPLICATION_PASS=admin123
    ports:
      - "27017:27017"
     // more configuration

Dadurch wird auch eine "Test" -Datenbank erstellt. Wie können wir das verhindern?
WarrenV

Testen Sie vielleicht eine Standarddatenbank, Sie können sie löschen. - MongoDB Drop Database
Mark Simon

In den Docker Mongo-Dokumenten heißt es: "Wenn ein Container zum ersten Mal gestartet wird, werden Dateien mit den Erweiterungen .sh und .js ausgeführt, die sich in /docker-entrypoint-initdb.d befinden. Dateien werden in ausgeführt .js-Dateien in alphabetischer Reihenfolge werden von mongo unter Verwendung der von der Variablen MONGO_INITDB_DATABASE angegebenen Datenbank ausgeführt, sofern vorhanden, oder auf andere Weise getestet. " Sobald Sie sich in der Datenbank befinden, sollten Sie in der Lage sein, die Datenbank zu löschen.
Carl Saptarshi

1

Sie können env-Variablen verwenden, um Benutzername und Passwort für Mongo einzurichten

MONGO_INITDB_ROOT_USERNAME
MONGO_INITDB_ROOT_PASSWORD

mit einfachen Docker-Befehl

docker run -e MONGO_INITDB_ROOT_USERNAME=my-user MONGO_INITDB_ROOT_PASSWORD=my-password mongo

mit Docker-Compose

version: '3.1'

services:

  mongo:
    image: mongo
    restart: always
    environment:
      MONGO_INITDB_ROOT_USERNAME: my-user
      MONGO_INITDB_ROOT_PASSWORD: my-password

und die letzte Option besteht darin, manuell auf den Container zuzugreifen und den Benutzer und das Kennwort im Mongo Docker-Container festzulegen

docker exec -it mongo-container bash

Jetzt können Sie mit dem Befehl mongo shell alles konfigurieren, was Sie wollen

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.