# Конфиг sidecar'а audit-shipper. Без configMapGenerator намеренно: смена конфига не должна сама # перезапускать Vault (рестарт = unseal). Изменения применяются ручным рестартом пода по процедуре README. apiVersion: v1 kind: ConfigMap metadata: name: audit-shipper-config namespace: vault data: config.yaml: | extensions: file_storage/vault: directory: /vault/audit/.otelcol create_directory: true compaction: on_start: true on_rebound: true # очередь bbolt иначе не уменьшается на диске directory: /vault/audit/.otelcol receivers: filelog/vault: include: [/vault/audit/audit.log*] exclude: [/vault/audit/.otelcol/*] start_at: beginning storage: file_storage/vault max_log_size: 4MiB operators: - type: json_parser parse_to: body processors: memory_limiter: {check_interval: 1s, limit_mib: 150, spike_limit_mib: 50} transform/vault: error_mode: ignore log_statements: - context: log statements: # response-запись содержит и запрос — request-записи отбрасываем (объём ~вдвое меньше) - set(body["sarex_drop"], true) where body["type"] == "request" - set(body["sarex_kind"], "vault_audit") - set(body["sarex_contour"], "${env:CONTOUR}") - set(body["sarex_outcome"], "applied") - set(body["sarex_outcome"], "denied_authz") where IsMatch(body["error"], "permission denied") - set(body["sarex_outcome"], "denied_authn") where body["error"] != nil and body["error"] != "" and IsMatch(body["request"]["path"], "^auth/.+/login") - set(body["sarex_actor_type"], "serviceaccount") where body["auth"]["metadata"]["service_account_name"] != nil - set(body["sarex_actor_type"], "human") where body["sarex_actor_type"] == nil filter/vault: logs: log_record: ['body["sarex_drop"] == true'] batch: {send_batch_size: 500, timeout: 2s} exporters: otlp/audit: endpoint: access-collector.security-audit.svc.cluster.local:4319 # Vault и access-collector в mesh: plaintext до istio-proxy пода, дальше auto-mTLS. # TODO(verify): у подов Vault есть istio-proxy (ns vault: istio-injection=enabled). tls: {insecure: true} # Очередь на диске ограничена: 20000 батчей по 500 записей не помещаются в PVC, а полный диск # останавливает Vault. При заполненной очереди filelog перестаёт читать — буфером служат сами файлы # журнала (KEEP × MAX_BYTES). TODO(verify): queue_size по замеру объёма. sending_queue: {enabled: true, storage: file_storage/vault, queue_size: 1000} retry_on_failure: {enabled: true, max_elapsed_time: 0} service: extensions: [file_storage/vault] pipelines: logs: receivers: [filelog/vault] processors: [memory_limiter, transform/vault, filter/vault, batch] exporters: [otlp/audit] telemetry: logs: {level: info} metrics: {address: "${env:MY_POD_IP}:8888"}