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/messages
show 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/log
should have the same context as/var/log
has. 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/mysql
according 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/logrotate
script checks if thelogrotate
command ran succesfully by checking the exit status of thelogrotate
command. 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.conf
or the/etc/logrotate.d
directory has custom logrotate scripts where logrotate has to rotate files out of the/var/log
directory.
Example:
/backup/mysql/backup.tar {
missingok
daily
nocompress
rotate 5
}
- In the above example logrotate rotates
/backup/mysql/backup.tar
daily. 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 getgetattr
on the files created in the/backup/mysql
directory. The files should have thevar_log_t
context.
Diagnostic Steps
- Check audit log denials for logrotate process in /var/log/audit/audit.log
# ausearch -c logrotate -m AVC
-
Check if
/etc/logrotate.conf
or the/etc/logrotate.d
directory 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/logrotate
script:
#!/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