Proveedor de OpenTofu y Terraform
El proveedor keenauth/keenauth gestiona la configuración de un entorno de KeenAuth como código. Llama a la API de gestión, usa el protocolo de plugins 6 y funciona con OpenTofu y Terraform. Todavía no se publica en un registro de proveedores.
Autenticación y destino
El proveedor gestiona el entorno al que pertenece su credencial. Para gestionar varios entornos, configure un alias de proveedor por entorno. Se autentica de exactamente una de dos formas: con una clave de API de gestión o sin clave, como una management application con private_key_jwt. Definir ambas es un error.
| Configuración | Variable de entorno | Descripción |
|---|---|---|
api_key |
KEENAUTH_API_KEY |
Clave de API de gestión. Prefiera la variable de entorno. La clave nunca se escribe en los archivos de estado o de plan. |
client_id |
KEENAUTH_CLIENT_ID |
ID (app_…) de una aplicación management, en lugar de api_key. Necesita private_key e issuer. |
private_key |
KEENAUTH_PRIVATE_KEY |
Clave privada PEM PKCS#8 cuya clave pública está registrada en la aplicación: EC P-256, EC P-384, Ed25519 o RSA de al menos 2048 bits. Prefiera la variable de entorno. Nunca se escribe en el estado. |
private_key_algorithm |
PS256 (predeterminado) o RS256, solo para una clave RSA. |
|
issuer |
KEENAUTH_ISSUER |
El host predeterminado del entorno, https://<environment>.<region>.keenauth.app. El proveedor obtiene su token de <issuer>/oauth2/token. |
scopes |
Permisos que se solicitan con client_id. Si se omite, se aplican los scopes predeterminados de la concesión. |
|
region |
KEENAUTH_REGION |
eu (predeterminado) o us. La dirección de la API es https://api.eu.keenauth.com/v1 / https://api.us.keenauth.com/v1. |
base_url |
KEENAUTH_BASE_URL |
Dirección explícita de la API. Solo se acepta https://<host>.keenauth.com/v1, además de direcciones de bucle local para pruebas locales. |
terraform {
required_providers {
keenauth = { source = "keenauth/keenauth" }
}
}
provider "keenauth" {
region = "eu"
}
Autenticación sin clave con private_key_jwt
- Cree una aplicación con
app_type = "management"y un registrokeenauth_management_clientcon los permisos que necesite la configuración. - Registre la clave pública de un par de claves en la aplicación (
POST /v1/applications/{application_id}/credentialscontype: public_key, la CLI o el panel). - Proporcione al proveedor el ID de la aplicación, la clave privada y el emisor:
export KEENAUTH_CLIENT_ID="app_..."
export KEENAUTH_PRIVATE_KEY="$(cat ops-automation.pk8.pem)"
export KEENAUTH_ISSUER="https://acme.eu.keenauth.app"
tofu plan
Para cada token de gestión, el proveedor firma una aserción de cliente (RFC 7523) válida durante 60 segundos: iss y sub son el ID de cliente, aud es el emisor, jti es aleatorio y kid es la huella RFC 7638 de la clave. Intercambia la aserción mediante la concesión client_credentials por un token de 10 minutos y obtiene uno nuevo un minuto antes de que expire el anterior. El token nunca puede tener más permisos que el registro keenauth_management_client de la aplicación. Los endpoints que solo aceptan una clave de API, como los clientes de gestión, necesitan un alias de proveedor configurado con api_key.
Recursos
| Nombre | Tipo | Qué gestiona |
|---|---|---|
keenauth_application |
resource | Una aplicación (cliente de OAuth 2.0 / OpenID Connect). |
keenauth_connection |
resource | Una conexión de inicio de sesión: base de datos, sin contraseña, clave de acceso, social o empresarial. |
keenauth_connection_oidc_config |
resource | La configuración de la parte confiante de una conexión OIDC empresarial, con un secreto de cliente de solo escritura (OpenTofu o Terraform 1.11+). Se importa con el ID de la conexión. Destruir solo lo elimina del estado. |
keenauth_environment_settings |
resource | Configuración del entorno: idiomas, sesiones, registro, notificaciones, recuperación, MFA, primeros factores. Una por entorno. |
keenauth_attack_protection |
resource | Protección frente a ataques: fuerza bruta, limitación por IP, relleno de credenciales, bots, contraseñas filtradas, registro, fraude por SMS, política de riesgo. Una por entorno. |
keenauth_branding |
resource | El tema del entorno del borrador de marca. Uno por entorno. |
keenauth_custom_domain |
resource | Un dominio personalizado de inicio de sesión. |
keenauth_api_key |
resource | Una clave de API de gestión: solo importación; destruir la revoca. |
keenauth_organization |
resource | Una organización B2B: nombre, slug, ID externo, metadatos, color de marca y límite de miembros. Destruir la elimina de inmediato; las acciones de estado (deshabilitar, habilitar, cancelar eliminación) permanecen en la CLI y el panel. |
keenauth_organization_role |
resource | Un rol específico de organización y su conjunto de permisos (plan Business). Se importa con <org_id>/<key>. |
keenauth_permission |
resource | Un permiso (scope de OAuth) de una API con los textos de su pantalla de consentimiento. Se importa con <api_id>/<value>. |
keenauth_role |
resource | Un rol del entorno y su conjunto completo de permisos. La asignación de usuarios y membresías no son recursos. |
keenauth_organization_domain |
resource | Un dominio de una organización para captura de dominio y enrutamiento de SSO. La verificación sigue siendo una acción. |
keenauth_session_policy |
resource | La duración de las sesiones de una organización; solo puede ser más estricta que la del entorno (plan Enterprise). |
keenauth_mfa_policy |
resource | Las reglas de MFA de una organización; solo pueden ser más estrictas que las del entorno. |
keenauth_email_template |
resource | El contenido publicado de una plantilla de correo (familia e idioma); plan Startup. Se importa con <family>/<locale>. Destruir solo lo elimina del estado. |
keenauth_management_client |
resource | Los permisos de la API de gestión y la lista de IP permitidas de una aplicación management. Se importa con el ID de la aplicación. |
keenauth_directory |
resource | Un directorio SCIM de una organización y su configuración de aprovisionamiento; name y la configuración se cambian en su lugar, mientras que organization_id, scim_host y type lo reemplazan. Se importa con el ID del directorio. |
keenauth_directory_role_mapping |
resource | Asigna un grupo de directorio SCIM a un rol; cualquier cambio lo reemplaza. Se importa con <directory_id>/<mapping_id>. |
keenauth_directory_token |
resource | Un token SCIM de un directorio, guardado en el estado solo cifrado con su clave pública RSA; cualquier cambio crea un token nuevo, y destruir lo revoca. No se puede importar. |
keenauth_webhook_endpoint |
resource | Un endpoint de webhook; todos los argumentos cambian en su lugar. El secreto de firma se guarda en el estado solo cifrado con su clave pública RSA; cambiar la clave o rotation_trigger lo rota. Se importa con el ID o la clave del endpoint. |
keenauth_application |
data source | Lee una aplicación por id o key. |
keenauth_connection |
data source | Lee una conexión por id o key. |
keenauth_organization |
data source | Lee una organización por id o slug. |
keenauth_role |
data source | Lee un rol del entorno por id o key. |
keenauth_environment |
data source | Lee el entorno de la clave de API: ID, tipo, región, celda, estado y plan. |
resource "keenauth_connection" "google" {
key = "google"
type = "social"
strategy = "google"
name = "google"
status = "active"
settings = jsonencode({ scopes = ["openid", "email", "profile"] })
}
resource "keenauth_application" "storefront" {
key = "storefront"
name = "Storefront"
app_type = "web"
party = "first_party"
redirect_uris = ["https://shop.example.com/callback"]
connection_ids = [keenauth_connection.google.id]
}
Importación
Las aplicaciones y las conexiones se pueden importar por su key o su ID, un dominio personalizado por su nombre de host o su ID, y una clave de API por su ID:
tofu import keenauth_application.storefront storefront
tofu import keenauth_connection.google conn_01j9zq3v8c5m2x7k4t6r1n0b3d
tofu import keenauth_custom_domain.login login.example.com
La configuración del entorno, la protección frente a ataques y el borrador de marca existen una vez por entorno; impórtelos con los ID fijos environment-settings, attack-protection y branding. Destruir uno de ellos solo lo elimina del estado.
Cambios seguros
- Una creación envía un
Idempotency-Key, de modo que una creación reintentada nunca genera un segundo objeto. - Una actualización o eliminación envía
If-Matchcon el último ETag leído. Si alguien cambió el objeto después de crear el plan, la API responde412y nada cambia. Ejecuteplande nuevo. - Un cambio hecho en el panel aparece en el siguiente
plancomo desviación, yapplylo revierte. Un objeto eliminado fuera del proveedor se quita del estado y se vuelve a crear. - Una actualización envía solo los campos modificados como JSON merge patch (RFC 7396).
Secretos
Ningún recurso almacena un secreto en texto plano en el estado. Los secretos que entrega a KeenAuth son argumentos de solo escritura (*_wo): el proveedor los envía pero nunca los escribe en los archivos de estado o de plan, y los vuelve a enviar solo cuando cambia su *_wo_version. Necesitan OpenTofu o Terraform 1.11 o posterior. Hoy se trata del secreto de cliente de una conexión OIDC empresarial (keenauth_connection_oidc_config). Los secretos de cliente de las aplicaciones y las claves de firma no los gestiona esta versión del proveedor; créelos y rótelos en el panel o con la CLI. Los secretos que genera KeenAuth no pueden ser de solo escritura, porque un argumento de solo escritura solo transporta un valor desde la configuración hacia el proveedor. El proveedor nunca crea claves de API, porque la clave en bruto terminaría en el estado: cree una clave con la CLI, guárdela en su gestor de secretos e impórtela en keenauth_api_key por su ID. La API muestra el token SCIM de un directorio una sola vez, así que el proveedor revoca el token que devuelve la creación de un directorio y nunca lo conserva; keenauth_directory_token crea el token para su proveedor de identidad y lo guarda en el estado solo cifrado con su clave pública RSA. keenauth_webhook_endpoint guarda el secreto de firma del webhook de la misma forma, solo cifrado con su public_key, y lo descarta cuando no se indica ninguna clave. Los settings de una conexión no deben contener secretos; la API rechaza los ajustes con apariencia de secreto.
Límites de esta versión
- Se gestionan las aplicaciones, las conexiones y su configuración OIDC, la configuración del entorno, la protección frente a ataques, el tema del entorno del borrador de marca, los dominios personalizados, las claves de API (solo importación), las organizaciones, los roles y permisos, los dominios de organización, las políticas de sesión y MFA de organización, las plantillas de correo, los clientes de gestión, los directorios SCIM, sus asignaciones de grupo a rol, los tokens SCIM (cifrados con su clave pública) y los endpoints de webhook. Los hooks, los log streams y las plantillas de SMS llegarán en versiones posteriores.
- El proveedor no publica la marca; publique el borrador en el panel o con
keenauth branding publish. - Los campos opcionales con un valor predeterminado del servidor (por ejemplo
grant_types) conservan su último valor cuando los quita de la configuración. - Las descripciones del esquema y los mensajes de error están en inglés.