IAMPolicy
Fonctionnalité déployée et prise en charge. Les champs et commandes décrits ici sont stables au sein de la version v1alpha1.
apiVersion | iam.stackngo.io/v1alpha1 |
kind | IAMPolicy |
| Appliqué par | sng tenant policy create / update / delete (ou PUT /v1/iam/policies/{name}), pas par sng apply |
| Commandes liées | sng tenant policy list · get · create · update · delete · attach · principals |
À quoi ça sert
Une IAMPolicy est un document de policy de votre tenant : une liste de déclarations Allow ou Deny sur des actions (ssm:read, deploy:write, GET…) et des ressources (secret/prod-*, app/api…). Elle ne fait rien seule : elle s'applique aux sujets que lui attache son IAMPolicyBinding. Vous ne l'écrivez pas dans l'état désiré vous-même : sng tenant policy valide le document, l'écrit dans l'état désiré de votre tenant, et elle entre en vigueur quelques instants plus tard. Le format et l'évaluation sont expliqués dans Écrire une policy.
Exemple minimal
apiVersion: iam.stackngo.io/v1alpha1
kind: IAMPolicy
metadata:
name: ops-read
spec:
statement:
- effect: Allow
actions: ["ssm:read", "ssm:list", "ssm:describe"]
resources: ["secret/*"]
sng tenant policy create ops-read -f ops-read.yml
policy "ops-read" created (pending: …)
Le même document en JSON (sng tenant policy create ops-read -f ops-read.json) :
{ "Version": "1",
"Statement": [
{ "Effect": "Allow", "Actions": ["ssm:read", "ssm:list", "ssm:describe"], "Resources": ["secret/*"] } ] }
sng applysng apply refuse le kind IAMPolicy : les policies passent toujours par sng tenant policy ou l'API, qui les valident avant de les écrire. sng tenant policy create -f accepte le manifeste ci-dessus et n'en lit que metadata.name (ignoré au profit de NAME), spec.description et spec.statement.
Exemple complet commenté
apiVersion: iam.stackngo.io/v1alpha1
kind: IAMPolicy
metadata:
name: ci-publisher # label DNS, 63 caractères ; ni nom géré, ni préfixe bind-
spec:
description: publication du site, sans création ni suppression # 256 caractères max
statement: # 1 à 50 déclarations
- effect: Allow # Allow ou Deny, casse respectée
actions: ["cdn:upload", "cdn:purge"] # 1 à 64 actions : service:verbe, méthode HTTP ou *
resources: ["cdn/*"] # 0 à 64 ressources ; absent ou vide = ["*"]
- effect: Deny # un Deny l'emporte toujours sur un Allow
actions: ["cdn:*"]
resources: ["cdn/prod-*"] # joker * en suffixe d'une ressource type/nom
- effect: Allow
actions: ["GET"] # méthode HTTP : routes de vos API générées
resources: ["https://orders-api.acme.dev.stackngo.app/v1/orders/*"]
sng tenant policy create ci-publisher -f ci-publisher.yml
sng tenant policy attach ci-publisher --oidc-trust gitlab-deploy
Champs
Règles de validation croisées
Le schéma ne porte pas de règle CEL. Le document est validé strictement par l'API dès sng tenant policy create / update (400 au moindre écart) :
Versionvaut"1"(ajouté par la CLI quand elle lit un manifeste) ; aucune autre clé queVersionetStatement, aucune autre clé de déclaration queEffect,Actions,Resources.- 1 à 50 déclarations ; 1 à 64 actions et au plus 64 ressources par déclaration ; un document pèse au plus 64 Kio.
- Chaque action est un motif connu (
service:verbeavec joker*, une méthode HTTP, ou*) ; chaque ressource est*,type/nom(joker en suffixe seulement), un chemin/…ou une URLhttps://…. Le détail est dans Écrire une policy. - Le nom est un label DNS de 63 caractères au plus, n'est pas celui d'une policy gérée (par exemple
assume-role,readonly,readwrite,admin:409) et ne commence pas parbind-.
IAMPolicy
IAMPolicy déclare une policy d'autorisation de votre tenant : les actions qu'elle autorise ou refuse, et sur quelles ressources. Seule, elle ne donne aucun droit : un IAMPolicyBinding l'attache à des utilisateurs, rôles ou applications.
| Champ | Description | Défaut | Validation |
|---|---|---|---|
apiVersion string | iam.stackngo.io/v1alpha1 | ||
kind string | IAMPolicy | ||
metadata ObjectMeta | Seul metadata.name est à renseigner (nom de la ressource dans votre tenant). | ||
spec IAMPolicySpec | |||
status IAMPolicyStatus |
IAMPolicySpec
IAMPolicySpec : document de policy. Un refus explicite (Deny) l'emporte sur une autorisation (Allow) ; sans règle applicable, l'accès est refusé.
| Champ | Description | Défaut | Validation |
|---|---|---|---|
description string | Description libre de ce que la policy autorise ou refuse. | MaxLength: 256 | |
statement IAMPolicyStatement array | Règles de la policy (1 à 50). Chacune autorise (Allow) ou refuse (Deny) des actions sur des ressources. | MaxItems: 50 MinItems: 1 | |
deletionPolicy DeletionPolicy | Block (défaut, valeur vide) : la suppression de l'IAMPolicy attend qu'aucun IAMPolicyBinding de votre tenant ne la référence, puis retire la policy. Delete : retrait immédiat, même si des bindings la référencent encore. Orphan : la policy reste en vigueur après la suppression de l'IAMPolicy. | Enum: [Block Delete Orphan] Optional: {} |
IAMPolicyStatus
| Champ | Description | Défaut | Validation |
|---|---|---|---|
observedGeneration integer | Dernière version du manifeste (metadata.generation) prise en compte par la plateforme. | ||
provider ProviderStatus | Identité de la ressource dans le service d'authentification. | ||
lastSyncedAt Time | Date de la dernière prise en compte réussie du manifeste. | Optional: {} | |
conditions Condition array | Conditions décrivant l'état actuel de la ressource (Ready…). | ||
tenant string | Tenant auquel la policy s'applique. | ||
version integer | Version de la policy après la dernière modification enregistrée. |
IAMPolicyStatement
IAMPolicyStatement autorise ou refuse des actions sur des ressources du tenant.
| Champ | Description | Défaut | Validation |
|---|---|---|---|
effect string | Allow pour autoriser, Deny pour refuser. Un Deny l'emporte sur un Allow. | Enum: [Allow Deny] | |
actions string array | Actions visées : service:verbe (ssm:read, kms:wrap, iam:AssumeRole…), méthode HTTP, ou * pour toutes. | MinItems: 1 | |
resources string array | Ressources visées : , type/nom (joker * en suffixe), /chemin ou https://hôte/chemin. Vide : toutes les ressources (). |
DeletionPolicy
Type sous-jacent : string
DeletionPolicy indique ce que devient la ressource quand vous supprimez son manifeste : Block bloque la suppression tant que la ressource est encore utilisée, Orphan la conserve, Delete la supprime.
Règles de validation :
Enum: [Block Orphan Delete]
| Valeur | Description |
|---|---|
Block | Bloque la suppression tant que la ressource est encore utilisée par une autre. |
Orphan | Supprime le manifeste mais conserve la ressource créée. |
Delete | Supprime la ressource avec le manifeste, sans vérifier son usage. |
ProviderStatus
ProviderStatus identifie la ressource dans le service d'authentification.
| Champ | Description | Défaut | Validation |
|---|---|---|---|
owner string | Organisation propriétaire de l'objet dans l'annuaire d'identité. Renseigné par la plateforme. | ||
name string | Nom de l'objet dans l'annuaire d'identité. Renseigné par la plateforme. | ||
resourceID string | Identifiant de l'objet dans l'annuaire d'identité. Renseigné par la plateforme. |
spec.deletionPolicy n'est pas réglable par sng tenant policy : les policies écrites par l'API prennent la valeur par défaut, Delete.
Statut et conditions
Le plus simple est de lire le statut par la CLI :
Statut (sng tenant policy list) | Signification |
|---|---|
pending | écrit dans l'état désiré, pas encore appliqué |
applied | le document en vigueur est celui demandé ; VERSION donne sa version |
deleting | suppression demandée, encore en vigueur quelques instants |
Côté objet, status.tenant est le tenant de la policy et status.version sa version après la dernière application. La condition Ready vaut True (raison Reconciled) quand le document est appliqué.
Raison (Ready=False) | Signification | Action corrective |
|---|---|---|
InvalidDocument | le document a été refusé à l'application | corriger avec sng tenant policy update |
UnsupportedConfiguration | le manifeste enfreint une règle (nom, déclarations, effet) | idem |
ScopeUnresolved | le tenant de la policy n'a pas pu être déterminé | réessai automatique ; si cela dure, contacter le support |
ProviderUnavailable | service d'identité momentanément injoignable | réessai automatique |
InsufficientRBAC | incident côté plateforme | contacter le support |
Une policy qui reste pending plus de quelques minutes signale l'une de ces raisons.
Ce qui se passe à la création et à la suppression
Création et mise à jour. sng tenant policy create|update → PUT /v1/iam/policies/<nom> : validation, réponse 202 Accepted avec status: "pending". Quelques instants plus tard, le document entre en vigueur et version augmente. Les sessions déjà ouvertes voient le changement dès qu'il est en vigueur (chaque requête est évaluée sur les policies en vigueur).
Suppression. sng tenant policy delete <nom> supprime la policy et son binding bind-<nom> (202). Quelques instants plus tard, ses sujets perdent les droits qu'elle accordait. Les policies gérées ne se suppriment pas (409).
Policies gérées. Les policies créées avec le tenant (default: true) ne se modifient pas mais s'attachent comme les vôtres.
Erreurs fréquentes
| Symptôme | Cause | Correction |
|---|---|---|
sng apply refuse le kind IAMPolicy | les policies ne passent pas par sng apply | sng tenant policy create NAME -f FILE |
400 policies: invalid request: statement[0]: … | action ou ressource mal formée, clé inconnue, effet mal orthographié (allow) | corriger le document ; Effect respecte la casse |
409 policies: reserved: "admin" is a default policy of the tenant core | nom d'une policy gérée | choisir un autre nom ; attacher la policy gérée si elle convient |
400 … prefix "bind-" is reserved | nom commençant par bind- | renommer |
403 forbidden: insufficient permissions | pas de policy:admin sur policy/<nom> | policy admin (pas readwrite) |
Statut pending qui ne passe pas à applied | prise en compte en cours, ou raison d'échec ci-dessus | attendre quelques minutes ; sinon contacter le support |
Voir aussi
- Guides : Écrire une policy, Attacher une policy, Catalogue des actions
- CLI :
sng tenant policy - API :
PUT /v1/iam/policies/{name} - Autres kinds : IAMPolicyBinding, IAMOIDCTrust