2016-01-01 15 views
18

Desidero avviare una finestra mobile per mongodb:latest ma consentire solo a determinati utenti di accedere a determinati db (s) (ad esempio, abilitare --auth). Nessun altro dovrebbe accedere a mongodb di sorta! Come devo fare questo come parte dell'iniziazione del docker?Come abilitare l'autenticazione su MongoDB tramite Docker?

BTW, data directory si trova sull'host utilizzando il seguente comando durante l'avvio: -v /my/own/datadir:/data/db.

risposta

7

Il file Docker per l'immagine ufficiale di mongo è here. Il comando predefinito è mongod ma è possibile eseguire l'override per aggiungere lo switch --auth presumendo che gli utenti siano già configurati.

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

Se l'utente deve essere creato allora avete bisogno di montare il volume uno script di avvio in /entrypoint.sh per sostituire lo script di avvio di default e quindi avere lo script creano gli utenti e iniziare Mongo con l'interruttore di autenticazione.

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

quando provo a montare lo script come un volume, ottengo un errore "non è una directory" –

+0

Credo finestra mobile supporta solo directory di montaggio invece di file. –

22

Se si dà un'occhiata a:

si noterà che ci sono due variabili utilizzate nel docker-entrypoint.sh:

  • MONGO_INITDB_ROOT_USERNAME
  • MONGO_INITDB_ROOT_PASSWORD

si possono usare per utente root di installazione. Ad esempio è possibile utilizzare i seguenti docker-compose.yml di file:

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 

Ora, quando si avvia il contenitore docker-compose up si dovrebbe notare le seguenti voci:

... 
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" 
     } 
    ] 
} 

Per aggiungere utenti personalizzati parte di radice di utilizzare lo script exectuable entrypoint (posto sotto $ PWD/mongo-entrypoint dir come è montato in docker-compose a entrypoint):

#!/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." 

entrypoint sceneggiatura wi Verrà eseguito e verranno creati ulteriori utenti.

+1

Sono passato a utilizzare le variabili di ambiente username e password (come dimostrato nella risposta) in modo che la mia istanza mongo potesse avviarsi automaticamente in modalità autenticata. In precedenza, dovevo avviarlo senza protezione, creare i miei utenti con uno script .js di tipo inserypoint docker, quindi riavviare l'istanza in modalità autenticata. Quando provo a usare il tuo script bash per creare un nuovo utente (in un nuovo db - non amministratore), ottengo un errore di autenticazione fallito. Ho provato a eseguire direttamente nel mio contenitore mongo in esecuzione, e ho ancora lo stesso errore. Qualche ragione per cui puoi pensare a questo? – littleK

+0

Se gli utenti hanno creato nel database altro da admin, probabilmente è necessario fornire un'opzione aggiuntiva '--authenticationDatabase' per indicare al server dove cercare l'utente con cui si sta autenticando. È possibile verificare se l'autenticazione funziona in 2 modi: - connettersi dalla shell con 'mongo DB --host -u USER -p PASS --authenticationDatabase DB' - oppure connettersi tramite la modalità localhost:' mongo --host localhost' e quindi 'use YOUR_DB' seguito da' db.auth ("USER", "PASS") ' – jbochniak

+0

Grazie, in precedenza non ero a conoscenza della direttiva --authenticationDatabase. Questo ha fatto il trucco. – littleK

3

@jbochniak: Grazie, anche se alla prima lettura ho pensato di aver già scoperto tutto questo, è risultato che il tuo esempio (specialmente la versione dell'immagine di Mongo Docker) mi ha aiutato!

Quella versione (v3.4.2) e la v3.4 (attualmente corrispondente alla v3.4.3) supportano ancora "MONGO_INITDB_ROOT" specificato tramite tali variabili, a partire dalla v3.5 (almeno tag "3" e "ultimo" ') NON funziona come descritto nella risposta e nei documenti.

Ho visto rapidamente il codice su GitHub, ma ho visto un uso simile di queste variabili e non ho trovato il bug immediatamente, dovrei farlo prima di archiviarlo come un bug ...

+0

Grazie per l'avviso, ho controllato la sorgente per '3.5' e ora ce li ha anche: https://github.com/ docker-library/mongo/blob/master/3.5/docker-entrypoint.sh # L117-L118 – pulkitsinghal

+0

@Frederik osservazione molto importante – pt12lol

3

utilizzare questa immagini per fissare:

Con finestra mobile-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 
+0

Questo crea anche un database di "test". Come possiamo impedirlo? – WarrenV

+0

prova forse un database predefinito, è possibile rilasciarlo.- [MongoDB Drop Database] (https://www.tutorialspoint.com/mongodb/mongodb_drop_database.htm) –

3

soluzioni migliori per promuovere:
https://blog.madisonhub.org/setting-up-a-mongodb-server-with-auth-on-docker/ https://docs.mongodb.com/v2.6/tutorial/add-user-administrator/

Ecco quello che ho fatto per lo stesso problema, e ha funzionato.

  1. eseguire l'istanza finestra mobile Mongo sul server

    docker run -d -p 27017:27017 -v ~/dataMongo:/data/db mongo 
    
  2. Aprire bash nell'istanza finestra mobile in esecuzione.

    docker ps 
    

    CONTAINER IDIMAGE comando status CREATO PORTI NOMI

    b07599e429fb mongo "finestra mobile-entrypoint ..." 35 minuti fa Fino a 35 minuti 0.0.0.0:27017->27017/tcp musing_stallman

    docker exec -it b07599e429fb bash 
    [email protected]:/# 
    

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

  3. Inserisci la shell mongo digitando mongo.

    [email protected]:/# mongo 
    
  4. Per questo esempio, io impostare un utente di nome Ian e dare quell'utente lettura & l'accesso in scrittura al database cool_db.

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

    Riferimento: https://ianlondon.github.io/blog/mongodb-auth/ (Primo punto solo)

  5. uscita dalla shell mongod e bash.

  6. Ora eseguire la finestra mobile di mongo con autenticazione abilitata.

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

    Riferimento: How to enable authentication on MongoDB through Docker? (risposta di Usman Ismail a questa domanda)

  7. sono stato in grado di connettersi all'istanza in esecuzione su un server di Google Cloud dal mio computer portatile finestre locali utilizzando il comando di seguito.

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

    Riferimento: how can I connect to a remote mongo server from Mac OS terminal

Problemi correlati