diff --git a/tf-stage2/keycloak.tf b/tf-stage2/keycloak.tf index 3e5c033ac88f07a8ce768d2319b905eefd437303..6d9adef67bb760531934090f6ce35ecd13f23fe0 100644 --- a/tf-stage2/keycloak.tf +++ b/tf-stage2/keycloak.tf @@ -20,6 +20,14 @@ data "external" "keycloak_smtp_password" { program = ["${path.module}/../misc/get_key.py", "group_vars/all/vault_keycloak.yml", "vault_keycloak_smtp_password", "json"] } +data "external" "google_recaptcha_site_key" { + program = ["${path.module}/../misc/get_key.py", "group_vars/all/vault_google.yml", "vault_google_recaptcha_site_key", "json"] +} + +data "external" "google_recaptcha_secret_key" { + program = ["${path.module}/../misc/get_key.py", "group_vars/all/vault_google.yml", "vault_google_recaptcha_secret_key", "json"] +} + provider "keycloak" { client_id = "admin-cli" username = data.external.keycloak_admin_user.result.vault_keycloak_admin_user @@ -46,6 +54,7 @@ resource "keycloak_realm" "archlinux" { password_policy = "length(8) and notUsername" browser_flow = "Arch Browser" + registration_flow = "Arch Registration" smtp_server { host = "mail.archlinux.org" @@ -62,6 +71,15 @@ resource "keycloak_realm" "archlinux" { } security_defenses { + headers { + x_frame_options = "ALLOW-FROM https://www.google.com" + content_security_policy = "frame-src 'self' https://www.google.com; frame-ancestors 'self'; object-src 'none';" + content_security_policy_report_only = "" + x_content_type_options = "nosniff" + x_robots_tag = "none" + x_xss_protection = "1; mode=block" + strict_transport_security = "max-age=31536000; includeSubDomains" + } brute_force_detection { permanent_lockout = false max_login_failures = 30 @@ -228,6 +246,66 @@ resource "keycloak_group_roles" "externalcontributor" { ] } +// Add new custom registration flow with reCAPTCHA +resource "keycloak_authentication_flow" "arch_registration_flow" { + realm_id = "archlinux" + alias = "Arch Registration" + description = "Customized Registration flow that forces enables ReCAPTCHA." +} + +resource "keycloak_authentication_subflow" "registration_form" { + realm_id = "archlinux" + alias = "Registration Form" + parent_flow_alias = keycloak_authentication_flow.arch_registration_flow.alias + provider_id = "form-flow" + authenticator = "registration-page-form" + requirement = "REQUIRED" +} + +resource "keycloak_authentication_execution" "registration_user_creation" { + realm_id = "archlinux" + parent_flow_alias = keycloak_authentication_subflow.registration_form.alias + authenticator = "registration-user-creation" + requirement = "REQUIRED" +} + +resource "keycloak_authentication_execution" "registration_profile_action" { + realm_id = "archlinux" + parent_flow_alias = keycloak_authentication_subflow.registration_form.alias + authenticator = "registration-profile-action" + requirement = "REQUIRED" + depends_on = [keycloak_authentication_execution.registration_user_creation] +} + +resource "keycloak_authentication_execution" "registration_password_action" { + realm_id = "archlinux" + parent_flow_alias = keycloak_authentication_subflow.registration_form.alias + authenticator = "registration-password-action" + requirement = "REQUIRED" + depends_on = [keycloak_authentication_execution.registration_profile_action] +} + +resource "keycloak_authentication_execution" "registration_recaptcha_action" { + realm_id = "archlinux" + parent_flow_alias = keycloak_authentication_subflow.registration_form.alias + authenticator = "registration-recaptcha-action" + requirement = "REQUIRED" + depends_on = [keycloak_authentication_execution.registration_password_action] +} + +resource "keycloak_authentication_execution_config" "registration_recaptcha_action_config" { + realm_id = "archlinux" + alias = "reCAPTCHA config" + execution_id = keycloak_authentication_execution.registration_recaptcha_action.id + config = { + "useRecaptchaNet" = "false", + "site.key" = data.external.google_recaptcha_site_key.result.vault_google_recaptcha_site_key + "secret" = data.external.google_recaptcha_secret_key.result.vault_google_recaptcha_secret_key + } +} + +// Add new custom browser login flow with forced OTP for some user roles +// // Try misc/kcadm_wrapper.sh get authentication/flows/{{ your flow alias}}/executions // to make this a whole lot easier. // NOTE: We use the `depends_on` calls to properly order the executions and subflows inside the