feat: use authentik ldap outpost for ldap instead of 389ds+keycloak

Signed-off-by: Bert-Jan Fikse <bert-jan@whatwedo.ch>
This commit is contained in:
Bert-Jan Fikse 2026-04-10 15:18:53 +02:00
parent 1641956dd2
commit 0e1c07625a
Signed by: bert-jan
GPG key ID: C1E0AB516AC16D1A
5 changed files with 111 additions and 40 deletions

View file

@ -25,11 +25,24 @@ authentik_proxy_outposts:
authentik_host_browser: "https://authentik.local.test/" authentik_host_browser: "https://authentik.local.test/"
log_level: "info" log_level: "info"
authentik_ldap_apps:
- slug: ldap
name: LDAP
base_dn: "dc=local,dc=test"
search_group: admins
authentik_ldap_outpost:
name: "ldap-outpost"
token: "vagrant-ldap-outpost-token-change-in-production"
config:
authentik_host: "https://authentik.local.test/"
log_level: "info"
authentik_oidc_apps: authentik_oidc_apps:
- slug: nextcloud - slug: nextcloud
name: Nextcloud name: Nextcloud
client_id_env: NEXTCLOUD_OIDC_CLIENT_ID client_id: test1234
client_secret_env: NEXTCLOUD_OIDC_CLIENT_SECRET client_secret: test1234
redirect_uris: redirect_uris:
- url: "https://nextcloud.local.test/apps/user_oidc/code" - url: "https://nextcloud.local.test/apps/user_oidc/code"
matching_mode: strict matching_mode: strict
@ -38,14 +51,24 @@ authentik_oidc_apps:
authorization_slug: default-provider-authorization-implicit-consent authorization_slug: default-provider-authorization-implicit-consent
invalidation_slug: default-provider-invalidation-flow invalidation_slug: default-provider-invalidation-flow
scopes: [openid, email, profile, offline_access] scopes: [openid, email, profile, offline_access]
- slug: opencloud
name: OpenCloud
client_type: public
client_id: opencloud
redirect_uris:
- url: "https://opencloud.local.test/oidc-callback.html"
matching_mode: strict
- url: "https://opencloud.local.test/"
matching_mode: strict
scopes: [openid, email, profile, offline_access]
authentik_entra_sources: authentik_entra_sources:
- slug: entra-id - slug: entra-id
name: "Login with Entra" name: "Login with Entra"
tenant_mode: multi # Use 'single' with real tenant ID in production tenant_mode: multi # Use 'single' with real tenant ID in production
# tenant_id_env: ENTRA_TENANT_ID # Not needed for multi-tenant mode # tenant_id: "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" # Not needed for multi-tenant mode
client_id_env: ENTRA_CLIENT_ID client_id: "placeholder-change-in-production"
client_secret_env: ENTRA_CLIENT_SECRET client_secret: "placeholder-change-in-production"
scopes: scopes:
- openid - openid
- profile - profile
@ -54,16 +77,15 @@ authentik_entra_sources:
authentik_login_sources: authentik_login_sources:
- slug: entra-id - slug: entra-id
authentik_groups:
- name: admins
authentik_local_users: authentik_local_users:
- username: akadmin - username: akadmin
name: "Authentik Admin" name: "Authentik Admin"
email: "admin@local.test" email: "admin@local.test"
password_env: AKADMIN_PASSWORD password: "admin"
is_active: true is_active: true
groups: groups:
- authentik Admins - authentik Admins
- admins
authentik_blueprint_env:
AKADMIN_PASSWORD: "admin"
NEXTCLOUD_OIDC_CLIENT_ID: test1234
NEXTCLOUD_OIDC_CLIENT_SECRET: test1234

View file

@ -30,34 +30,38 @@ nextcloud_s3_ssl: false
nextcloud_s3_usepath_style: true nextcloud_s3_usepath_style: true
# Extra hosts for container DNS resolution (Vagrant only) # Extra hosts for container DNS resolution (Vagrant only)
nextcloud_extra_networks:
- ldap
nextcloud_extra_hosts: nextcloud_extra_hosts:
- "storage.local.test:192.168.56.11" - "storage.local.test:192.168.56.11"
- "keycloak.local.test:192.168.56.11" - "keycloak.local.test:192.168.56.11"
- "authentik.local.test:192.168.56.11" - "authentik.local.test:192.168.56.11"
- "389ds:192.168.56.11" # - "389ds:192.168.56.11" # only needed when using 389ds LDAP directly
# LDAP backend (pre-create users synced from Keycloak via 389ds) # LDAP backend (Authentik LDAP outpost)
nextcloud_ldap_enabled: true nextcloud_ldap_enabled: true
nextcloud_ldap_config: nextcloud_ldap_config:
ldapHost: "ldaps://389ds" ldapHost: "ldap://authentik-outpost-ldap-ldap-1"
ldapPort: "3636" ldapPort: "3389"
ldapAgentName: "cn=Directory Manager" ldapAgentName: "cn=akadmin,ou=users,dc=local,dc=test"
ldapAgentPassword: "admin" ldapAgentPassword: "admin"
ldapBase: "dc=local,dc=test" ldapBase: "dc=local,dc=test"
ldapBaseUsers: "ou=users,dc=local,dc=test" ldapBaseUsers: "ou=users,dc=local,dc=test"
ldapTLS: "0" ldapTLS: "0"
turnOffCertCheck: "1" turnOffCertCheck: "1"
ldapUserFilter: "(&(objectclass=inetOrgPerson)(uid=*))" ldapUserFilter: "(&(objectClass=user)(cn=*))"
ldapUserFilterObjectclass: "inetOrgPerson" ldapUserFilterObjectclass: "user"
ldapLoginFilter: "(&(objectclass=inetOrgPerson)(uid=%uid))" ldapLoginFilter: "(&(objectClass=user)(cn=%uid))"
ldapLoginFilterUsername: "1" ldapLoginFilterUsername: "1"
ldapUserDisplayName: "displayName" ldapUserDisplayName: "cn"
ldapEmailAttribute: "mail" ldapEmailAttribute: "mail"
ldapExpertUsernameAttr: "uid" ldapExpertUsernameAttr: "cn"
ldapExpertUUIDUserAttr: "nsuniqueid" ldapExpertUUIDUserAttr: "uid"
ldapExpertUUIDGroupAttr: "uid"
ldapBaseGroups: "ou=groups,dc=local,dc=test" ldapBaseGroups: "ou=groups,dc=local,dc=test"
ldapGroupFilter: "(&(objectClass=groupOfNames))" ldapGroupFilter: "(&(objectClass=group))"
ldapGroupFilterObjectclass: "groupOfNames" ldapGroupFilterObjectclass: "group"
ldapGroupDisplayName: "cn" ldapGroupDisplayName: "cn"
ldapGroupMemberAssocAttr: "member" ldapGroupMemberAssocAttr: "member"
ldapAdminGroup: "admins" ldapAdminGroup: "admins"
@ -65,6 +69,34 @@ nextcloud_ldap_config:
ldapPagingSize: "500" ldapPagingSize: "500"
ldapExperiencedAdmin: "1" ldapExperiencedAdmin: "1"
ldapConfigurationActive: "1" ldapConfigurationActive: "1"
# LDAP backend (389ds via Keycloak federation)
# nextcloud_ldap_config:
# ldapHost: "ldaps://389ds"
# ldapPort: "3636"
# ldapAgentName: "cn=Directory Manager"
# ldapAgentPassword: "admin"
# ldapBase: "dc=local,dc=test"
# ldapBaseUsers: "ou=users,dc=local,dc=test"
# ldapTLS: "0"
# turnOffCertCheck: "1"
# ldapUserFilter: "(&(objectclass=inetOrgPerson)(uid=*))"
# ldapUserFilterObjectclass: "inetOrgPerson"
# ldapLoginFilter: "(&(objectclass=inetOrgPerson)(uid=%uid))"
# ldapLoginFilterUsername: "1"
# ldapUserDisplayName: "displayName"
# ldapEmailAttribute: "mail"
# ldapExpertUsernameAttr: "uid"
# ldapExpertUUIDUserAttr: "nsuniqueid"
# ldapBaseGroups: "ou=groups,dc=local,dc=test"
# ldapGroupFilter: "(&(objectClass=groupOfNames))"
# ldapGroupFilterObjectclass: "groupOfNames"
# ldapGroupDisplayName: "cn"
# ldapGroupMemberAssocAttr: "member"
# ldapAdminGroup: "admins"
# ldapCacheTTL: "600"
# ldapPagingSize: "500"
# ldapExperiencedAdmin: "1"
# ldapConfigurationActive: "1"
# OIDC providers for login # OIDC providers for login
nextcloud_oidc_providers: nextcloud_oidc_providers:

View file

@ -1,19 +1,20 @@
opencloud_domain: "opencloud.local.test" opencloud_domain: "opencloud.local.test"
opencloud_admin_password: "admin" opencloud_admin_password: "admin"
opencloud_extra_networks:
- ldap
opencloud_extra_hosts: opencloud_extra_hosts:
- "opencloud.local.test:host-gateway" - "opencloud.local.test:host-gateway"
- "keycloak.local.test:host-gateway" - "authentik.local.test:192.168.56.11"
- "storage.local.test:192.168.56.11" - "storage.local.test:192.168.56.11"
- "office.local.test:host-gateway" - "office.local.test:host-gateway"
- "drawio.local.test:host-gateway" - "drawio.local.test:host-gateway"
- "389ds:192.168.56.11"
# OIDC configuration (Keycloak) # OIDC configuration (Authentik)
opencloud_oidc_issuer: "https://keycloak.local.test/realms/vagrant" opencloud_oidc_issuer: "https://authentik.local.test/application/o/opencloud/"
opencloud_oidc_client_id: "opencloud" opencloud_oidc_client_id: "opencloud"
opencloud_oidc_client_secret: "opencloud-secret-change-in-production" opencloud_oidc_client_secret: "opencloud-secret-change-in-production"
opencloud_oidc_account_edit_url: "https://keycloak.local.test/realms/vagrant/account" opencloud_oidc_account_edit_url: "https://authentik.local.test/if/user/#/settings"
opencloud_oidc_autoprovision_accounts: false opencloud_oidc_autoprovision_accounts: true
# S3 storage configuration using Garage # S3 storage configuration using Garage
opencloud_use_s3_storage: true opencloud_use_s3_storage: true
@ -26,12 +27,18 @@ opencloud_s3_bucket: "opencloud"
opencloud_collabora_domain: "office.local.test" opencloud_collabora_domain: "office.local.test"
opencloud_wopi_domain: "wopi.opencloud.local.test" opencloud_wopi_domain: "wopi.opencloud.local.test"
# LDAP backend (users synced from Keycloak via 389ds) # LDAP backend (Authentik LDAP outpost)
opencloud_ldap_uri: "ldaps://389ds:3636" opencloud_ldap_uri: "ldap://authentik-outpost-ldap-ldap-1:3389"
opencloud_ldap_bind_dn: "cn=Directory Manager" opencloud_ldap_bind_dn: "cn=akadmin,ou=users,dc=local,dc=test"
opencloud_ldap_bind_password: "admin" opencloud_ldap_bind_password: "admin"
opencloud_ldap_user_base_dn: "ou=users,dc=local,dc=test" opencloud_ldap_user_base_dn: "ou=users,dc=local,dc=test"
opencloud_ldap_group_base_dn: "ou=groups,dc=local,dc=test" opencloud_ldap_group_base_dn: "ou=groups,dc=local,dc=test"
opencloud_ldap_user_schema_id: "uid"
opencloud_ldap_user_schema_id_is_octet_string: false
opencloud_ldap_user_schema_username: "cn"
opencloud_ldap_user_schema_display_name: "cn"
opencloud_ldap_group_schema_id: "uid"
opencloud_ldap_group_schema_id_is_octet_string: false
# Draw.io integration # Draw.io integration
opencloud_drawio_url: "https://drawio.local.test" opencloud_drawio_url: "https://drawio.local.test"
@ -48,6 +55,6 @@ opencloud_role_mapping:
# CSP configuration # CSP configuration
opencloud_csp_extra_connect_src: opencloud_csp_extra_connect_src:
- "https://keycloak.local.test/" - "https://authentik.local.test/"
opencloud_csp_extra_frame_src: opencloud_csp_extra_frame_src:
- "https://drawio.local.test/" - "https://drawio.local.test/"

View file

@ -57,6 +57,10 @@ all:
hosts: hosts:
backend: backend:
authentik_outpost_ldap_servers:
hosts:
backend:
garage_servers: garage_servers:
hosts: hosts:
backend: backend:

View file

@ -41,18 +41,24 @@
roles: roles:
- digitalboard.core.collabora - digitalboard.core.collabora
- name: Deploy nextcloud service
hosts: nextcloud_servers
become: yes
roles:
- digitalboard.core.nextcloud
- name: Deploy authentik service - name: Deploy authentik service
hosts: authentik_servers hosts: authentik_servers
become: yes become: yes
roles: roles:
- digitalboard.core.authentik - digitalboard.core.authentik
- name: Deploy authentik LDAP outpost
hosts: authentik_outpost_ldap_servers
become: yes
roles:
- digitalboard.core.authentik_outpost_ldap
- name: Deploy nextcloud service
hosts: nextcloud_servers
become: yes
roles:
- digitalboard.core.nextcloud
- name: Deploy drawio service - name: Deploy drawio service
hosts: drawio_servers hosts: drawio_servers
become: yes become: yes