fix: never chmod 700 system dirs like /var/log (2.3.3-SAC)

Hardening state files under /var/log was applying chmod 700 to the parent
directory, which broke syslog/logrotate and other services after agent update.
This commit is contained in:
PTah
2026-07-25 13:20:05 +10:00
parent b0abf99d1b
commit c50bd6e9d8
8 changed files with 92 additions and 5 deletions
+26 -1
View File
@@ -260,10 +260,33 @@ ssh_monitor_is_root_owned() {
[ "$own" = "root:root" ]
}
# Каталоги ОС: не chmod 700 / chown при hardening файлов вроде /var/log/last_heartbeat.txt.
# Иначе update ломает /var/log (syslog, logrotate, чужие сервисы).
ssh_monitor_is_system_dir() {
local dir="$1"
[ -n "$dir" ] || return 1
while [ "$dir" != "/" ] && [[ "$dir" == */ ]]; do
dir="${dir%/}"
done
case "$dir" in
/ | /bin | /boot | /dev | /etc | /home | /lib | /lib32 | /lib64 | /libx32 | \
/media | /mnt | /opt | /proc | /root | /run | /sbin | /srv | /sys | /tmp | \
/usr | /usr/bin | /usr/sbin | /usr/local | /usr/local/bin | /usr/local/sbin | \
/var | /var/log | /var/tmp | /var/cache | /var/run | /var/spool)
return 0
;;
esac
return 1
}
ssh_monitor_secure_dir() {
local dir="$1"
[ -n "$dir" ] || return 1
mkdir -p "$dir" 2>/dev/null || return 1
# Только «свои» каталоги (spool, /var/lib/ssh-monitor, …). /var/log и т.п. не трогаем.
if ssh_monitor_is_system_dir "$dir"; then
return 0
fi
chmod 700 "$dir" 2>/dev/null || true
chown root:root "$dir" 2>/dev/null || true
}
@@ -273,6 +296,7 @@ ssh_monitor_secure_file() {
local dir
[ -n "$file" ] || return 1
dir="$(dirname "$file")"
# mkdir родителя; chmod 700 — только если родитель не системный (/var/log, /etc, …).
ssh_monitor_secure_dir "$dir" || true
if [ ! -f "$file" ]; then
: >"$file" 2>/dev/null || touch "$file" 2>/dev/null || return 1
@@ -281,7 +305,8 @@ ssh_monitor_secure_file() {
chown root:root "$file" 2>/dev/null || true
}
# Существующий файл или каталог: 600/700 root:root; для отсутствующего пути — только родительский каталог.
# Существующий файл или каталог: 600/700 root:root; для отсутствующего пути — только родительский каталог
# (без chmod 700 на системных родителях вроде /var/log).
ssh_monitor_harden_path() {
local path="$1"
[ -n "$path" ] || return 0