From b2e56cbc88a13dd04be58a7fb07231ad8623c0f0 Mon Sep 17 00:00:00 2001 From: bridja Date: Thu, 4 Dec 2025 09:58:02 +0100 Subject: [PATCH] Add: Add IAM --- iam-step.md | 90 ++++++++++++++++++++++++++++++++ terraform/modules/iam/outputs.tf | 10 ++++ 2 files changed, 100 insertions(+) create mode 100644 iam-step.md diff --git a/iam-step.md b/iam-step.md new file mode 100644 index 0000000..e9d2992 --- /dev/null +++ b/iam-step.md @@ -0,0 +1,90 @@ +# TP : Gestion des Identités (IAM) et Accès SSH + +Dans cette partie, vous allez configurer les accès pour que Terraform puisse interagir avec le projet et pour que vous puissiez vous connecter aux futures machines virtuelles. + +## Objectifs +1. Créer une identité machine (Service Account). +2. Lui donner des droits sur le projet. +3. Configurer votre propre clé SSH via le service **OS Login** de GCP. + +--- + +## Étape 1 : Créer l'identité machine +**Objectif :** Créer un compte de service (Service Account) qui sera utilisé par nos scripts d'automatisation. + +* **Ressource à utiliser :** `google_service_account` +* **Consignes :** + * Donnez-lui l'ID `terraform`. + * Ajoutez un `display_name` explicite pour qu'on le reconnaisse dans la console GCP. + +## Étape 2 : Générer une clé d'accès +**Objectif :** Pour utiliser ce compte de service depuis l'extérieur (ou via Terraform), nous avons besoin d'une clé. + +* **Ressource à utiliser :** `google_service_account_key` +* **Consignes :** + * Vous devez lier cette ressource au compte de service créé à l'étape 1 via son attribut `name` (ex: `google_service_account.votre_nom.name`). + * Définissez le type de clé publique sur `"TYPE_X509_PEM_FILE"`. + +## Étape 3 : Donner des droits (IAM) +**Objectif :** Un compte de service naît sans aucun droit. Vous devez lui donner le rôle de "Viewer" sur le projet pour qu'il puisse lire les ressources. + +* **Ressource à utiliser :** `google_project_iam_binding` +* **Consignes :** + * **Project :** Utilisez votre variable `var.project_id`. + * **Role :** Le rôle cible est `"roles/viewer"`. + * **Members :** C'est une liste. Attention à la syntaxe spécifique GCP pour désigner un membre : `"serviceAccount:..."`. Vous devez concaténer ce préfixe avec l'email du service account créé à l'étape 1 (`.email`). + +## Étape 4 : Récupérer votre identité +**Objectif :** Terraform doit savoir "qui" lance le script actuellement pour associer la clé SSH à la bonne personne. + +* **Data Source à utiliser :** `data "google_client_openid_userinfo"` +* **Consignes :** + * Déclarez simplement ce bloc `data` avec le nom `me`. Il n'a pas besoin d'arguments à l'intérieur. Il servira juste à récupérer votre email dynamiquement. + +## Étape 5 : Ajouter votre clé SSH (OS Login) +**Objectif :** Uploader votre clé publique SSH locale vers GCP pour permettre la connexion aux VMs sans gestion manuelle. + +* **Ressource à utiliser :** `google_os_login_ssh_public_key` +* **Consignes :** + * **User :** Utilisez l'email récupéré grâce au data source de l'étape 4 (`.email`). + * **Key :** Vous devez lire le contenu de votre fichier de clé publique locale. + * **Fonction Terraform :** Utilisez la fonction `file("chemin/vers/la/clé")`. + * **Chemin recommandé :** `~/.ssh/id_ed25519.pub`. + +> **Attention :** Vérifiez impérativement que vous avez bien généré une clé SSH sur votre poste local avant de lancer le `terraform apply`. Sinon, Terraform ne trouvera pas le fichier et plantera. + +--- + +### Résumé des liens entre ressources +Assurez-vous que vos ressources se référencent correctement : +* La **Clé** référencie le **Service Account**. +* L'**IAM Binding** référencie le **Service Account**. +* L'**OS Login** référencie le **Data User Info**. + +Voici la suite du document Markdown (MD) à ajouter à la suite de l'étape 5. + +--- + +## Étape 6 : Exposer les résultats (Outputs) + +**Objectif :** Une fois le déploiement terminé, Terraform masque par défaut certaines informations. Nous devons définir explicitement quelles valeurs nous voulons voir ou récupérer (notamment pour les utiliser dans d'autres scripts). + + * **Fichier à utiliser :** `outputs.tf` (c'est une bonne pratique de séparer les outputs du `main.tf`). + +### Consigne A : L'email du Service Account + +Nous aurons besoin de connaître l'adresse email complète générée par Google pour ce compte. + + * Créez un output nommé `service_account_email`. + * Dans la valeur (`value`), référencez l'attribut `.email` de la ressource créée à l'**Étape 1**. + +### Consigne B : La Clé Privée (Attention Sécurité) + +Nous devons récupérer la clé privée générée pour pouvoir authentifier des applications externes. + + * Créez un output nommé `service_account_key`. + * Dans la valeur, référencez l'attribut `.private_key` de la ressource créée à l'**Étape 2**. + * **Important :** Terraform refusera d'afficher cette valeur ou l'affichera en clair dans vos logs si vous ne faites pas attention. Vous **devez** ajouter l'argument suivant dans ce bloc output pour masquer la valeur dans le terminal : + ```hcl + sensitive = true + ``` diff --git a/terraform/modules/iam/outputs.tf b/terraform/modules/iam/outputs.tf index e69de29..91f33d3 100644 --- a/terraform/modules/iam/outputs.tf +++ b/terraform/modules/iam/outputs.tf @@ -0,0 +1,10 @@ +output "service_account_email"{ + description = "Service account email" + value = google.service.account.myaccount.email +} + +output "service_account_key"{ + description = "Service key" + sensitive = true + value = google.service.account.mykey.private_key +} \ No newline at end of file