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:
+26
-1
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user