Aller au contenu
English
Cloud medium

IAM Scaleway : donner le droit minimal à une CI, et le prouver

Mesuré live le ·fr-par·scw 2.56.3

65 min de lecture

logo Scaleway

Une chaîne d'intégration qui déploie avec une clé d'administration est la faille la plus banale d'un compte cloud, et la plus facile à refermer. Cette leçon pose le modèle IAM de Scaleway en cinq briques, puis vous fait construire l'identité d'une CI Terraform limitée à un seul Project, avec une clé qui expire. Vous terminerez par l'étape que presque personne ne fait : prouver que la restriction tient, par une écriture refusée puis dans Audit Trail, en découvrant au passage qu'une lecture interdite ne renvoie pas une erreur.

  • Distinguer un utilisateur d'une application, et savoir lequel porte une clé.
  • Composer une politique à partir d'un principal, de jeux de permissions et d'une portée.
  • Créer une clé API qui expire, parce que votre organisation peut l'exiger.
  • Vérifier une restriction par une écriture, jamais par une lecture, puis la retrouver dans Audit Trail.
  • Nettoyer sans toucher aux rôles gérés par Scaleway.

Tout se ramène à une phrase : une politique donne à un principal des jeux de permissions sur une portée, éventuellement sous condition. Retenez ces cinq mots et vous saurez lire n'importe quelle configuration IAM Scaleway.

BriqueCe que c'estExemple concret
Principalqui reçoit les droitsune utilisatrice, une application, un groupe
Jeu de permissionsce qu'on a le droit de faireInstancesFullAccess, BillingReadOnly
Portéeoù ces droits s'appliquentun Project précis, plusieurs, ou toute l'Organization
Conditionsous quelle réserveseulement depuis une adresse IP, avant une date, ou sur une ressource précise
Politiquel'objet qui assemble le toutune ou plusieurs règles, un seul principal

Une contrainte structure toute votre organisation IAM : une politique ne porte qu'un seul principal. Vous ne pouvez pas attacher la même politique à trois personnes. Pour un droit partagé, la réponse est un groupe : on écrit la politique une fois, on l'attache au groupe, et on gère ensuite les entrées et les sorties de personnes. Deux groupes gérés existent depuis le 2 septembre 2026, All Users et All Applications, à membres dynamiques : commodes pour une lecture partagée, dangereux pour tout ce qui écrit, puisque chaque nouveau membre en hérite. Une politique ne sait qu'accorder : il n'existe pas de règle « interdire », le point de départ de tout principal est zéro droit, et une modification met jusqu'à une minute à s'appliquer.

Regardez ce que votre organisation propose comme vocabulaire de permissions, c'est le catalogue dans lequel vous piocherez :

Fenêtre de terminal
scw iam permission-set list -o json \
| python3 -c 'import sys,json; d=json.load(sys.stdin); print(len(d), "jeux disponibles"); [print(" ", p["name"]) for p in d if p["name"].startswith("Instances")]'

La sortie doit afficher le nombre de jeux, puis les quatre jeux Instances (InstancesFullAccess, InstancesReadOnly, InstancesServerStart, InstancesServerStop). Relevé le 2026-09-08 avec scw 2.56.3 : le catalogue compte 179 jeux de permissions, et il en comptait 178 quelques heures plus tôt le même jour : ce nombre bouge à chaque produit ajouté, relancez la commande plutôt que de le retenir. Leurs noms se lisent seuls : InstancesReadOnly autorise la lecture, InstancesFullAccess tout le reste. C'est volontairement plus grossier qu'une permission unitaire, et c'est ce qui rend l'ensemble utilisable.

Utilisateur ou application : qui doit porter la clé API ?

Section intitulée « Utilisateur ou application : qui doit porter la clé API ? »

Un utilisateur est une personne, une application est un robot. La distinction n'est pas cosmétique : une application n'a aucun accès à la console, elle n'existe que par sa clé API. C'est exactement ce qu'on veut pour une chaîne d'intégration.

UtilisateurApplication
Correspond àune personneun programme, une CI, un script
Accès à la consoleouinon, jamais
S'authentifie parmot de passe, deuxième facteur, clé APIclé API uniquement
Ce qu'on fait à son départon le retire de l'Organizationon supprime l'application et sa clé
Quota par Organization50100

Le tableau se lit par la colonne Choix : trouvez le besoin, il dit quel principal porte la clé.

BesoinChoixPourquoi
Une personne qui travaille depuis la console et son posteutilisateurmot de passe, MFA, sessions ; sa clé API expire et se révoque avec elle
Une CI, Terraform, un script planifié, un agentapplicationaucun accès console, survit aux départs, s'inventorie
Un droit partagé par une équipegroupe avec une politiqueon gère les membres, pas les politiques
Un accès temporaire à un prestataireutilisateur membre avec politique limitée et date de finretirable de l'Organization en une action

La faute classique consiste à créer une clé API sur son propre compte d'utilisateur et à la coller dans une CI. Cette clé porte alors tous vos droits, y compris la facturation et la gestion IAM. Elle survit à votre départ, personne ne sait plus à quoi elle sert, et elle n'apparaît dans aucun inventaire d'accès. Une application coûte une commande de plus et retire tout cela.

Objectif : une identité qui peut déployer dans un Project et rien qu'un Project. Tous les objets créés ici sont gratuits.

  1. Créez le Project cible

    La portée d'une politique s'appuie sur les Projects : sans séparation, il n'y a rien à restreindre.

    Fenêtre de terminal
    PROJ=$(scw account project create name=lab-ci-cible -o json \
    | python3 -c 'import sys,json; print(json.load(sys.stdin)["id"])')
    echo "Project cible : $PROJ"
  2. Créez l'application, c'est-à-dire l'identité de la CI

    Fenêtre de terminal
    APP=$(scw iam application create name=ci-terraform \
    description="Deploiement CI, un seul Project" -o json \
    | python3 -c 'import sys,json; print(json.load(sys.stdin)["id"])')
    scw iam application list

    La liste doit afficher ci-terraform.

  3. Écrivez la politique

    Trois jeux de permissions suffisent à déployer une petite stack, et la portée se limite au Project créé à l'étape 1.

    Fenêtre de terminal
    POL=$(scw iam policy create name=ci-deploy \
    application-id=$APP \
    rules.0.project-ids.0=$PROJ \
    rules.0.permission-set-names.0=InstancesFullAccess \
    rules.0.permission-set-names.1=VPCFullAccess \
    rules.0.permission-set-names.2=BlockStorageFullAccess \
    -o json | python3 -c 'import sys,json; print(json.load(sys.stdin)["id"])')

    Relisez ce qui a été enregistré, c'est le seul moyen de savoir ce que la politique accorde réellement :

    Fenêtre de terminal
    scw iam rule list policy-id=$POL -o json \
    | python3 -c 'import sys,json; [print(r["permission_set_names"], "->", r["project_ids"]) for r in json.load(sys.stdin)]'

    La sortie doit afficher les trois jeux, suivis de l'identifiant du seul Project cible.

  4. Créez la clé API portée par l'application

    Fenêtre de terminal
    EXPIRE=$(date -u -d "+30 days" +%Y-%m-%dT%H:%M:%SZ)
    scw iam api-key create application-id=$APP expires-at=$EXPIRE \
    default-project-id=$PROJ description="cle de la CI"

    La clé secrète ne s'affiche qu'une seule fois. Copiez-la immédiatement dans le coffre de votre chaîne d'intégration ; si vous la perdez, il faut en créer une autre. scw iam api-key list doit ensuite montrer la clé avec son échéance.

Une politique qu'on n'a pas testée est une hypothèse. Configurez un profil séparé avec la clé de la CI, puis mesurez ce qu'elle peut et ne peut pas faire.

Fenêtre de terminal
cat > ~/.config/scw/ci.yaml <<'EOF'
access_key: SCWXXXXXXXXXXXXXXXXX
secret_key: votre-cle-secrete
default_organization_id: votre-organization-id
default_project_id: votre-project-cible
default_region: fr-par
default_zone: fr-par-1
EOF
chmod 600 ~/.config/scw/ci.yaml

Toutes les commandes qui suivent utilisent ce profil avec -c, ce qui garantit que vous testez bien la clé restreinte et non la vôtre.

Les quatre contrôles à passer, dans cet ordre :

Ce qu'on tenteRésultat attendu
Créer une ressource dans le Project cibleréussite : la CI peut travailler
Créer une ressource dans un autre Projectinsufficient permissions
Lire la facturationinsufficient permissions
Créer une clé API avec cette cléinsufficient permissions

Le dernier contrôle est le plus important et le plus oublié : une identité qui peut créer des clés API peut se donner tous les droits. Si votre politique inclut par mégarde un jeu de permissions IAM, la restriction que vous venez d'écrire ne vaut rien, puisque la CI peut la contourner en fabriquant une nouvelle identité.

Un refus mesuré dans le terminal est une preuve pour vous ; un refus dans Audit Trail est une preuve pour un auditeur. Chaque tentative, réussie ou refusée, est enregistrée avec le principal, l'adresse d'origine et le statut. Relisez les événements de la dernière heure :

Fenêtre de terminal
scw audit-trail event list region=fr-par -o json \
| python3 -c 'import sys,json; [print(e["recorded_at"][:19], e["principal"]["id"][:8], e["product_name"], e["method_name"], e["status_code"]) for e in json.load(sys.stdin)]'

La sortie doit montrer les créations de l'application et de la politique en 200, la création du groupe de sécurité dans le Project cible en 200 ou 201, et la tentative hors périmètre en 403, portées par l'identifiant de l'application ci-terraform. Mesuré le 2026-09-08 : les événements DeleteApplication (200) et DeleteSecurityGroup (204) du nettoyage y figurent avec l'agent scaleway-cli/2.56.3. C'est ce journal, exporté chaque jour vers un bucket, qui répondra dans six mois à la question « qui a essayé quoi ».

Depuis le 15 juillet 2026, une politique peut restreindre au niveau de la ressource, et depuis plus longtemps au niveau de la requête ; pour une CI, deux conditions valent d'être connues. L'argument rules.0.condition de scw iam policy create accepte une expression CEL. Une CI dont on connaît l'adresse publique de sortie peut être bornée par request.ip == "203.0.113.10" ; une CI qui ne doit tourner qu'en journée par request.time.getHours("Europe/Paris") > 7 && request.time.getHours("Europe/Paris") < 20. Au niveau de la ressource, trois produits sont intégrés au 13 juillet 2026, IAM, Key Manager et Secret Manager : une CI peut ainsi lire un seul dossier de secrets (resource.name.startsWith("/ci/")) plutôt que tout le coffre. La leçon d'ouverture du volet détaille les variables disponibles.

Pourquoi une clé API a-t-elle un Project préféré pour l'Object Storage ?

Section intitulée « Pourquoi une clé API a-t-elle un Project préféré pour l'Object Storage ? »

Les outils compatibles S3 ne savent pas transmettre d'identifiant de Project. L'interface S3 n'a pas ce paramètre, et Scaleway a donc rattaché l'information à la clé elle-même : c'est le rôle de default-project-id que vous avez passé à la création.

La conséquence surprend le jour où elle se manifeste : une même clé utilisée avec aws-cli, rclone ou s3cmd travaille par défaut dans son Project préféré, quel que soit le contexte. Un bucket créé depuis la console dans un autre Project reste alors introuvable, sans message d'erreur explicite.

Deux sorties existent, et il vaut mieux les connaître avant de multiplier les clés. Le Project préféré s'édite après coup :

Fenêtre de terminal
scw iam api-key update VOTRE_ACCESS_KEY default-project-id=UN_AUTRE_PROJECT

Et il se surcharge appel par appel, en suffixant la clé d'accès par l'identifiant du Project visé :

aws_access_key_id = SCWXXXXXXXXXXXXXXXXX@votre-project-id

Dans les deux cas, la politique doit évidemment couvrir ce Project : la surcharge change la cible, elle n'accorde aucun droit. Une clé par Project reste la solution la plus lisible quand plusieurs équipes se partagent le stockage, mais ce n'est plus une obligation technique.

Rien de tout cela n'est facturé, mais une identité oubliée est une porte ouverte que personne ne surveille. On supprime dans l'ordre inverse de la création.

Fenêtre de terminal
rm -f ~/.config/scw/ci.yaml
scw iam api-key delete VOTRE_ACCESS_KEY
scw iam policy delete $POL
scw iam application delete $APP
scw account project delete project-id=$PROJ

La vérification de sortie porte sur les trois familles :

Fenêtre de terminal
scw iam application list
scw iam policy list
scw account project list

Les politiques nommées Administrators, Editors et Billing Administrators sont créées par Scaleway, chacune attachée à son groupe, et doivent rester ; il en va de même des cinq groupes (All Users, All Applications et les trois groupes de rôle). Ce ne sont pas des restes de lab.

Ces valeurs viennent de la page des quotas d'Organisation (validée le 2025-10-29), de la doc des politiques et du lab du 2026-09-08.

PlafondValeurSource
Clés API par Organisation50 (page des quotas) ; la FAQ IAM dit 100, écart signaléquotas, FAQ IAM
Applications100quotas d'Organisation
Groupes, politiques, utilisateurs50 chacunquotas d'Organisation
Principal par politique1doc « Understanding IAM policies »
Sens des règlesaccorder seulement, aucune règle « interdire »doc « Understanding IAM policies »
Délai d'applicationjusqu'à 1 minutedoc « Understanding IAM policies »
Jeux de permissions179 relevés le 2026-09-08, chiffre mobilescw iam permission-set list
Durée maximale d'une cléréglable par l'Organisation ; 0 = illimité ; 365 jours sur l'organisation de testscw iam security-settings get
Description d'une clé, d'une politique200 caractères ; nom de politique 64aide de scw iam policy create et api-key create
Produits à conditions au niveau ressource3 au 13 juillet 2026 : IAM, Key Manager, Secret Managerdoc « Products supporting resource-level conditions »
Événements Audit Trailconservés 90 jours en export ; IAM enregistré à Parisconcepts et FAQ Audit Trail

Ces erreurs ont un point commun : IAM les accepte sans un mot, et elles se découvrent dans un rapport d'incident.

AntipatternConséquenceDiscipline
Clé API d'un humain dans une CIla CI porte facturation et IAM, et survit au départune application par robot
Un jeu IAM… ou AllProductsFullAccess sur une identité de déploiementelle se réécrit ses droits ; la restriction ne vaut rienjamais de permission IAM sur un robot, et le quatrième contrôle
Conclure d'une lecture vide que la restriction tientlecture hors périmètre filtrée en silencepreuve par écriture, puis Audit Trail
Politique attachée à All Applications pour aller vitetoute nouvelle application hérite du droitgroupe nommé à membres explicites
Clé sans expiration parce que l'organisation ne l'impose pasclé éternelle, jamais tournéeexpires-at systématique, et max_api_key_expiration_duration posé
Supprimer une politique Editors « inutile »rôle géré par Scaleway, membres privés de leurs droitsne toucher qu'à ce que le lab a créé

Security : une identité par robot, zéro permission IAM, une preuve

Section intitulée « Security : une identité par robot, zéro permission IAM, une preuve »

Que peut faire cette clé si elle fuit ce soir ? Créer des Instances, des réseaux et des volumes dans un seul Project, pendant au plus trente jours, et rien d'autre : ni lire la facture, ni créer une clé, ni toucher un autre Project. La discipline est celle du lab, avec en plus une condition sur l'adresse de sortie de la CI quand elle est connue, et un export Audit Trail qui garde la trace des refus.

Quelqu'un saura-t-il, dans six mois, à quoi sert ci-terraform ? Oui, si l'application porte son usage dans son nom et sa description, si la politique s'appelle ci-deploy et vise un Project nommé, et si la clé expire, ce qui force la question à se reposer à chaque rotation. La discipline est une revue trimestrielle de scw iam api-key list (échéances, descriptions) et de scw iam policy list.

Le tableau se lit par la colonne Symptôme : c'est ce que vous voyez à l'écran, message exact compris quand il y en a un ; la colonne Cause dit ce qui se passe réellement, et la colonne Solution la commande ou le geste qui débloque.

SymptômeCauseSolution
require an expiration date for API keysl'organisation impose une durée de vie maximaleajouter expires-at=<date ISO 8601>
Une lecture hors périmètre renvoie [] au lieu d'une erreurles ressources hors portée sont filtrées en silencevérifier la restriction par une écriture, jamais par une lecture
insufficient permissions: create compute_security_groupsla politique ne couvre pas ce Project ou ce produitrelire scw iam rule list policy-id=… ; c'est la preuve attendue hors périmètre
La clé secrète est introuvableelle n'est affichée qu'à la créationen créer une nouvelle et révoquer l'ancienne
Impossible d'attacher une politique à deux personnesune politique n'a qu'un seul principalcréer un groupe et attacher la politique au groupe
Un outil S3 écrit dans le mauvais Projectla clé porte un Project préféré appliqué par défautl'éditer avec api-key update, ou suffixer la clé par @project-id
La CI peut se donner de nouveaux droitsun jeu de permissions IAM traîne dans la politiqueretirer toute permission IAM d'une identité de déploiement
Une clé d'ancien collaborateur encore activela clé était portée par un utilisateur, pas une applicationporter les accès machine par des applications
La politique semble sans effet juste après sa créationdélai d'application jusqu'à 1 minuteattendre, puis retester

Vérifiez que l'essentiel de ce guide est acquis. Les questions portent uniquement sur ce qui vient d'être expliqué ici.

Contrôle de connaissances

Validez vos connaissances avec ce quiz interactif

6 questions
6 min.
70% requis

Informations

  • Le chronomètre démarre au clic sur Démarrer
  • Questions à choix multiples, vrai/faux et réponses courtes
  • Vous pouvez naviguer entre les questions
  • Les résultats détaillés sont affichés à la fin

Lance le quiz et démarre le chronomètre

  • Une politique donne à un principal des jeux de permissions sur une portée, éventuellement sous condition. Cinq mots, tout le modèle ; les règles accordent seulement, à partir de zéro droit.
  • Une politique ne porte qu'un seul principal. Le droit partagé passe par un groupe, jamais par la duplication ; les groupes gérés All Users et All Applications (2 septembre 2026) donnent à tout le monde, y compris aux arrivants.
  • Une application n'a pas accès à la console : c'est l'identité correcte pour une CI, un script ou un agent ; 100 applications et 50 clés API par Organisation.
  • Une clé API créée sur un compte humain porte tous les droits de cette personne et lui survit. C'est la faille la plus banale.
  • Une clé API doit expirer, et l'organisation peut l'imposer via max_api_key_expiration_duration (0 = illimité par défaut).
  • Une lecture hors périmètre renvoie une liste vide, pas une erreur. Un résultat vide ne prouve rien.
  • Seule une tentative d'écriture prouve une restriction, et Audit Trail l'enregistre en 403.
  • Une identité de déploiement ne doit jamais porter de permission IAM, sinon elle peut se réécrire ses propres droits.
  • Depuis le 15 juillet 2026, les conditions au niveau ressource (IAM, Key Manager, Secret Manager) et les conditions de requête (IP, heure) bornent une CI plus finement qu'un Project.
  • Une clé API travaille dans son Project préféré avec les outils compatibles S3 ; ce réglage s'édite après coup et se surcharge par <access-key>@<project-id>.

Les pages officielles sur lesquelles cette leçon s'appuie, avec ce qu'on y cherche ; leur champ de validation date chaque fait cité.

  • IAM concepts : le vocabulaire officiel, principal, règle, portée, condition, Project préféré.
  • Understanding IAM policies : un principal par politique, règles qui accordent, délai d'application, exemple JSON.
  • Permission sets : le catalogue complet, à consulter avant d'écrire une politique.
  • Request-level conditions : restreindre par adresse IP, agent ou horaire, avec la syntaxe CEL.
  • Organization quotas : clés, applications, groupes, politiques et utilisateurs par Organisation.

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracking. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn