I am getting 'logrotate: ALERT exited abnormally with [1]' messages in logs when SELinux is in the Enforcing mode
環境
- Red Hat Enterprise Linux
- SELinux in Enforcing mode
問題
/var/log/messagesshow that logrotate fails with errorALERT exited abnormally with [1]- logrotate fails to rotate application logs
解決策
- 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.
原因
-
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.
診断手順
- 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
このソリューションは、Red Hat のエンジニアがお客様のサポート中に作成したナレッジコンテンツの大型ライブラリーを提供する Fast-Track Publication Program の一環です。お客様が必要とする知識・情報を即時に提供するために、これらの記事は、未処理・未編集の状態で提示される場合がありますので、予めご了承ください。
コメント