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 — количество последних каталогов, которые не удаляем