apiVersion: v1 kind: ConfigMap metadata: name: audit-rotate-script namespace: vault data: rotate.sh: | #!/bin/sh # Ротация журнала аудита Vault по размеру. POSIX sh (busybox), без set -x и без set -e: # ошибка одной итерации не должна валить sidecar. В лог — только размер и число файлов, ничего из журнала. # # filelog в audit-shipper читает audit.log* и отслеживает файлы по fingerprint (первые байты), # поэтому переименованный файл дочитывается. KEEP должен перекрывать максимальное отставание # shipper'а: следить по метрикам otelcol и алерту на отставание (README). # Каталог .otelcol (чекпоинты и очередь) не трогается. set -u LOG="${AUDIT_LOG:-/vault/audit/audit.log}" MAX_BYTES="${MAX_BYTES:-104857600}" KEEP="${KEEP:-5}" INTERVAL="${INTERVAL:-30}" rotate() { # pid проверяется ДО переименования: без SIGHUP Vault продолжит писать в audit.log.1, новый audit.log # не появится, ротация остановится, а файл будет расти до заполнения диска (Vault fail-closed). pid=$(pidof vault) case "$pid" in '' | *' '*) echo "rotate: ОШИБКА: pid vault не найден или их несколько ('$pid'), ротация пропущена" return 1 ;; esac i=$KEEP while [ "$i" -gt 1 ]; do prev=$((i - 1)) if [ -e "$LOG.$prev" ]; then mv -f "$LOG.$prev" "$LOG.$i"; fi i=$prev done mv -f "$LOG" "$LOG.1" || return 1 # Vault переоткрывает файл по SIGHUP; до этого события пишутся в audit.log.1 и не теряются. kill -HUP "$pid" || echo "rotate: ОШИБКА: SIGHUP pid $pid не доставлен" for f in "$LOG".*; do n=${f##*.} case "$n" in '' | *[!0-9]*) continue ;; esac if [ "$n" -gt "$KEEP" ]; then rm -f "$f"; fi done echo "rotate: size=$1 files=$(ls -1 "$LOG"* 2>/dev/null | wc -l)" } trap 'exit 0' TERM INT while :; do size=$(stat -c %s "$LOG" 2>/dev/null || echo 0) if [ "$size" -gt "$MAX_BYTES" ]; then rotate "$size"; fi # sleep в фоне + wait: SIGTERM при остановке пода обрабатывается сразу, а не после sleep. sleep "$INTERVAL" & wait $! done