Files
Guillaume BOURGEOIS b98d315fe4 feat(openldap): LDAP authentication integration (OpenLDAP / Active Directory)
LDAP authentication over the ldap3 library, designed to run on a remote engine
inside the directory network. Auto-detects the vendor (OpenLDAP or Active
Directory). 5 commands: test connection, ad-authenticate (simple bind),
ad-groups (fetch all or specific groups), ad-authenticate-and-roles (bind +
return the user's groups and attributes), and ad-entries-search (generic LDAP
search with cn/uid/objectClass/description filters, scope, attribute selection
and paging).

Scripts share a ported LdapClient that handles SSL/LDAPS/Start TLS, vendor
detection, OpenLDAP vs AD group/role resolution and paged search. ldap3 is
imported defensively with a clear "pip install ldap3" message when missing. No
ingestion source, so no OCSF mapper.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-26 17:44:54 +02:00

152 lines
6.9 KiB
YAML

id: openldap
name: OpenLDAP
version: 1.0.0
description: "LDAP authentication for OpenLDAP or Active Directory — simple bind, fetch groups, authenticate-and-resolve-roles, and a generic LDAP entries search. Vendor is auto-detected. Runs on a remote engine inside the LDAP network. Requires the Python 'ldap3' library on the engine host (pip install ldap3)."
changelog: "1.0.0 — Initial release: ad-authenticate (simple bind), ad-groups (fetch all or specific groups), ad-authenticate-and-roles (bind + return the user's groups and attributes), ad-entries-search (generic LDAP search). Supports OpenLDAP and Active Directory with automatic vendor detection."
category: identity
# Per-instance configuration. Binds to an LDAP server (OpenLDAP or Active
# Directory) over plain LDAP (389), LDAPS (636) or Start TLS. Run this integration
# on a remote engine that can reach the directory. The bundled scripts require the
# Python 'ldap3' library on the engine host: pip install ldap3
config_schema:
properties:
ldap_server_vendor:
type: string
description: "LDAP vendor: OpenLDAP, Active Directory, or Auto (detect automatically). Default Auto."
default: Auto
host:
type: string
description: "LDAP server IP or host name (e.g. 192.168.0.1 or ldap.company.com)"
port:
type: string
description: "Port. Default 389 (LDAP / Start TLS) or 636 (LDAPS)."
username:
type: string
description: "Bind user DN (e.g. cn=admin,ou=users,dc=domain,dc=com)"
password:
type: string
description: "Bind password"
x-soar-sensitive: true
base_dn:
type: string
description: "Base DN (e.g. dc=domain,dc=com)"
connection_type:
type: string
description: "Connection security: None, SSL (LDAPS), or Start TLS. Default None."
default: None
ssl_version:
type: string
description: "SSL/TLS protocol: None, TLS, TLSv1, TLSv1_1, TLSv1_2, or TLS_CLIENT. Default None."
default: None
insecure:
type: boolean
description: "Trust any TLS certificate (not secure)"
default: false
page_size:
type: string
description: "LDAP paging size for searches"
default: "500"
fetch_groups:
type: boolean
description: "Auto-populate groups in ad-groups when no specific group is requested"
default: true
group_filter_class:
type: string
description: "Groups object class (OpenLDAP only)"
default: posixGroup
group_identifier_attribute:
type: string
description: "Groups unique identifier attribute (OpenLDAP only)"
default: gidNumber
member_identifier_attribute:
type: string
description: "Group membership identifier attribute (OpenLDAP only)"
default: memberUid
user_filter_class:
type: string
description: "User object class (OpenLDAP only)"
default: posixAccount
user_identifier_attribute:
type: string
description: "User unique identifier attribute (OpenLDAP only)"
default: uid
custom_attributes:
type: string
description: "Extra user attributes added to the user filter in ad-authenticate-and-roles, as 'attrA=valA,attrB=valB' (OpenLDAP only)"
required:
- ldap_server_vendor
- host
- username
- password
- base_dn
- connection_type
commands:
- id: test_connection
name: ad-test-connection
description: "Bind to the LDAP server with the configured credentials (used by the Test button)."
risk: read
inputs_schema:
properties: {}
required: []
outputs_schema: { properties: {} }
- id: ad_authenticate
name: ad-authenticate
description: "Perform a simple bind on the LDAP server with the given username and password."
risk: read
inputs_schema:
properties:
username: { type: string, description: "Username for simple authentication" }
password: { type: string, description: "Password for simple authentication", x-soar-sensitive: true }
required: [username, password]
outputs_schema: { properties: {} }
- id: ad_groups
name: ad-groups
description: "Fetch LDAP groups under the base DN, or a specific set of groups (DNs delimited by '#')."
risk: read
inputs_schema:
properties:
specific-groups: { type: string, description: "Group object names/DNs to fetch, delimited by a number sign (#)" }
required: []
outputs_schema: { properties: {} }
- id: ad_authenticate_and_roles
name: ad-authenticate-and-roles
description: "Simple bind on the LDAP server and return the authenticated user's groups and selected attributes."
risk: read
inputs_schema:
properties:
username: { type: string, description: "Username for simple authentication" }
password: { type: string, description: "Password for simple authentication", x-soar-sensitive: true }
attribute-mail: { type: string, description: "Mail attribute to return (default mail)" }
attribute-name: { type: string, description: "Name attribute to return (default name)" }
attribute-phone: { type: string, description: "Phone attribute to return (default mobile)" }
attribute-name-pull: { type: string, description: "Return the name attribute (default true)" }
attribute-mail-pull: { type: string, description: "Return the mail attribute (default true)" }
attribute-phone-pull: { type: string, description: "Return the phone attribute (default false)" }
required: [username, password]
outputs_schema: { properties: {} }
- id: ad_entries_search
name: ad-entries-search
description: "Generic LDAP search. Combine raw search_filter with cn/uid/object_class/description filters (joined with OR), choose scope and attributes, and page the results."
risk: read
inputs_schema:
properties:
search_base: { type: string, description: "Where the search starts (defaults to the instance base_dn)" }
search_filter: { type: string, description: "Raw LDAP filter; joined with the other filter args using OR" }
search_scope: { type: string, description: "BASE, LEVEL or SUBTREE (default SUBTREE)" }
attributes: { type: string, description: "none, all_user_attributes, all_operational_attributes, all, or a CSV list (default all)" }
cn: { type: string, description: "CSV list of CNs to filter by (joined with AND)" }
uid: { type: string, description: "CSV list of UIDs to filter by (joined with AND)" }
object_class: { type: string, description: "CSV list of objectClasses to filter by (joined with AND)" }
description: { type: string, description: "CSV list of descriptions to filter by (joined with AND)" }
page: { type: number, description: "Page number to return" }
page_size: { type: number, description: "Entries per page (max 2000, default 50)" }
limit: { type: number, description: "Maximum entries to return when not paging (default 50)" }
required: []
outputs_schema: { properties: {} }