iac/infrastructure/vault/uralkal-audit/configmap-audit-rotate.yaml

57 lines
2.7 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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