Gérer et centraliser vos secrets avec AWS SSM Parameter Store

Ahmadou Bamba Diagne
5 min readAug 8, 2024

--

Bonjour cher lecteur,

Aujourd'hui nous allons parler de la gestion des secrets qui est un thème central dans le développement logiciel et dans les processus DevOps. En effet, lors des développements, nous manipulons généralement plusieurs secrets(clés d’API, identifiants de base de données,…) qui peuvent être perdus ou volés, c’est pourquoi il est important de savoir comment les gérer. Imaginez que vous stockez vos secrets directement dans votre code, lors d’une fuite ou d’un accès non autorisé, tous vos identifiants seraient à la merci des attaquants. Bien que la plupart utilisent un fichier .env qui contient ces secrets et ne l’incluent dans les solutions de gestion de code (Github,Gitlab,Bitbucket…),le partage et la mise à jour des changements peuvent s’avérer difficile lorsque les projets vont se multiplier.

Il existe des outils appelés gestionnaire de secrets qui permettent de centraliser la gestion de ces secrets garantissant la confidentialité et la disponibilité. On pourrait citer Vault,AWS Secrets Manager, AWS SSM Parameter Store

J’ai opté pour la dernière solution car étant la plus simple en termes d’implémentation et de coût(possibilité de chiffrer ou non les secrets au repos, paramètres standards gratuits).

AWS Systems Manager Parameter Store

D’après la définition donnée par AWS,

Parameter Store, une fonctionnalité d’AWS Systems Manager, fournit un stockage sécurisé et hiérarchique pour la gestion des données de configuration et la gestion des secrets. Vous pouvez stocker des données telles que des mots de passe, des chaînes de base de données, des ID Amazon Machine Image (AMI) et des codes de licence en tant que valeurs de paramètre. Vous pouvez stocker des valeurs sous forme de texte brut ou de données chiffrées. Vous pouvez référencer les paramètres Systems Manager dans vos scripts, commandes, documents SSM et flux de travail de configuration et d’automatisation en utilisant le nom unique que vous avez spécifié lors de la création du paramètre.

Pour des raisons de sécurité, nous allons mettre en place des politiques pour restreindre l’accès à ces secrets en utilisant un autre service d’AWS nommé IAM qui va nous permettre de gérer tout ce qui est authentification et autorisation aux services AWS, alors dans notre démonstration nous essayerons de séparer les secrets selon nos environnements(dev,prod,…) dans un petit projet node.js.

Entrons dans le vif du sujet.

Configuration AWS cli

Déjà pour avoir accès aux services AWS dans notre projet, nous aurons besoin d’un accès programmatique et pour ce faire nous utiliserons AWS CLI

Pour ce faire exportez vos clés d’accès(Access key ID,Secret access key) et tapez la commande:

aws configure

Renseignez les identifiants:

Vous pouvez aussi le faire en référençant les clés d’accès dans votre code.

Configuration serveur node.js

Regardons de plus près notre structure de projet node.js:

Lors de l’instanciation de notre classe App dans le fichier app.ts, on charge les clés(secrets):

Et voici ce que contient notre classe Config:

import {
SSMClient,
GetParametersByPathCommand,
Parameter,
} from "@aws-sdk/client-ssm";

const ssmClient = new SSMClient({
region: process.env.AWS_REGION,
});

export class ConfigService {
static async getAllParameters(environment: string): Promise<void> {
const path = `/${environment}/`;
let parameters: Parameter[] = [];
let nextToken: string | undefined;

do {
const command = new GetParametersByPathCommand({
Path: path,
Recursive: true,
WithDecryption: true,
NextToken: nextToken,
});

try {
const response = await ssmClient.send(command);
if (response.Parameters) {
parameters = parameters.concat(response.Parameters);
}
nextToken = response.NextToken;
} catch (error: any) {
throw new Error(`Error fetching parameters: ${error.message}`);
}
} while (nextToken);

parameters.forEach((param) => {
const envName = param.Name!.split(path)[1];
process.env[envName] = param.Value;
});
}
}

Voici le code qui nous permet de récupérer les secrets contenus dans Parameter Store, on aura besoin de la région AWS où on a créé ces clés.

Création de secrets Parameter Store et configuration des autorisations IAM

Maintenant essayons de créer des clés dans Parameter Store en suivant ces étapes:

  1. Dans la console AWS, tapez Parameter Store.
  2. Dans Parameter Store, cliquez sur “Créer un paramètre”.
  3. Vos noms de secrets doivent commencer par une barre oblique et un préfixe pour différencier les environnements et éventuellement les projets.

J’ai pris comme type “Chaine sécurisée” ce qui permet de chiffrer le secret au repos et tous les types de chaines sont chiffrés par défaut dans le transit AWS vers le client.

Attaquons la partie la plus importante à savoir comment configurer l’accès à ces paramètres en utilisant le Service IAM.

  1. Tapez IAM sur la barre de recherche de la console AWS
  2. Dans la partie gestion des accès, créez une politique qui va accorder les permissions pour récupérer les secrets.
  3. Dans l’éditeur de politiques ,insérez ces lignes:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ssm:GetParametersByPath",
"ssm:GetParameters"
],
"Resource": "arn:aws:ssm:*:ACCOUNT_ID:parameter/dev/*"
}
]
}

Changez ACCOUNT_ID par l’ID de votre compte.

4. Nommez cette politique SSMGetParametersDevOnly et finalisez la création.

Étant donné que notre objectif est de permettre aux développeurs d’accéder à ces paramètres dev en lecture seule, nous allons attacher cette politique à un groupe nommé Developpers.

5. Dans la partie gestion des accès, créez un groupe Developpers

6. Ajoutez-y les utilisateurs qui sont développeurs et dans la partie politique d’autorisations ,recherchez SSMGetParametersDevOnly et ajoutez le.

La configuration est terminée, nous allons tester dans notre serveur node.js.

Nous allons afficher les paramètres dans les logs du serveur, ce n’est pas du tout recommandé mais c’est juste pour les tests.

J’espère que l’article vous sera utile.

#devops #security #programming

--

--

Ahmadou Bamba Diagne
Ahmadou Bamba Diagne

Written by Ahmadou Bamba Diagne

Full Stack Developer | Devops Enthusiast & CTF Player | AWS Certified Cloud Practitioner

No responses yet