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