I am getting 'logrotate: ALERT exited abnormally with [1]' messages in logs when SELinux is in the Enforcing mode
Environment
- Red Hat Enterprise Linux
- SELinux in Enforcing mode
Issue
/var/log/messagesshow that logrotate fails with errorALERT exited abnormally with [1]- logrotate fails to rotate application logs
Resolution
- To get rid of the message
ALERT exited abnormally with [1], check if logrotate is being used to rotate logs other than those in/var/log. If so, then SELinux can be the cause of this issue. The directories outside of/var/logshould have the same context as/var/loghas. Set the following SELinux context on the directories where logrotate should rotate the logs.
Example: logrotate has been configured to rotate files in /backup/mysql
- Run the following command:
# semanage fcontext -a -t var_log_t '/backup/mysql(/.*)?'
#
The above command will define the context that would be automatically set on new files under /backup/mysql. This definition will be stored in /etc/selinux/targeted/contexts/files/file_contexts.local, so that the changes will be persistent. This can be verified by looking into the file:
# cat /etc/selinux/targeted/contexts/files/file_contexts.local
# This file is auto-generated by libsemanage
# Do not edit directly.
/backup/mysql(/.*)? system_u:object_r:var_log_t:s0
#
- Run the following command to recursively set the context for files under
/backup/mysqlaccording to the newly defined definition:
# restorecon -Frvv /backup/mysql
restorecon reset /backup/mysql context system_u:object_r:default_t:s0->system_u:object_r:var_log_t:s0
restorecon reset /backup/mysql/backup.tar context system_u:object_r:default_t:s0->system_u:object_r:var_log_t:s0
#
- If SELinux is not in the Enforcing mode, this solution does not apply. Please, refer to this article in order to get more information on logrotate troubleshooting.
Root Cause
-
SELinux denies logrotate to check the attributes of the rotated log file, this happens when logrotate has to rotate files outside of
/var/log(defined inlogrotate.conf). -
logrotate indeed sends a logger message
logrotate: ALERT exited abnormally with [1]because of SELinux, but it doesn't stop logrotate from completing successfully. The reason is that the/etc/cron.daily/logrotatescript checks if thelogrotatecommand ran succesfully by checking the exit status of thelogrotatecommand. This is non-zero not because logrotate was not able to run, but because logrotate was trying to get the attributes (permissions) on the rotated file created in a custom directory, which SELinux denied by the following message:CALL msg=audit(1335727501.512:1389214): arch=c000003e syscall=4 success=no exit=-13 a0=12ec760 a1=7fffdba0de60 a2=7fffdba0de60 a3=b items=0 ppid=14260 pid=14262 auid=0 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=44399 comm="logrotate" exe="/usr/sbin/logrotate" subj=system_u:system_r:logrotate_t:s0-s0:c0.c1023 key=(null) type=AVC msg=audit(1335727501.512:1389214): avc: denied { getattr } for pid=14262 comm="logrotate" path="/backup/mysql/backup.gz" dev=dm-0 ino=131206 scontext=system_u:system_r:logrotate_t:s0-s0:c0.c1023 tcontext=unconfined_u:object_r:default_t:s0 tclass=file -
In the environments where
logrotate.confor the/etc/logrotate.ddirectory has custom logrotate scripts where logrotate has to rotate files out of the/var/logdirectory.
Example:
/backup/mysql/backup.tar {
missingok
daily
nocompress
rotate 5
}
- In the above example logrotate rotates
/backup/mysql/backup.tardaily. The above file by default would have the SELinux contextunconfined_u:object_r:default_t:s0. This would cause SELinux to deny logrotate to get an attribute list (getattr). For logrotate to getgetattron the files created in the/backup/mysqldirectory. The files should have thevar_log_tcontext.
Diagnostic Steps
- Check audit log denials for logrotate process in /var/log/audit/audit.log
# ausearch -c logrotate -m AVC
-
Check if
/etc/logrotate.confor the/etc/logrotate.ddirectory has custom scripts that require logrotate to rotate files from directories outside of/var/log. -
Check the SELinux context on those custom directories. They should have the "var_log_t" type on those files.
-
The message
logrotate: ALERT exited abnormally with [1]comes from the/etc/cron.daily/logrotatescript:
#!/bin/sh
/usr/sbin/logrotate /etc/logrotate.conf >/dev/null 2>&1
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
/usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0
This solution is part of Red Hat’s fast-track publication program, providing a huge library of solutions that Red Hat engineers have created while supporting our customers. To give you the knowledge you need the instant it becomes available, these articles may be presented in a raw and unedited form.
Comments