12  Les bonnes pratiques de gestion de variables secrètes

Il y a plusieurs cas possible :

  1. Vous travaillez en local, vous voulez déjà tester le fonctionnement avec des variables d’environnement.
  2. Vous avez une application sur SK8 SANS Dockerfile
  3. Vous avez une application sur SK8 AVEC Dockerfile

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.0.1 Configuration des variables secrètes dans la forge

  1. Accédez à Settings -> CI/CD -> Variables sur votre repo dans la forge INRAE
  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.0.2 Passer les valeurs des variables secrètes à votre application

Par exemple je veux faire passer deux variables, MY_ID et MY_SECRET_KEY, à mon application.

Vous pouvez modifier le fichier .gitlab-ci-sk8.yml pour ajouter la variable CUSTOM_SECRET_VARS (séparer les noms des variables par des espaces):

  CUSTOM_SECRET_VARS: "MY_ID MY_SECRET_KEY"

Normalement lors de la construction de votre application, celle-ci devrait recevoir les valeurs des variables secrètes.

A noter que les valeurs des variables ne sont visibles que sur les branches protégées. Si vous utilisez une autre branche que main pour tester vos développements, il faudra protéger la branche pour qu’elle reçoive les variables secrètes.

12.0.3 Configuration des variables secrètes dans la forge

  1. Accédez à Settings -> CI/CD -> Variables sur votre repo dans la forge INRAE
  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.0.4 Transmission des variables à Docker

12.0.4.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 sur les templates SK8 ou juste réécrire la partie script de ce job (pour bénéficier d’éventuelles mises à jour du job par défaut SK8).

Mettons que dans vos variables de CI/CD vous avez défini deux variables MY_ID et MY_SECRET_KEY. Vous devrez alors copier le code ci-dessous dans votre fichier .gitlab-ci.yml

🏗 Construire-l-application:
  script:
    - docker pull $CI_REGISTRY_IMAGE/$CI_COMMIT_BRANCH:latest || true
    - docker build --build-arg MY_ID="$MY_ID" --build-arg MY_SECRET_KEY="$MY_SECRET_KEY" --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

Mettez autant de --build-arg que vous voulez faire passer de variable.

12.0.4.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 $MY_ID :

ARG MY_ID
ENV MY_ID $MY_ID

ARG MY_SECRET_KEY
ENV MY_SECRET_KEY $MY_SECRET_KEY

12.1 Utilisation dans une application Shiny

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

secret_id <- Sys.getenv("MY_ID")
secret_key <- Sys.getenv("MY_SECRET_KEY")

12.2 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.3 Ressources complémentaires