12  Les bonnes pratiques de gestion de variables secrètes

12.1 Gestion des secrets en environnement local

Il est crucial de ne jamais écrire directement vos identifiants et mots de passe dans votre code source. Pour sécuriser ces informations sensibles, utilisez des variables d’environnement.

Il existe deux approches principales :

  1. Fichier .Renviron par projet :
    • Créez un fichier .Renviron à la racine de votre projet
    • Ajoutez ce fichier à .gitignore pour éviter tout commit accidentel
    • Recommandé pour des configurations spécifiques au projet
  2. Fichier .Renviron global (recommandé) :
    • Ouvrez le fichier avec la commande R :

      usethis::edit_r_environ()
    • Ajoutez vos variables selon la syntaxe :

      INRAE_LDAP="monldap"
      INRAE_PW="monmdp"
    • Accédez aux variables dans R avec :

      Sys.getenv("INRAE_LDAP")

12.2 Gestion des secrets dans SK8

12.2.1 Configuration des variables secrètes dans ForgeMIA

  1. Accédez à Settings -> CI/CD -> Variables sur votre repo dans ForgeMIA
  2. Important : Activez l’option “Masked” pour sécuriser la variable
  3. Pour plus de sécurité, consultez la documentation officielle sur les secrets GitLab

12.2.2 Transmission des variables à Docker

12.2.2.1 Configuration du pipeline CI/CD

Pour passer des variables secrètes lors de la construction de l’image Docker en réécrivant cette partie dans votre .gitlab-ci.yml. Pour ce faire, vous pouvez dupliquer le job Construire-l-application disponible ici ou juste réécrire la partie script de ce job (pour bénéficier d’éventuelles mises à jour du job par défaut SK8).

Par exemple ici avec $VOTRE_VARIABLE_CACHE :

🏗 Construire-l-application:
  script:
    - docker pull $CI_REGISTRY_IMAGE/$CI_COMMIT_BRANCH:latest || true
    - docker build --build-arg NOM_VARIABLE="$VOTRE_VARIABLE_CACHE" 
                   --build-arg APP_NAME=$CI_PROJECT_NAME 
                   --build-arg APP_VERSION="SK8-$CI_COMMIT_SHORT_SHA" 
                   --build-arg AUTHOR="$CI_COMMIT_AUTHOR" 
                   --build-arg R_IMAGE="$R_DOCKER_IMAGE:$R_DOCKER_TAG_VAL" 
                   --build-arg RENV_VERSION="$RENV_VERSION_VAL" 
                   --cache-from $CI_REGISTRY_IMAGE/$CI_COMMIT_BRANCH:latest 
                   --tag $CI_REGISTRY_IMAGE/$CI_COMMIT_BRANCH:$CI_COMMIT_SHA 
                   --tag $CI_REGISTRY_IMAGE/$CI_COMMIT_BRANCH:latest 
                   -f Dockerfile .
    - docker push $CI_REGISTRY_IMAGE/$CI_COMMIT_BRANCH:$CI_COMMIT_SHA
    - docker push $CI_REGISTRY_IMAGE/$CI_COMMIT_BRANCH:latest

ou encore, avec un exemple pratique, en supposant que ma variable cachée s’appelle myVarCache :

myVarCache = "blablablabla_ceciestunmotdepasse"
🏗 Construire-l-application:
  script:
    - docker pull $CI_REGISTRY_IMAGE/$CI_COMMIT_BRANCH:latest || true
    - docker build --build-arg myVarCache="$myVarCache" 
                   --build-arg APP_NAME=$CI_PROJECT_NAME 
                   --build-arg APP_VERSION="SK8-$CI_COMMIT_SHORT_SHA" 
                   --build-arg AUTHOR="$CI_COMMIT_AUTHOR" 
                   --build-arg R_IMAGE="$R_DOCKER_IMAGE:$R_DOCKER_TAG_VAL" 
                   --build-arg RENV_VERSION="$RENV_VERSION_VAL" 
                   --cache-from $CI_REGISTRY_IMAGE/$CI_COMMIT_BRANCH:latest 
                   --tag $CI_REGISTRY_IMAGE/$CI_COMMIT_BRANCH:$CI_COMMIT_SHA 
                   --tag $CI_REGISTRY_IMAGE/$CI_COMMIT_BRANCH:latest 
                   -f Dockerfile .
    - docker push $CI_REGISTRY_IMAGE/$CI_COMMIT_BRANCH:$CI_COMMIT_SHA
    - docker push $CI_REGISTRY_IMAGE/$CI_COMMIT_BRANCH:latest

12.2.2.2 Configuration du Dockerfile

Afin d’intégrer ces variables dans votre application (et les rendre donc accessibles via Sys.getenv()), il faudra personnaliser votre Dockerfile. Si vous n’en disposez pas, vous devrez alors récupérer le Dockerfile généré à la volée par SK8 lors de la construction de l’application en suivant la procédure décrite sur cette page, puis rajouter l’appel vers vos variables dans ce Dockerfile avant de l’inclure dans votre répertoire contenant l’application.

Par exemple ici toujours avec $VOTRE_VARIABLE_CACHE :

ARG VOTRE_VARIABLE_CACHE
ENV VOTRE_VARIABLE_CACHE $VOTRE_VARIABLE_CACHE

et dans notre exemple pratique avec myVarCache:

ARG myVarCache
ENV myVarCache $myVarCache

12.3 Utilisation dans une application Shiny

Pour accéder aux variables d’environnement dans votre application Shiny :

secret_value <- Sys.getenv("VOTRE_VARIABLE_CACHE")

12.4 Bonnes pratiques de sécurité

  • Vérifiez toujours que les fichiers contenant des secrets sont dans .gitignore
  • Utilisez des noms de variables explicites mais ne révélant pas d’information sensible
  • Privilégiez les variables masquées dans GitLab CI/CD
  • Effectuez une rotation régulière des secrets
  • Limitez l’accès aux variables secrètes aux seuls utilisateurs nécessaires

12.5 Ressources complémentaires