From 21ceddebfa9951d3e11815b3416536505addd0f7 Mon Sep 17 00:00:00 2001 From: Quentin Duchemin <quentinduchemin@tuta.io> Date: Fri, 3 Jan 2020 15:20:26 +0100 Subject: [PATCH] Add secrets management --- pica-db-backup/README.md | 36 +++++++++++++++++++++-- pica-db-backup/backup_env_var.py | 19 ++++++++---- pica-db-backup/docker-compose.yml | 2 ++ pica-db-backup/secrets/db.secrets.example | 3 ++ 4 files changed, 52 insertions(+), 8 deletions(-) create mode 100644 pica-db-backup/secrets/db.secrets.example diff --git a/pica-db-backup/README.md b/pica-db-backup/README.md index 86790248..4e7006a1 100644 --- a/pica-db-backup/README.md +++ b/pica-db-backup/README.md @@ -6,10 +6,29 @@ Il est capable de gérer les bases de données `postgres`, `mysql` ou `mongo` po Il est flexible et se configure via des fichiers JSON. +<!-- TOC depthFrom:2 depthTo:6 withLinks:1 updateOnSave:1 orderedList:0 --> + +- [Lancement](#lancement) +- [Configuration](#configuration) + - [Structure](#structure) + - [Gestion des secrets](#gestion-des-secrets) + - [Exemple](#exemple) + +<!-- /TOC --> + ## Lancement On se synchronise simplement avec le dépôt et on lance le Docker Compose. -Docker Compose sélectionne automatiquement le bon fichier de configuration en fonction du nom d'hôte de la machine virtuelle, il n'y a donc rien à modifier. + +On copie `secrets/db.secrets.example` dans `secrets/db.secrets` : +* On assigne le nom de la VM à `HOSTNAME` (*e.g.* `pica02`), +* On renseigne les secrets (voir [plus bas]((#gestion-des-secrets))) + +Docker Compose sélectionne automatiquement le bon fichier de configuration en fonction du nom d'hôte de la machine virtuelle, il n'y a donc rien à modifier : + +``` +$ docker-compose up -d +``` ## Configuration @@ -26,6 +45,8 @@ On veillera à ce que les noms d'hôte correspondent bien aux noms des conteneur - "Host" : Indique l'hôte de la base de données - "Port" : Indique le port pour se connecter au service - "Database" : Indique le nom de la base de données + - "User" : Nom d'utilisateur ou nom d'une variable d'environnement (optionnel) + - "Password" : Mot de passe ou nom d'une variable d'environnement (optionnel) - "Folder" : Indique le nom du dossier de backup utilisé par le script de backup et de rotation - "Cron" : Indique la fréquence de temps à laquelle les backups sont effectués par le script de rotation au format cron - "Init-Backup" : Indique si un backup doit être effectué au démarrage du service, en plus de la programmation du cron @@ -35,6 +56,15 @@ On veillera à ce que les noms d'hôte correspondent bien aux noms des conteneur - "Week" : nombre de backups hebdomadaires à conserver - "Month": nombre de backups mensuels à conserver +### Gestion des secrets + +Afin de pouvoir versionner les fichiers de configuration sans exposer les identifiants aux bases de données, on utilise le système suivant : +* Dans le JSON, on utilise un nom de variable d'environnement à la place de l'identifant, **sans le $**, *e.g.* `ETHERPAD_DB_USER`. +* Dans le fichier `db.secrets`, on renseigne la valeur de cette variable d'environnement. + +La substitution est effectué automatiquement par l'outil. + + ### Exemple ```json @@ -60,8 +90,8 @@ On veillera à ce que les noms d'hôte correspondent bien aux noms des conteneur { "Host": "etherpad-db", "Port": "3306", - "User": "root", - "Password": "lolilolilol", + "User": "ETHERPAD_DB_USER", + "Password": "ETHERPAD_DB_PASSWORD", "Database": "--all-databases", "Type": "mysql", "Folder": "etherpad", diff --git a/pica-db-backup/backup_env_var.py b/pica-db-backup/backup_env_var.py index e96491cd..475be9d2 100755 --- a/pica-db-backup/backup_env_var.py +++ b/pica-db-backup/backup_env_var.py @@ -37,6 +37,7 @@ if not(os.path.isfile(PATH_TO_CONFIG)): # Variables initialization open_config_file = open(PATH_TO_CONFIG) services_list = json.load(open_config_file) +services_list = {k: os.environ.get(k, v) for k, v in olddata.items()} flag_mongo = False flag_mysql = False flag_postgres = False @@ -44,7 +45,7 @@ flag_postgres = False for service in services_list: if services_list[service]["Type"] == "mongo": - # Mongo DB handling + # Mongo DB handling add_value_to_key(service,"MONGO_SERVICE_NAME_LIST") add_value_to_key(services_list[service]["Host"],"MONGO_HOST_LIST") add_value_to_key(services_list[service]["Port"],"MONGO_PORT_LIST") @@ -62,8 +63,12 @@ for service in services_list: add_value_to_key(service,"MYSQL_SERVICE_NAME_LIST") add_value_to_key(services_list[service]["Host"],"MYSQL_HOST_LIST") add_value_to_key(services_list[service]["Port"],"MYSQL_PORT_LIST") - add_value_to_key(services_list[service]["User"],"MYSQL_USER_LIST") - add_value_to_key(services_list[service]["Password"],"MYSQL_PASS_LIST") + user = services_list[service]["User"] + user = os.environ[user] if user in os.environ + add_value_to_key(user,"MYSQL_USER_LIST") + password = services_list[service]["Password"] + password = os.environ[password] if password in os.environ + add_value_to_key(password,"MYSQL_PASS_LIST") add_value_to_key(services_list[service]["Database"],"MYSQL_DB_LIST") add_value_to_key(services_list[service]["Init-Backup"],"MYSQL_INIT_BACKUP_LIST") add_value_to_key(services_list[service]["Cron"],"MYSQL_CRON_TIME_LIST") @@ -79,8 +84,12 @@ for service in services_list: add_value_to_key(service,"POSTGRES_SERVICE_NAME_LIST") add_value_to_key(services_list[service]["Host"],"POSTGRES_HOST_LIST") add_value_to_key(services_list[service]["Port"],"POSTGRES_PORT_LIST") - add_value_to_key(services_list[service]["User"],"POSTGRES_USER_LIST") - add_value_to_key(services_list[service]["Password"],"POSTGRES_PASS_LIST") + user = services_list[service]["User"] + user = os.environ[user] if user in os.environ + add_value_to_key(user,"POSTGRES_USER_LIST") + password = services_list[service]["Password"] + password = os.environ[password] if password in os.environ + add_value_to_key(password,"POSTGRES_PASS_LIST") add_value_to_key(services_list[service]["Database"],"POSTGRES_DB_LIST") add_value_to_key(services_list[service]["Init-Backup"],"POSTGRES_INIT_BACKUP_LIST") add_value_to_key(services_list[service]["Cron"],"POSTGRES_CRON_TIME_LIST") diff --git a/pica-db-backup/docker-compose.yml b/pica-db-backup/docker-compose.yml index c64e4214..844269bd 100644 --- a/pica-db-backup/docker-compose.yml +++ b/pica-db-backup/docker-compose.yml @@ -13,6 +13,8 @@ services: - /DATA/BACKUP/:/backup/ - ./config/${HOSTNAME}.json:/config/backup_data.json - /etc/localtime:/etc/localtime:ro + env_file: + - ./secrets/db.secrets networks: - docker_default restart: always diff --git a/pica-db-backup/secrets/db.secrets.example b/pica-db-backup/secrets/db.secrets.example new file mode 100644 index 00000000..9863a0b5 --- /dev/null +++ b/pica-db-backup/secrets/db.secrets.example @@ -0,0 +1,3 @@ +HOSTNAME=pica02 +ETHERPAD_DB_USER=test +ETHERPAD_DB_PASSWORD=test -- GitLab