Mongodb & Docker - Expériences & Authentification

Temps de lecture environ 2 min

mongodb image

Contexte #

Pré-requis : concepts de conteneurisation maitrisés.

Déploiement d'un container mongodb et mongo-express pré-configuré avec docker-compose.

Mongodb #

docker-compose #

version: '3'

services:
mongo:
image: mongo
environment:
- MONGO_INITDB_ROOT_USERNAME=<USER>
- MONGO_INITDB_ROOT_PASSWORD=<PASSWORD>
- MONGO_INITDB_DATABASE=test
volumes:
- ./etc/mongo-volume:/data/db
- ./init-mongo.js:/docker-entrypoint-initdb.d/init-mongo.js:ro
ports:
- "27017:27017"

Description du conteneur mongo

  • Basé sur l'image mongo
  • Descriptions des variables d'environnement
  • Création de volumes pour le partage de fichiers
  • Configuration des flux (ports)

⚠️ Ne pas oublier de modifier les valeurs USER et PASSWORD

Point d'attention #

J'ai rencontré des difficultés avec la gestion des utilisateurs. mongo-express n'arrivait pas a se connecter.
Pour contourner ce problème j'utilise:

  • MONGO_INITDB_ROOT_USERNAME
  • MONGO_INITDB_ROOT_PASSWORD

Une fois ces variables renseignées alors mongodb démarre avec le l'authentification obligatoire (voir mongod --auth))
Cet utilisateur est crée dans la table : admin avec le role ROOT et mongo-express pourra l'utiliser pour l'administration de la base de données


Initialisation d'une base de donnée avec système d'authentification #

Au lancement de mongodb les fichiers d'initialisation (//docker-entrypoint-initdb.d) sont exécutés dans l'ordre alphabetique.

Si la variable d'environnement MONGO_INITDB_DATABASE est renseignée alors elle sera utilisée pour l'exécution de ces scripts.

db.createUser(
{
user: "auth_login",
pwd: "pwd", // or cleartext password
roles: [ { role: "readWrite", db: "db-project" } ]
}
)

Pour aller plus loins :

Authentification #

Pour vous connecter et tester votre configuration il est possible :

$> mongo -u <login> -p <pwd> authentificationDatabase <db_name>

$> mongo -u <login> --authentificationDatabase <db_name>

// exemple
$> mongo -u auth_login --authentificationDatabase db-project
Enter your password: ...

Pour aller plus loins: Encryption SSL


Mongodb Express #

Problèmes rencontrés authentification sur bdd mongo via mongo-express

> Ne pas se tromper dans les variables d'environnement pour disposer d'un accès root en dev (voir section variables d'environnement)


Déploiement via Docker-compose #

  mongo-express:
image: mongo-express
restart: always
environment:
- ME_CONFIG_MONGODB_SERVER=mongo
- ME_CONFIG_MONGODB_PORT=27017
- ME_CONFIG_MONGODB_ENABLE_ADMIN=true
- ME_CONFIG_MONGODB_ADMINUSERNAME=<USER> # <-- Doit correspondre au compte root décrit plus haut
- ME_CONFIG_MONGODB_ADMINPASSWORD=<PASSWORD> # <--
- ME_CONFIG_BASICAUTH_USERNAME=dev
- ME_CONFIG_BASICAUTH_PASSWORD=dev
depends_on:
- mongo
ports:
- "8888:8081"

Authentification #

Attention, a ne pas confondre ME_CONFIG_MONGODB_ADMINUSERNAME et ME_CONFIG_MONGODB_AUTH_USERNAME


Les variables suivantes doivent être renseignées si ME_CONFIG_MONGODB_ENABLE_ADMIN est false

Name Default Description
ME_CONFIG_MONGODB_AUTH_DATABASE 'db' Database name
ME_CONFIG_MONGODB_AUTH_USERNAME 'admin' Database username
ME_CONFIG_MONGODB_AUTH_PASSWORD 'pass' Database password

si ME_CONFIG_MONGODB_ENABLE_ADMIN est false alors l'utilisateur définit va ME_CONFIG_MONGODB_AUTH_USERNAME et ME_CONFIG_MONGODB_AUTH_PASSWORD ne pourra pas voir toutes les bases de données.
Risque d'erreur : MongoError: not authorized on admin to execute command { listDatabases: 1 }


Attention ! Si ME_CONFIG_MONGODB_ENABLE_ADMIN est a true alors, il sera possible d'effectuer des actions critiques via mongo-express.
En dev : J'utilise ME_CONFIG_MONGODB_ADMINUSERNAME + compte root


Variables d'environnement #

Name Default Description
ME_CONFIG_BASICAUTH_USERNAME '' mongo-express web username
ME_CONFIG_BASICAUTH_PASSWORD '' mongo-express web password
ME_CONFIG_MONGODB_ENABLE_ADMIN 'true' Enable admin access to all databases. Send strings: "true" or "false"
ME_CONFIG_MONGODB_ADMINUSERNAME '' MongoDB admin username
ME_CONFIG_MONGODB_ADMINPASSWORD '' MongoDB admin password
ME_CONFIG_MONGODB_PORT 27017 MongoDB port
ME_CONFIG_MONGODB_SERVER 'mongo' MongoDB container name
ME_CONFIG_OPTIONS_EDITORTHEME 'default' mongo-express editor color theme, more here
ME_CONFIG_REQUEST_SIZE '100kb' Maximum payload size. CRUD operations above this size will fail in body-parser.
ME_CONFIG_SITE_BASEURL '/' Set the baseUrl to ease mounting at a subdirectory. Remember to include a leading and trailing slash.
ME_CONFIG_SITE_COOKIESECRET 'cookiesecret' String used by cookie-parser middleware to sign cookies.
ME_CONFIG_SITE_SESSIONSECRET 'sessionsecret' String used to sign the session ID cookie by express-session middleware.
ME_CONFIG_SITE_SSL_ENABLED 'false' Enable SSL.
ME_CONFIG_SITE_SSL_CRT_PATH '' SSL certificate file.
ME_CONFIG_SITE_SSL_KEY_PATH '' SSL key file.
Mots clés : devops mongodb experiments
Auteur : Allemand Sébastien