4 votes

Passer les paramètres SSM au projet CodeBuild en toute sécurité

J'ai un projet CodeBuild avec un buildspec qui nécessite la valeur du mot de passe de la base de données pour fonctionner. Je veux que ce buildspec soit indépendant de l'environnement, mais chaque environnement nécessite un mot de passe de base de données différent. La valeur du mot de passe de la base de données pour chaque environnement est stockée dans le magasin SSM sous sa propre clé.

Quelle serait la meilleure approche pour transmettre le mot de passe de la base de données au projet CodeBuild dans ce scénario ?

En utilisant l'interface de CodeBuild env.parameter-store

Il semble que l'approche recommandée soit d'utiliser la solution intégrée de CodeBuild ( env.parameter-store ), mais alors je devrai charger des mots de passe pour chaque environnement et ensuite sélectionner un mot de passe dans le script de la construction :

# Supported Variables
#---------------------
# - ENVIRONMENT
#

version: 0.2

env:
  parameter-store:
    DB_PASSWORD_PROD: "/acme/prod/DB_PASSWORD"
    DB_PASSWORD_STAGE: "/acme/stage/DB_PASSWORD"
    DB_PASSWORD_QA: "/acme/qa/DB_PASSWORD"

phases:
  build:
    commands:
      - |-
        case "${ENVIRONMENT}" in
         "prod") DB_PASSWORD="${DB_PASSWORD_PROD}" ;;
         "stage") DB_PASSWORD=${DB_PASSWORD_STAGE} ;;
         "qa") DB_PASSWORD=${DB_PASSWORD_QA} ;;
        esac
      - echo "Doing something with \$DB_PASSWORD…"

Cela nécessitera trois requêtes au SSM et rendra buildspec plus complexe. Cette approche me semble sous-optimale.

Il existe peut-être un moyen de construire une clé SSM à l'aide de la variable ENVIRONMENT dans le système de gestion de l'information. env.parameter-store ?

Passer les paramètres SSM à partir de CodePipeline

L'autre approche serait de passer le mot de passe du CodePipeline comme une variable d'environnement directement au projet CodeBuild. Cela simplifiera considérablement le buildspec. Mais est-ce sûr du point de vue de la sécurité ?

Obtenir les paramètres SSM manuellement dans le script de CodeBuild

Serait-il préférable d'appeler SSM depuis le script manuellement pour charger la valeur requise ?

# Supported Variables
#---------------------
# - ENVIRONMENT
#

version: 0.2

phases:
  build:
    commands:
      - >-
        DB_PASSWORD=$(
          aws ssm get-parameter
          --name "/acme/${ENVIRONMENT}/DB_PASSWORD"
          --with-decryption
          --query "Parameter.Value"
          --output text
        )
      - echo "Doing something with \$DB_PASSWORD…"

Cette approche serait-elle plus sûre ?

5voto

Slava Fomin II Points 1141

Utilisation du magasin de paramètres env.de CodeBuild

Regarder documentation Il n'existe aucun moyen de construire dynamiquement la clé de paramètres SSM et le préchargement des paramètres pour chaque environnement est tout simplement erroné. Cela affecterait les performances et aurait un effet négatif sur les limites de débit de l'API, tout en rendant l'audit de sécurité plus difficile.

Obtenir les paramètres SSM manuellement dans le script de CodeBuild

Je suppose que cela pourrait fonctionner, mais cela rendra le script plus complexe et le couplerait également plus étroitement au magasin de paramètres SSM, car il devra connaître le magasin SSM et la structure des noms de clés.

Passer les paramètres SSM à partir de CodePipeline

Regarder documentation il existe un type de variable d'environnement spécifique appelé PARAMETER_STORE . Cela permet d'obtenir la valeur de la mémoire de paramètres SSM avant d'invoquer le projet de construction de CodeBuild.

Je pense que c'est la manière la plus propre d'atteindre le résultat souhaité et cela ne devrait pas affecter la sécurité de manière négative, car le paramètre ne serait résolu par CodePipeline que lors de l'invocation du projet de construction :

- Name: stage-stage
  Actions:
    - Name: stage-stage-action
      RunOrder: 1
      ActionTypeId:
        Category: Build
        Provider: CodeBuild
        Owner: AWS
        Version: "1"
      Configuration:
        ProjectName: !Ref BuildProject
        EnvironmentVariables: |-
          [{
            "type":"PARAMETER_STORE",
            "name":"DB_PASSWORD",
            "value":"/acme/stage/DB_PASSWORD"
          }]

- Name: prod-stage
  Actions:
    - Name: prod-stage-action
      RunOrder: 1
      ActionTypeId:
        Category: Build
        Provider: CodeBuild
        Owner: AWS
        Version: "1"
      Configuration:
        ProjectName: !Ref BuildProject
        EnvironmentVariables: |-
          [{
            "type":"PARAMETER_STORE",
            "name":"DB_PASSWORD",
            "value":"/acme/prod/DB_PASSWORD"
          }]

- Name: qa-stage
  Actions:
    - Name: qa-stage-action
      RunOrder: 1
      ActionTypeId:
        Category: Build
        Provider: CodeBuild
        Owner: AWS
        Version: "1"
      Configuration:
        ProjectName: !Ref BuildProject
        EnvironmentVariables: |-
          [{
            "type":"PARAMETER_STORE",
            "name":"DB_PASSWORD",
            "value":"/acme/qa/DB_PASSWORD"
          }]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X