keenauth_directory_token

La risorsa keenauth_directory_token crea un token bearer SCIM di una directory per l'identity provider che vi esegue il provisioning di utenti e gruppi. Il provider conserva il token nello stato solo cifrato con una chiave pubblica RSA che fornisci.

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
}

Il token non viene mai memorizzato in chiaro

L'API restituisce un token SCIM una sola volta, nella risposta che lo crea, e nessun endpoint può leggerlo in seguito. Il provider cifra il token con la tua chiave pubblica (RSA-OAEP con SHA-256, MGF1 SHA-256 ed etichetta vuota) e scrive in encrypted_token solo il testo cifrato in base64. Il token in chiaro non raggiunge mai lo stato, un file di plan, un output o un log. Solo il possessore della chiave privata può decifrarlo, quindi un file di stato trapelato non rivela il token.

Crea la coppia di chiavi una volta sola, fuori da OpenTofu, e tieni la chiave privata fuori dalla configurazione:

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

Dopo tofu apply, decifra il token e consegnalo all'identity provider:

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 deve essere una chiave pubblica RSA in formato PEM (PUBLIC KEY o RSA PUBLIC KEY) di almeno 2048 bit. Una chiave privata o una chiave più piccola viene rifiutata già in fase di plan. Se il provider non riesce a consegnare un token, lo revoca subito e l'apply fallisce, così non esiste alcun token valido che nessuno possiede.

Solo creazione e revoca

Un token non può essere modificato. Ogni argomento (directory_id, label, expires_in_days, public_key) crea un nuovo token quando lo cambi, e il vecchio token viene revocato. Distruggere la risorsa revoca il token.

Un token revocato al di fuori del provider, o scaduto, viene rimosso dallo stato al refresh successivo, e l'apply successivo ne crea uno nuovo. Eliminare la directory elimina i suoi token.

Rotazione

Una directory ha al massimo 2 token validi; un terzo viene rifiutato con 409. Basta per ruotare senza interruzioni: con create_before_destroy = true il nuovo token viene creato prima che quello vecchio venga revocato. Consegna il nuovo token all'identity provider nella stessa finestra di modifica.

Argomenti

Importazione

La risorsa non può essere importata: il valore di un token esistente non può mai essere riletto, quindi un token importato non potrebbe essere consegnato. Revoca un token vecchio con keenauth directories tokens delete <directory_id> <token_id> e lascia che il provider ne crei uno nuovo.