keenauth_directory_token

Die Ressource keenauth_directory_token legt ein SCIM-Bearer-Token eines Verzeichnisses für den Identity Provider an, der dorthin Benutzer und Gruppen bereitstellt. Der Provider speichert das Token im State nur verschlüsselt mit einem öffentlichen RSA-Schlüssel, den Sie angeben.

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
}

Das Token wird niemals im Klartext gespeichert

Die API gibt ein SCIM-Token einmal zurück, und zwar in der Antwort, die es anlegt; danach kann kein Endpunkt es lesen. Der Provider verschlüsselt das Token mit Ihrem öffentlichen Schlüssel (RSA-OAEP mit SHA-256, MGF1 mit SHA-256 und leerem Label) und schreibt nur den Base64-Chiffretext nach encrypted_token. Das Klartext-Token gelangt nie in den State, eine Plandatei, eine Ausgabe oder ein Log. Nur der Inhaber des privaten Schlüssels kann es entschlüsseln; eine abgeflossene State-Datei legt das Token daher nicht offen.

Erzeugen Sie das Schlüsselpaar einmal außerhalb von OpenTofu und halten Sie den privaten Schlüssel aus Ihrer Konfiguration heraus:

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

Entschlüsseln Sie nach tofu apply das Token und geben Sie es dem 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 muss ein PEM-kodierter öffentlicher RSA-Schlüssel (PUBLIC KEY oder RSA PUBLIC KEY) mit mindestens 2048 Bit sein. Ein privater Schlüssel oder ein kleinerer Schlüssel wird bereits bei der Planung abgelehnt. Kann der Provider kein Token ausliefern, widerruft er es sofort und das Apply schlägt fehl; so existiert kein gültiges Token, das niemand besitzt.

Nur Anlegen und Widerrufen

Ein Token kann nicht geändert werden. Jedes Argument (directory_id, label, expires_in_days, public_key) erzeugt bei einer Änderung ein neues Token, und das alte Token wird widerrufen. Das Löschen der Ressource widerruft das Token.

Ein außerhalb des Providers widerrufenes oder abgelaufenes Token wird beim nächsten Refresh aus dem State entfernt, und das nächste Apply legt ein neues an. Das Löschen des Verzeichnisses löscht seine Tokens.

Rotation

Ein Verzeichnis hat höchstens 2 gültige Tokens; ein drittes wird mit 409 abgelehnt. Das reicht für eine Rotation ohne Ausfallzeit: Mit create_before_destroy = true wird das neue Token angelegt, bevor das alte widerrufen wird. Geben Sie dem Identity Provider das neue Token im selben Änderungsfenster.

Argumente

Import

Die Ressource kann nicht importiert werden: Der Wert eines bestehenden Tokens kann nie wieder gelesen werden, ein importiertes Token könnte also nicht ausgeliefert werden. Widerrufen Sie ein altes Token mit keenauth directories tokens delete <directory_id> <token_id> und lassen Sie den Provider ein neues anlegen.