Ubuntu 18.04. ModSecurity: Audit log: Failed to create subdirectories

Apache2
mod_itk
ModSecurity

В error логах apache появляются записи от ModSecurity о невозможности создать каталог

[Mon Oct 15 21:58:53.662374 2018] [:error] [pid 27419] [client 127.0.0.1] ModSecurity: Audit log: Failed to create subdirectories: /opt/modsecurity/var/audit/20181015/20181015-2158 (Permission denied) [hostname "domain.local"] [uri "/wp-content/uploads/2013/06/520.jpg"] [unique_id "W8TjbS7@Fb0AAGqVyRwAAAAF"]

В конфиге /etc/modsecurity/modsecurity.conf параметр SecAuditLogStorageDir

SecAuditLogStorageDir /opt/modsecurity/var/audit

в нём apache создаёт с первой ошибкой от заданного пользователя поддиректорию с датой. Но после этого с другим uid/gid доступа нет, т.к. права на запись только у владельца.

Решение: по крону раз в день запускать bash скрипт с созданием нужного подкаталога, если он не существует. и установкой прав 777 на нужный каталог

Сам bash файл /root/cron-chmod-log.sh

#!/bin/bash
 
LOGDIR="/opt/modsecurity/var/audit"
DATE=`date +%Y%m%d`
FULLPATH="$LOGDIR/$DATE"
 
if [ ! -d "$FULLPATH" ]; then
  mkdir -p "$FULLPATH"
fi
 
chmod 777 "$FULLPATH"
 
chmod -R 777 /tmp/glob* /tmp/ip*

Выставляем права на запуск

chmod +x /root/cron-chmod-log.sh

Создаём крон файл /etc/cron.d/myroot

0 0 * * * root /root/cron-chmod-log.sh

теперь каждый день в 00-00 будет запускаться данный файл и если поддиректории с датой не существует - создаст её и установит права 777 на неё, что в ней уже апач мог создать другие подкаталоги под своим пользователем/группой.

Удаление старых логов

Через какое то время папка с логами может вырасти до больших размеров как в количестве файлов, так и в занимаемом месте на диске. Поэтому можно скриптом по крону удалять старые логи и оставлять последние N-дней.
Полный файл /root/cron-chmod-log.sh

#!/bin/bash
 
LOGDIR="/opt/modsecurity/var/audit"
NUM_DAY_FOLDER=3
DATE=`date +%Y%m%d`
FULLPATH="$LOGDIR/$DATE"
 
if [ ! -d "$FULLPATH" ]; then
	mkdir -p "$FULLPATH"
fi
 
chmod 777 "$FULLPATH"
 
chmod -R 777 /tmp/glob* /tmp/ip*
 
 
 
# Удаление старых логов
 
 
if [ ! -d "$LOGDIR" ]; then
	exit
fi
 
cd "$LOGDIR"
 
ALL_DIR=(`ls`)
LAST_DIR=(`ls | tail -n${NUM_DAY_FOLDER} | awk '{print $1}'`)
 
TEMP_ARRAY=()
for pkg in "${ALL_DIR[@]}"; do
    for remove in "${LAST_DIR[@]}"; do
        KEEP=true
        if [[ ${pkg} == ${remove} ]]; then
            KEEP=false
            break
        fi
    done
    if ${KEEP}; then
        TEMP_ARRAY+=(${pkg})
    fi
done
ALL_DIR=("${TEMP_ARRAY[@]}")
unset TEMP_ARRAY
 
for name in "${ALL_DIR[@]}";
do
	if [[ $name = "" ]]
	then
		continue
	fi
 
	PATH_DELETE="$LOGDIR/$name"
 
	if [ -d "$PATH_DELETE" ]; then
		rm -rf "$PATH_DELETE"
	fi
done

где NUM_DAY_FOLDER - количество последних каталогов, которые не удаляем