Synit ADProxy
Konfigurationsreferenz
Vollständige HCL-Referenz für Synit ADProxy und den separaten Synit AD MCP Prozess: Defaults, erlaubte Werte, Validierungsregeln und Pflichtblöcke.
Konfigurationsreferenz
Diese Referenz beschreibt alle aktuell vom HCL-Loader akzeptierten ADProxy-Konfigurationsblöcke. Unbekannte HCL-Felder sind keine Zukunftsoptionen, sondern Konfigurationsfehler.
Gültigkeitsbereich
directory, snapshot und audit sind in jeder HCL-Datei Pflicht, auch für den separaten adproxy-mcp Prozess. server ist optional und verwendet ohne Block die Standardadresse 127.0.0.1:8765.
adproxy-server und adproxy-mcp sind getrennte Prozesse:
adproxy-serverlehntmcp.enabled = truebeiserveundvalidate-configab.adproxy-mcpsetzt MCP beim Start selbst auf aktiv und verwendet denmcp-Block für Transport und Policies.- Für HTTP und MCP werden daher getrennte gerenderte Konfigurationsdateien empfohlen. Gemeinsame Blöcke wie
directory,schema,cache,query_policy,limitsundredactiondürfen identisch sein.
Alle Zeitwerte verwenden Go-Durationswerte, etwa "30s", "200ms" oder "5m". snapshot.max_size akzeptiert Bytes oder die Endungen MiB, GiB, MB und GB.
Minimale gültige HTTP-Konfiguration
server {
listen_addr = "127.0.0.1:8765"
auth_token "reader" {
secret_ref = "env:ADPROXY_API_READ_TOKEN"
access = "read-only"
}
auth_token "writer" {
secret_ref = "env:ADPROXY_API_WRITE_TOKEN"
access = "read-write"
}
}
directory {
domain = "example.test"
bind_url = "ldaps://dc1.example.test"
bind_dn = "CN=svc-adproxy,OU=Service Accounts,DC=example,DC=test"
bind_password_ref = "env:AD_BIND_PASSWORD"
}
snapshot {
path = "/var/lib/adproxy/snapshot"
max_size = "256MiB"
}
audit {
file_enabled = true
file_path = "/var/log/adproxy/audit-2006-01-02.jsonl"
}
directory.bind_password_ref, server.auth_token.<client_id>.secret_ref, mcp.auth_token_ref und mcp.query_cursor_secret_ref akzeptieren ausschließlich env:NAME und file:/absolute/or/relative/path. Bevorzugen Sie Referenzen; Literalwerte bleiben nur kompatibel.
HTTP-Service
| Feld | Default / erlaubte Werte | Regel |
|---|---|---|
server.listen_addr |
127.0.0.1:8765 |
Muss host:port sein. Ohne server.tls ist nur Loopback zulässig. |
server.auth_token |
leer | Legacy Bearer-Secret ohne benannte Client-ID. |
server.auth_token "<client_id>".secret |
eine von secret/secret_ref |
Literal Secret; nicht für eingecheckte HCL-Dateien. |
server.auth_token "<client_id>".secret_ref |
eine von secret/secret_ref |
env:NAME oder file:PATH; beim Service-Start aufgelöst. |
server.auth_token "<client_id>".access |
read-write |
read-only oder read-write. |
server.read_timeout |
30s |
Positiver Go-Duration-Wert. |
server.write_timeout |
30s |
Positiver Go-Duration-Wert. |
server.idle_timeout |
60s |
Positiver Go-Duration-Wert. |
server.read_rate_limit_rps |
50 |
Mit Burst gemeinsam setzen; beide 0 deaktiviert das Read-Limit. Sonst beide positiv. |
server.read_rate_limit_burst |
100 |
Mit RPS gemeinsam setzen; beide 0 deaktiviert das Read-Limit. Sonst beide positiv. |
server.tls.cert_file, key_file |
leer | Sobald irgendein server.tls Feld gesetzt ist, sind Zertifikat und Key erforderlich. |
server.tls.chain_file |
leer | Optionale PEM-Datei mit Zwischenzertifikaten, die nach dem Serverzertifikat ausgeliefert werden. |
Ein read-only Token darf Query, Schema und Plan-only aufrufen. Apply und kombinierte Plan-and-Apply Requests benötigen read-write. adproxy-server lehnt eine Konfiguration ohne HTTP-Token ab. /readyz bleibt unauthentifiziert.
TLS und entfernte Konfigurationsblöcke
Die früheren Blöcke dev und Top-Level-tls werden nicht mehr akzeptiert. server.allow_anonymous ist ebenfalls entfernt. Alte Dateien brechen beim Laden mit einem konkreten Migrationshinweis ab. HTTPS gehört ausschließlich in server.tls; Client-Zertifikat-Authentifizierung ist nicht implementiert.
Zertifikat, Key und optionale Chain werden beim Start geladen. Unlesbare oder ungültige Dateien sowie ein nicht passender Key verhindern den Listener-Start. Nach einer Zertifikatsrotation muss der Prozess neu gestartet werden.
Active Directory
| Feld | Default / erlaubte Werte | Regel |
|---|---|---|
directory.domain |
erforderlich | AD-Domain. |
directory.bind_url |
erforderlich | Für Produktion ldaps://...; LDAP-Zertifikate werden standardmässig geprüft. |
directory.bind_dn |
erforderlich | Servicekonto mit minimal benötigten AD-Rechten. |
directory.bind_password_ref |
erforderlich | env:NAME oder file:PATH. |
directory.hosts |
leer | Zulässige Domain Controller für Routing, auch für target_dc. |
directory.timeout |
30s |
Muss positiv sein. |
directory.retry_attempts |
3 |
Gesamtzahl der Leseversuche, einschliesslich des ersten. Muss positiv sein. |
directory.retry_initial_backoff |
200ms |
Muss positiv sein. |
directory.retry_max_backoff |
2s |
Muss mindestens retry_initial_backoff sein. |
directory.tls.ca_file |
leer | PEM-CA für eine private AD-CA. |
directory.tls.server_name |
leer | TLS-SNI/Hostname-Prüfung überschreiben, wenn Dial-Host und Zertifikatsname abweichen. |
directory.tls.insecure_skip_verify |
false |
Deaktiviert die LDAPS-Zertifikatsprüfung explizit und erzeugt beim Start eine Warnung. |
Mutierende LDAP-Operationen werden nach einem unklaren Netzwerkabbruch nicht blind wiederholt. Der nächste sichere Schritt ist Reconciliation, nicht ein automatisches Replay des Writes.
Schema, Cache und Read-Grenzen
| Feld | Default / erlaubte Werte | Regel |
|---|---|---|
schema.enabled |
true |
Lädt oder verwendet AD-Schema-Metadaten. |
schema.required |
true |
Bei true blockiert ein fehlgeschlagener Schema-Load den Start; bei false läuft der Service ohne Schema weiter. |
schema.cache_path |
leer | Lokaler Pfad zum geladenen Schema-Cache. |
cache.validation_enabled |
true ohne cache Block |
Validiert Cache-Freshness. In einem vorhandenen cache Block explizit setzen. |
cache.ttl_min |
5s |
Muss positiv sein und darf nicht über ttl_max liegen. |
cache.ttl_default |
60s |
Muss zwischen ttl_min und ttl_max liegen. |
cache.ttl_max |
15m |
Muss mindestens ttl_min sein. |
limits Feld |
Default | Regel |
|---|---|---|
query_page_size |
500 |
Interne Query-Seitengrösse; positiv und höchstens query_max_page_size. |
query_max_page_size |
1000 |
Interne Obergrenze, mindestens query_page_size. |
query_max_candidates |
1000 |
Positiv; begrenzt gelesene Kandidaten. |
query_max_returned |
250 |
Positiv und höchstens query_max_candidates; MCP-Tool-Seiten bleiben darunter. |
query_max_attributes |
20 |
Positiv; für MCP angeforderte fields gilt effektiv min(Wert, 50). |
query_max_response_bytes |
1048576 |
Positiv; maximale Read-Antwortgrösse. |
query_max_in_values |
20 |
Positiv; Schutzlimit im gemeinsamen Query-Compiler. |
query_max_sort_keys |
3 |
Positiv; Schutzlimit im gemeinsamen Query-Compiler. |
query_max_filter_depth |
4 |
Positiv; Schutzlimit im gemeinsamen Query-Compiler. |
mutation_max_steps |
100 |
Positiv; maximale Anzahl geplanter Mutation-Schritte. |
dependency_graph_max_nodes |
500 |
Positiv; maximale Graphgrösse. |
lazy_load_max_depth |
2 |
Positiv; effektive maximale Lazy-Load-Tiefe. |
ad_operation_timeout |
30s |
Positiv. |
mutation_total_timeout |
5m |
Positiv und mindestens ad_operation_timeout. |
preload_timeout |
2m |
Positiv. |
POST /api/v1/query und die festen MCP Outcome-Tools bleiben öffentliche Verträge. Die übrigen Query-Compiler-Limits sind Schutzwerte, keine wieder eingeführte dynamische MCP-DSL.
Preload und Lazy Load
preload "users" {
enabled = true
base_dn = "OU=Users,DC=example,DC=test"
ldap_filter = "(objectClass=user)"
attributes = ["cn", "mail", "sAMAccountName"]
required = true
page_size = 500
max_objects = 10000
}
lazy_load {
enabled = false
max_depth = 2
allowed_deps = ["manager"]
}
preload kann mehrfach vorkommen. name ist das Block-Label; enabled, base_dn, ldap_filter, attributes, required, page_size und max_objects sind die vollständigen Felder. Bei einem fehlgeschlagenen aktivierten required Preload wird die Instanz als nicht bereit gemeldet. Ohne page_size verwendet der Preload 1000; max_objects = 0 bedeutet kein zusätzlicher Objekt-Cap.
lazy_load.allowed_deps akzeptiert die Abhängigkeiten member, manager, memberOf und children. In HCL setzt ein positiver lazy_load.max_depth den Wert; die effektive Tiefe wird zusätzlich durch limits.lazy_load_max_depth begrenzt.
Mutation- und Workflow-Optionen
| Feld | Default / erlaubte Werte | Regel |
|---|---|---|
approval.require_for_all_writes |
false |
Require ein Approval-Objekt bei jedem Apply/Resume. |
approval.require_for_force_operations |
false |
Require ein Approval nur für force-pflichtige Writes. |
approval.require_different_client_id |
false |
Approval-Client muss vom Plan-Ersteller abweichen. |
password_generation.policy_mode |
best_effort |
best_effort oder require_ad_policy. |
password_generation.default_length |
24 |
Positiv und höchstens max_length. |
password_generation.max_length |
128 |
Positiv und mindestens default_length. |
password_generation.complexity_required |
nicht gesetzt | true oder false; nicht gesetzt bedeutet an AD-Policy ausrichten. |
managed_state.path |
leer | Aktiviert den file-basierten Managed-State-Speicher. |
managed_state.on_save_failure |
warn bei Block |
warn, reject oder retry. |
rules_path |
leer | Pfad zu zusätzlichen Planungs-/Business-Regeln. |
template_dir |
leer | Verzeichnis für .template.json JSONata-Templates. Ohne Wert liefern Template-Endpunkte 503. |
approval gilt zusätzlich zur fachlichen Freigabe. force oder risk.force_approved ersetzt weder ein erforderliches Approval noch fehlende AD-Objekte oder ungültige Operationen.
Snapshot, Mutation-Audit und Service-Logging
| Feld | Default / erlaubte Werte | Regel |
|---|---|---|
snapshot.path |
erforderlich im Block | Verzeichnis für JSONL WAL, Plan-Requests und Journals. |
snapshot.max_size |
erforderlich im HCL-Block | Muss positiv sein; zum Beispiel 256MiB. |
audit.file_enabled |
erforderlicher Bool im HCL-Block | Bei true ist audit.file_path erforderlich. |
audit.file_path |
leer | JSONL-Pfad; Go-Referenzzeit im Dateinamen rotiert Dateien, z. B. audit-2006-01-02.jsonl. |
readiness.durability_failure_mode |
fail_closed |
fail_closed oder degraded. |
debug.enabled |
false |
Aktiviert detailliertere Diagnoseausgaben; in Produktion deaktiviert lassen. |
debug.log_dir |
logs/debug |
Verzeichnis für Debug-Ausgaben. |
redaction.force_allowed_attributes |
leer | Bewusst zusätzlich sichtbare operative Attribute. |
redaction.force_redacted_attributes |
leer | Zusätzliche, immer redigierte Attribute. |
Ein Attribut darf nicht gleichzeitig in force_allowed_attributes und force_redacted_attributes stehen. Gleiches gilt für ein Attribut, das gleichzeitig in query_policy.allowed_attrs und query_policy.denied_attrs steht.
logging {
stderr { enabled = true levels = ["info", "warn", "error"] }
stdout { enabled = false levels = ["info", "warn", "error"] }
file {
enabled = false
path = "/var/log/adproxy/service-2006-01-02.log"
levels = ["warn", "error"]
}
syslog {
enabled = false
server = "tls://syslog.example.test:6514"
facility = "local0"
app_name = "adproxy-server"
connect_timeout = "2s"
write_timeout = "500ms"
ca_file = "/etc/adproxy/syslog-ca.pem"
server_name = "syslog.example.test"
levels = ["error"]
}
}
logging.stderr, logging.stdout, logging.file und logging.syslog akzeptieren nur debug, info, warn und error in levels; mindestens ein Level ist nötig. Ohne logging Block ist nur stderr aktiv. logging.file.path ist bei aktiviertem File-Sink erforderlich.
audit.syslog und mcp.audit.syslog verwenden dieselben Felder wie der Syslog-Sink, ausser levels. Gültige Server-Schemata sind udp://host:port, tcp://host:port und tls://host:port. ca_file und server_name sind nur mit tls:// erlaubt. Gültige RFC-5424 Facilities sind kern, user, mail, daemon, auth, syslog, lpr, news, uucp, cron, authpriv, ftp, ntp, audit, alert, clock sowie local0 bis local7.
Query-Policy
query_policy {
allowed_base_dns = ["OU=Users,DC=example,DC=test"]
allowed_attrs = ["cn", "mail", "sAMAccountName", "memberOf"]
denied_attrs = ["unicodePwd", "nTSecurityDescriptor"]
allow_raw_filters = false
}
allowed_base_dns darf keine leeren Werte enthalten. allowed_attrs und denied_attrs werden ohne Beachtung der Gross-/Kleinschreibung verglichen und dürfen sich nicht überschneiden. allow_raw_filters gilt für GET /api/v1/objects; für Agenten ist false der sichere Standard.
MCP-spezifische Felder
Der mcp Block gehört in die Konfiguration für adproxy-mcp, nicht in eine mit adproxy-server verwendete Datei mit enabled = true.
| Feld | Default / erlaubte Werte | Regel |
|---|---|---|
mcp.enabled |
false |
adproxy-mcp setzt den Wert beim Start auf true; adproxy-server lehnt true ab. |
mcp.transport |
stdio |
stdio, streamable-http oder both. |
mcp.listen_addr |
127.0.0.1:8768 |
Bei HTTP-Transport erforderlich. Ohne mcp.tls muss die Adresse Loopback sein. |
mcp.tls.cert_file, key_file |
leer | Für direktes HTTPS gemeinsam erforderlich; nur mit streamable-http oder both. |
mcp.tls.chain_file |
leer | Optionale PEM-Datei mit Zwischenzertifikaten. |
mcp.allow_anonymous |
false |
Nur für HTTP-Transporte auf Loopback; darf nicht mit einem Auth-Token kombiniert werden. |
mcp.auth_token |
leer | Eine von auth_token/auth_token_ref; bei HTTP erforderlich, außer allow_anonymous = true. |
mcp.auth_token_ref |
leer | env:NAME oder file:PATH; für Container bevorzugt. |
mcp.query_cursor_secret_ref |
kein Default | Für jeden MCP-Transport erforderlich; aufgelöst mindestens 32 Byte. |
mcp.query_cursor_ttl |
15m |
Zwischen 1s und 1h. |
mcp.rate_limit_rps |
10 |
Positiv. |
mcp.rate_limit_burst |
20 |
Positiv. |
mcp.agent_tool_profile |
standard |
standard oder local. |
mcp.agent_response_profile |
standard |
standard oder deduplicated-v1. |
mcp.agent_default_page_size |
Profil-Default | 0 nutzt 100 (standard) oder 20 (local); sonst höchstens limits.query_max_returned. |
mcp.enable_mutation_drafts |
false |
Draft-Tools sind nur im standard Profil sichtbar. |
mcp.attribute_allow_list |
leer | Zusätzliche sichtbare-Attributbegrenzung. |
mcp.attribute_deny_list |
leer | Zusätzliche Attributsperre. |
mcp.max_recursive_depth |
5 |
Nicht negativ; HCL-Werte sollten positiv gesetzt werden. |
mcp.compact_profile "<klasse>".attributes |
leer | Optionale kompakte Profilfelder; Label ist Objektklasse, * wird als generisches Profil behandelt; Attributliste darf nicht leer sein. |
mcp.audit.enabled |
false |
Aktiviert MCP-Audit getrennt vom Mutation-Audit. |
mcp.audit.file_enabled |
false |
Bei true ist file_path erforderlich. |
mcp.audit.file_path |
leer | JSONL-Ziel. |
mcp.audit.audit_level |
info |
trace, debug, info, warning oder error. |
Streamable MCP kann Plain HTTP ausschließlich am Loopback-Port bereitstellen. Für andere Bind-Adressen ist direktes mcp.tls erforderlich. Alternativ terminiert ein vertrauenswürdiger Reverse Proxy TLS vor dem Loopback-Listener. Anonyme Requests bleiben auch mit TLS auf Loopback beschränkt. CORS ist deaktiviert. Weitere Semantik, Tool-Profile und die vollständigen MCP-Auditfelder stehen unter Synit AD MCP Konfiguration.