keenauth_directory_token

keenauth_directory_token リソースは、ユーザーとグループをプロビジョニングする ID プロバイダー用に、ディレクトリの SCIM ベアラートークンを作成します。プロバイダーはトークンを、指定された RSA 公開鍵で暗号化した状態でのみ state に保持します。

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
}

トークンは平文で保存されません

API は SCIM トークンを、それを作成するレスポンスで一度だけ返し、その後はどのエンドポイントからも読み取れません。プロバイダーはトークンを公開鍵で暗号化し(SHA-256 の RSA-OAEP、MGF1 SHA-256、空のラベル)、encrypted_token には base64 の暗号文だけを書き込みます。平文のトークンが state、プランファイル、出力、ログに渡ることはありません。復号できるのは秘密鍵の保持者だけなので、state ファイルが漏えいしてもトークンは漏れません。

鍵ペアは OpenTofu の外で一度だけ作成し、秘密鍵は構成の外に置いてください:

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

tofu apply の後、トークンを復号して ID プロバイダーに渡します:

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 は、2048 ビット以上の PEM 形式 RSA 公開鍵(PUBLIC KEY または RSA PUBLIC KEY)である必要があります。秘密鍵や、より小さい鍵はプラン時に拒否されます。プロバイダーがトークンを渡せなかった場合は、ただちにトークンを取り消し、apply は失敗します。そのため、誰も保持していない有効なトークンは存在しません。

作成と取り消しのみ

トークンは変更できません。各引数(directory_id、label、expires_in_days、public_key)を変更すると新しいトークンが作成され、古いトークンは取り消されます。リソースを破棄するとトークンは取り消されます。

プロバイダーの外で取り消された、または期限切れのトークンは、次回の更新で state から削除され、次の apply で新しいトークンが作成されます。ディレクトリを削除すると、そのトークンも削除されます。

ローテーション

ディレクトリで有効なトークンは最大 2 つで、3 つ目は 409 で拒否されます。これでダウンタイムなしのローテーションができます。create_before_destroy = true を指定すると、古いトークンを取り消す前に新しいトークンが作成されます。同じ変更時間帯に、新しいトークンを ID プロバイダーに渡してください。

引数

インポート

既存のトークンの値は二度と読み取れないため、このリソースはインポートできません。インポートしたトークンは配布できないからです。古いトークンは keenauth directories tokens delete <directory_id> <token_id> で取り消し、プロバイダーに新しいトークンを作成させてください。