keenauth_directory_token

La ressource keenauth_directory_token crée un jeton porteur SCIM d'un annuaire pour le fournisseur d'identité qui y provisionne les utilisateurs et les groupes. Le fournisseur ne conserve le jeton dans l'état que chiffré avec une clé publique RSA que vous lui donnez.

resource "keenauth_directory_token" "okta" {
  directory_id    = keenauth_directory.acme_okta.id
  label           = "Okta"
  expires_in_days = 180
  public_key      = file("${path.module}/scim-token-key.pub.pem")

  lifecycle {
    create_before_destroy = true
  }
}

output "okta_scim_token_encrypted" {
  value = keenauth_directory_token.okta.encrypted_token
}

Le jeton n'est jamais stocké en clair

L'API renvoie un jeton SCIM une seule fois, dans la réponse qui le crée, et aucun point de terminaison ne permet de le relire ensuite. Le fournisseur chiffre le jeton avec votre clé publique (RSA-OAEP avec SHA-256, MGF1 SHA-256 et une étiquette vide) et n'écrit dans encrypted_token que le texte chiffré en base64. Le jeton en clair n'atteint jamais l'état, un fichier de plan, une sortie ou un journal. Seul le détenteur de la clé privée peut le déchiffrer ; ainsi, un fichier d'état qui fuit ne divulgue pas le jeton.

Créez la paire de clés une seule fois, en dehors d'OpenTofu, et gardez la clé privée hors de votre configuration :

openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:3072 -out scim-token-key.pem
openssl pkey -in scim-token-key.pem -pubout -out scim-token-key.pub.pem

Après tofu apply, déchiffrez le jeton et donnez-le au fournisseur d'identité :

tofu output -raw okta_scim_token_encrypted | base64 -d | \
  openssl pkeyutl -decrypt -inkey scim-token-key.pem \
    -pkeyopt rsa_padding_mode:oaep -pkeyopt rsa_oaep_md:sha256 -pkeyopt rsa_mgf1_md:sha256

public_key doit être une clé publique RSA au format PEM (PUBLIC KEY ou RSA PUBLIC KEY) d'au moins 2048 bits. Une clé privée ou une clé plus petite est rejetée au moment du plan. Si le fournisseur ne peut pas livrer de jeton, il révoque aussitôt le jeton et l'apply échoue ; ainsi, il n'existe aucun jeton valide que personne ne détient.

Création et révocation uniquement

Un jeton ne peut pas être modifié. Chaque argument (directory_id, label, expires_in_days, public_key) crée un nouveau jeton lorsque vous le modifiez, et l'ancien jeton est révoqué. Détruire la ressource révoque le jeton.

Un jeton révoqué en dehors du fournisseur, ou expiré, est retiré de l'état au prochain rafraîchissement, et le prochain apply en crée un nouveau. Supprimer l'annuaire supprime ses jetons.

Rotation

Un annuaire a au plus 2 jetons valides ; un troisième est rejeté avec 409. Cela suffit pour effectuer une rotation sans interruption : avec create_before_destroy = true, le nouveau jeton est créé avant que l'ancien ne soit révoqué. Donnez le nouveau jeton au fournisseur d'identité dans la même fenêtre de changement.

Arguments

Importation

La ressource ne peut pas être importée : la valeur d'un jeton existant ne peut plus jamais être relue, donc un jeton importé ne pourrait pas être livré. Révoquez un ancien jeton avec keenauth directories tokens delete <directory_id> <token_id> et laissez le fournisseur en créer un nouveau.