Přeskočit obsah

LDAP / Active Directory feed pro normalizaci identity uživatele

Logy často nesou zobrazovaná jména, přihlašovací jména nebo jiné řetězcové identity, které neodpovídají jedinému kanonickému user.id. LDAP (Active Directory) feed může synchronizovat účty do lookupu usernames2userid. Parsec pak používá tento lookup při normalizaci identity aktiv, aby user.name na událostech mapoval na stabilní user.id.

Jde o stejnou cestu feed → lookup jako u threat intelligence feedů, ale cílem je konzistence identity pro Assets, Discover a detekce, ne IOC watchlisty.

Co potřebujete (LDAP vstup)

Než feed napíšete, shromážděte tyto hodnoty. Patří do sekce input: feedu:

Pole Povinné Příklad Význam
source ano ldap://10.91.44.128 nebo "{{LDAP_URL}}" LDAP URL řadiče domény. Použijte ldap://host nebo ldap://host:389. Pro TLS ldaps://host nebo ldaps://host:636. Feeds zkopíruje URL do LDAP připojení uri. Může použít Vault placeholder (Feeds v26.12.07+, LogMan.io v26.12.12).
username ano adldap@domain.int nebo "{{LDAP_BIND_USER}}" Bind účet (UPN nebo DOMAIN\user). Potřebuje čtení uživatelů, které hledáte. Může použít Vault placeholder (Feeds v26.12.07+, LogMan.io v26.12.12).
password ano "{{LDAP_USER_PASSWORD}}" Bind heslo. Preferujte Vault placeholder (Feeds v26.12.07+, LogMan.io v26.12.12); plaintext jen v labu.
base ano dc=DOMAIN,dc=int LDAP base DN, kde začíná hledání (obvykle kořen domény nebo konkrétní OU).
filter ano (&(objectCategory=person)(objectClass=user)) LDAP filtr výběru uživatelských účtů (bez počítačových objektů).
attributes ano sAMAccountName displayName AD atributy oddělené mezerou. Každý atribut v schema / apply musí být uveden zde.
period ano 1h Jak často feed znovu spustí hledání (např. 1h, 1d).
type ano ldap Musí být ldap, aby LogMan.io Feeds použil LDAP zdroj.

Síť: služba LogMan.io Feeds musí dosáhnout na host a port v source (firewall / DNS). Preferujte dedikovaný bind účet pouze pro čtení omezený na potřebné OU.

Na straně LogMan.io také:

  • Existuje lookup usernames2userid (common library, default: true, skupina asset).
  • Parsery emitují user.name (nebo jiné pole uvedené pod usernames2userid v /Schemas/Mappings/Asset_<schema>.yaml).

Varianta podle SID (sids2userid): Threat intelligence feedy: Active Directory SID na user ID. Jak Parsec aplikuje asset lookupy: Správa aktiv a activity stream.

Použití Vault placeholderu pro heslo

Dostupnost

Rozbalení placeholderů {{…}} / ${passwords:…} z [passwords] v deklaracích feedů vyžaduje LogMan.io Feeds v26.12.07 nebo novější (LogMan.io v26.12.12).

Neukládejte tajemství do sdíleného YAML feedu v Knihovně jako plaintext. Do polí jako source / url, username, password nebo HTTP headers dejte placeholder; LogMan.io Feeds načte skutečnou hodnotu ze své konfigurace služby ([passwords]), kterou ASAB Maestro doplní z Vaultu.

Typické rozdělení práce:

Krok Kdo Co
1 Admin / operátor Uložit tajemství do Vaultu
2 Admin / operátor Namapovat tajemství na lmio-feeds v /Site/model.yaml a aplikovat
3 Analytik Použít placeholdery v deklaraci feedu (Knihovna /Feeds/…)

1. Uložení hesla do Vaultu

Na hostu LogMan.io (upravte název tajemství, pokud používáte jiné id):

curl -X PUT localhost:8891/vault/LDAP_USER_PASSWORD --data 'supersecret'

Názvy tajemství jsou case insensitive. Použijte stabilní id velkými písmeny, např. LDAP_USER_PASSWORD nebo LDAP_FEEDS_BIND_PASSWORD.

Stejný Vault vzor používá SeaCat Auth LDAP; viz Integrace LDAP serveru.

2. Mapování tajemství do konfigurace Feeds

V /Site/model.yaml deklarujte tajemství a vložte ho do sekce Feeds [passwords]:

services:
  lmio-feeds:
    asab:
      config:
        passwords:
          LDAP_USER_PASSWORD: "{{LDAP_USER_PASSWORD}}"

secrets:
  LDAP_USER_PASSWORD: {}

Poté aplikujte model (Použít v Knihovně na /Site, nebo na hostu ./gov.sh up). Po aplikaci vygenerovaný /conf/lmio-feeds.conf obsahuje např.:

[passwords]
LDAP_USER_PASSWORD=<value from vault>

Restartujte / znovu vytvořte instanci Feeds, pokud váš provozní proces automaticky nenačte změny konfigurace.

3. Odkaz na tajemství ve feedu

V sekci input feedu nastavte password na placeholder (stejný název jako ve Vaultu / modelu):

input:
  source: ldap://10.91.44.128
  type: ldap
  username: adldap@domain.int
  password: "{{LDAP_USER_PASSWORD}}"
  base: dc=DOMAIN,dc=int
  filter: (&(objectCategory=person)(objectClass=user))
  attributes: sAMAccountName displayName
  period: 1h

Ekvivalent ve stylu ASAB:

password: ${passwords:LDAP_USER_PASSWORD}

Obyčejné password: … stále funguje v labu; necommitujte reálná hesla do sdílených Knihoven.

HTTP hlavičky (Authorization a podobně)

Stejné placeholdery fungují uvnitř hodnot HTTP hlaviček, včetně JSON řetězců headers u TI a jiných HTTP feedů:

input:
  source: https://ti.example.com/api/v1/ips
  type: json
  headers: '{"Authorization": "Bearer {{API_TOKEN}}"}'

Mapujte API_TOKEN do Feeds [passwords] stejně jako LDAP (Vault + model.yaml). Můžete použít i YAML mapování:

headers:
  Authorization: "Bearer {{API_TOKEN}}"
  X-Api-Key: "{{API_TOKEN}}"

Pole URL (source, url, uri, oauth2_token_url, proxy_url) podporují stejné placeholdery, např. source: "{{LDAP_URL}}".

Když feed selže při bindu

  • Ověřte, že záznam ve Vaultu existuje (curl list/get přes Remote Control Vault API podle vašeho procesu).
  • Ověřte, že secrets: a passwords: v modelu používají stejný název jako uvnitř {{…}}.
  • Ověřte, že model byl aplikován a Feeds conf byl znovu vygenerován.
  • V logu Feeds chybějící mapování vypadá jako: secret was not found in the [passwords] section.

Co získáte

Část Role
LDAP / AD Zdroj pravdy pro názvy účtů (displayName, sAMAccountName a podobně)
Feed (lmio/feed, type: ldap) Periodicky čte AD a zapisuje řádky lookupu
Lookup usernames2userid Mapuje řetězec uživatelského jména (klíč) na user.id (atribut)
Parsec asset mapping U každé události hledá user.name v usernames2userid a doplní user.id, pokud chybí
Active Directory  →  LDAP feed  →  usernames2userid  →  Parsec identity normalization  →  user.id on events / Assets

1. Lookup: usernames2userid

Deklarace v common library (/Lookups/usernames2userid.yaml):

---
define:
  type: lookup/string
  name: usernames2userid
  label: User names to User ID
  description_title: List of user names or other string values to user IDs
  group: asset
  default: true

keys:
  - name: name
    type: str

fields:
  user.id:
    type: str
  • Klíč: řetězec, jak se objeví v logách (např. displayName nebo jiný AD atribut zvolený jako apply.key).
  • Atribut user.id: kanonická identita, kterou Parsec zapíše po úspěšné normalizaci (často sAMAccountName nebo sAMAccountName@tenant).

ECS asset mapping propojí lookup s user.name:

identity:
  usernames2userid:
    - user.name

Pokud je user.id na události už nastaveno, Parsec ho nepřepisuje. Lookup se stále spouští pro kontext aktiva. Když lookup nic nenajde, volitelný fallback na user.name (např. lowercase_and_domain_removal) může stále vytvořit id.

2. Vytvoření LDAP feedu

Přidejte deklaraci feedu pod /Feeds/ v Knihovně (nebo ji vytvořte z UI Lookups s cestou feedu). Vyplňte každé povinné pole input podle Co potřebujete.

---
define:
  type: lmio/feed
  name: LDAP User Name Extractor

  schema:
    sAMAccountName: str
    displayName: str

input:
  source: ldap://10.91.44.128
  type: ldap
  username: adldap@domain.int
  password: "{{LDAP_USER_PASSWORD}}"
  base: dc=DOMAIN,dc=int
  filter: (&(objectCategory=person)(objectClass=user))
  attributes: sAMAccountName displayName
  period: 1h

apply:
  key: !ITEM EVENT displayName
  user.id:
    !JOIN
    delimiter: "@"
    items:
      - !ITEM EVENT sAMAccountName
      - !ARG TENANT

output:
  lookup: usernames2userid

Mapování:

  • source / type: ldap: LogMan.io Feeds otevře LDAP připojení (ldap://… nebo ldaps://…) a při každém period provede hledání.
  • password: "{{…}}": bind heslo z Vaultu / Feeds [passwords] (viz Použití Vault placeholderu pro heslo); vyhněte se plaintext heslům ve sdíleném YAML Knihovny.
  • base a filter: omezí hledání na OU / uživatelské objekty, které vás zajímají.
  • attributes: do schématu feedu se načtou jen uvedené AD atributy.
  • apply.key: stane se klíčem lookupu. Zde displayName odpovídá logům se zobrazovaným jménem v user.name.
  • apply.user.id: hodnota uložená na řádku lookupu. Příklad sestaví sAMAccountName@<tenant> pomocí !JOIN a !ARG TENANT. Pro prostý název účtu:
apply:
  key: !ITEM EVENT displayName
  user.id:
    !CAST
    what: !ITEM EVENT sAMAccountName
    type: str

Zvolte atribut klíče tak, aby odpovídal tomu, co parsery dávají do user.name. Pokud logy už používají sAMAccountName, nastavte klíč i user.id z toho atributu (nebo feed pro ty zdroje přeskočte).

Volitelně: e-maily → user.id

Stejný vzor plní useremails2userid z AD mail, které Parsec mapuje z user.email. Viz testovací feed v knihovně Feeds LDAP User Email Extractor; výstupní lookup musí být useremails2userid.

3. Ověření lookupu

  1. Počkejte jeden period feedu (nebo spusťte feed ručně, pokud to váš provoz umožňuje).
  2. Otevřete Lookups → usernames2userid a ověřte klíče (display names) a hodnoty user.id.
  3. Pošlete nebo počkejte na událost, kde user.name rovná klíči lookupu a user.id je prázdné.
  4. V Discover ověřte doplněné user.id. V Assets by měl uživatelský principál odpovídat tomuto id.

4. Jak automatická normalizace používá data

Na parse cestě, po obohacení, AssetIdentityProcessor (z /Schemas/Mappings/Asset_ECS.yaml):

  1. Načte user.name z události.
  2. Vyhledá řetězec v usernames2userid.
  3. Pokud řádek má user.id, zapíše ho na událost, když user.id bylo prázdné.
  4. Pokračuje s useremails2userid / fallbacky podle konfigurace.

Normalizované user.id řídí inventář Assets, principály activity streamu a konzistentní korelaci na identitu.

Pořadí e-mailových lookupů: nejdřív uživatelská jména, pak e-maily, pak fallback. Detaily: Parsec správa aktiv.

Praktické tipy

  • Preferujte Vault placeholder v password (např. "{{LDAP_USER_PASSWORD}}"); viz Použití Vault placeholderu pro heslo.
  • Slaďte velikost písmen a formát klíčů feedu s parsovaným user.name (mezery, diakritika, DOMAIN\user vs display name). Neshoda klíčů tiše mine.
  • Preferujte read-only AD bind účet omezený na potřebné OU.
  • period držte dost krátké pro nástupy a odchody (často 1h); velmi velké adresáře mohou potřebovat delší periodu nebo užší filtr.
  • Jeden feed by měl vlastnit obsah usernames2userid, pokud nemáte jasnou strategii slučování.
  • Pro Windows události jen se SID použijte samostatný LDAP feed do sids2userid (a Windows SID enrichery), ne tento lookup.
  • UI alternate names na aktivu mohou lookupy doplnit; feed udržuje mapování ve škále adresáře aktuální automaticky.

Související čtení