57 lines
2.7 KiB
YAML
57 lines
2.7 KiB
YAML
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
|