Deliver audit events to MinIO within a minute for near-real-time
investigation; trade-off is more small parquet files (compaction
is planned in stage 3 of k8s-audit).
New image removes the bucket lifecycle check (retention is owned by terraform
minio-buckets lifecycle_rules), so the retention section is dropped from the
processor config map.
Some events (e.g. deletecollection) carry requestObject as a slice, not a map:
indexing it with "metadata" failed with "unable to resolve an integer index in
slice" and spammed the collector log (error_mode: ignore — events were not lost).
IsMap chains rely on OTTL short-circuit `and` evaluation (verified against
v0.121 sources).
The processor rejected "log_records": LogFilters.LogConditions is mapstructure
"log_record" in v0.121 (collector failed to start: failed to get config).
filter/audit in audit-collector drops get/list/watch events from
system:serviceaccount:flux-system:* (helm/kustomize/source controllers polling
fluxcd resources every few seconds — the bulk of the topic volume). GitOps
mutations are kept: they are the actual trail of cluster changes.
base/processor-*.yaml: Deployment (1 replica, image k8s-audit-processor:394b6f9d),
ConfigMap with config.yaml, ServiceAccount, NetworkPolicy (DNS, kafka:9092,
external MinIO 10.133.0.245:9000). Contour-specific values for uralkal are set
via env patch in the overlay (K8S_AUDIT_*), same pattern as the collectors.
Credentials reuse the static Secrets (security-audit-kafka, kafka-ca,
security-audit-minio) via a projected volume at /vault/secrets.
app.env=stand: the contour's external MinIO has no TLS, so strict validation
(minio.secure) would fail. log.s3_echo=true is temporary for flow verification
(per security req. 20: disable after debugging).
У части событий requestObject есть, а metadata/annotations в нём nil —
statement падал с "expected pcommon.Map but got nil" и засорял лог
(error_mode: ignore, события не терялись).
PAT machine user'а security-audit-bootstrap не заведён (ни Vault-роль, ни статический
Secret), Job не сможет настроить Target/Execution'ы. Пайплайн logs/idp в access-collector
оставлен и инертен: без Target'а Zitadel ничего не отправляет. Обратное включение:
раскомментировать idp-actions-bootstrap в base/kustomization.yaml и его патч в оверлее
uralkal, добавить ключ zitadel_pat в Secret security-audit-kafka.
В контуре uralkal роли Vault (security-audit, security-audit-bootstrap) не заведены.
Коллекторы и Job idp-actions-bootstrap монтируют Secret'ы namespace (security-audit-kafka,
kafka-ca) projected volume'ом в /vault/secrets под теми же именами файлов — конфиг
коллекторов (${file:...}, ca_file) не меняется. Из NetworkPolicy убран egress в Vault,
из оверлея uralkal — dependsOn на HelmRelease vault.
DaemonSet audit-collector на control-plane (журнал kube-apiserver → security.k8s-audit),
Deployment access-collector (OTLP :4317 — журнал доступа ingress-шлюза → security.mesh-access,
webhookevent :8088 — события Zitadel Actions v2 → security.idp-events, otlp :4319 — журнал
аудита Vault → security.vault-audit), Job idp-actions-bootstrap (Target + Execution'ы в Zitadel),
NetworkPolicy/AuthorizationPolicy, EnvoyFilter strip-audit-headers и Telemetry шлюза
на провайдер audit-access (уже раскатан в istio-pilot/uralkal).
Предусловия выполнены вне репозитория: аудит apiserver на мастерах (INFRA-3057),
топики security.* и SCRAM-пользователь в Kafka, бакет security-audit в MinIO,
секреты и роли Vault (terraform, vault-platform-secrets).
Оверлеи убраны из clusters/uralkal/kustomization.yaml, манифесты
apps/postgres-tls-test/ и infrastructure/istio-mtls-check/ сохранены
для возможного повторного подключения.
ConfigMap uralkali-ca с PEM BER-CA1 монтируется в /opt/uralkali-ca,
KC_TRUSTSTORE_PATHS=/opt/uralkali-ca/ber-ca1.crt добавляет его в Truststore SPI
Keycloak 25 поверх системных корней, без пересборки образа.
ConfigMap uralkali-ca с PEM BER-CA1 (DC=local,DC=uralkali,DC=com) монтируется
в /etc/ssl/uralkali, SSL_CERT_DIR=/etc/ssl/uralkali:/etc/ssl/certs. Образ на
scratch без пересборки: Go берёт доп. корни из SSL_CERT_DIR. Чинит
"x509: certificate signed by unknown authority" при входе через AD.
Второй ключ deployment в патче отбрасывался, и args из оверлея не применялись:
/vault/secrets/pm-kafka инжектился, но не source-ился, pm ходил в Kafka с
дефолтными user/password. makemigrations из оверлея не включён.
Логин и пароль берутся из тех же путей Vault, что читают pm/message-hub и
issues/flows; пароль администратора — inter_broker_user из kafka/bootstrap
(роль Vault kafka, SA kafka-kafka-contour). После создания проверяется вход
каждого пользователя по SASL_SSL на 9092, пароли в лог не пишутся.
Образ contour/postgresql — официальный postgres с обёрткой contour, bitnami-переменные
TLS и extended-конфиг он игнорирует: ssl, сертификат, ssl_min_protocol_version и
hba_file передаются через -c; readOnlyRootFilesystem: false и пробы pg_isready как у
infrastructure/postgresql/uralkal.
ns postgres-tls-test: postgresql-contour pg-tls с tls.autoGenerated,
ssl_min_protocol_version TLSv1.2, pg_hba только hostssl (local для
администрирования); notes-tls на образе notes-backend с
PG_SSL_MODE/PGSSLMODE=verify-full и CA из pg-tls-crt.
regcred в ns создаётся вручную.