Based on this documentation from Red Hat: Chapter 3. SELinux Contexts and man page
reading:
I want to have logfiles in /var/log/mysql
instead of /var/log/mariadb
and leave SELinux enabled.
The newly created log directory /var/log/mysql
will by default be unaccessible to MySQL server due to SELinux.
So:
grep
for string setroubleshoot
in /var/log/
and run the indicated sealert
commands to find details on the actual SELinux problem you observe.
For example:
sealert -l 141804b3-9ae5-4484-be0b-741fc558ff6d
SELinux is preventing /usr/libexec/mysqld from 'read, write' accesses on the file bin_hull03.index.
***** Plugin catchall (100. confidence) suggests **************************
If you believe that mysqld should be allowed read write access on the bin_hull03.index file by default.
Then you should report this as a bug.
You can generate a local policy module to allow this access.
Do
allow this access for now by executing:
# ausearch -c 'mysqld' --raw | audit2allow -M my-mysqld
# semodule -i my-mysqld.pp
Additional Information:
...
This is not necessarily helpful in this case.
Use ls -lZ
to find out what the context of /var/log/mysql
is relative to /var/log/mariadb
:
# ls -lZ /var/log/mysql /var/log/mariadb
drwxrwx---. root mysql unconfined_u:object_r:var_log_t:s0 mysql
drwxr-x---. mysql mysql system_u:object_r:mysqld_log_t:s0 mariadb
Now adapt the file context of the tree /var/log/mysql
.
Check what its supposed value is by retrieving the context for /var/log/mariadb
from the SELinux config database:
# semanage fcontext --list | egrep '/var/log/(mysql|mariadb)'
/var/log/mysql.* regular file system_u:object_r:mysqld_log_t:s0
/var/log/mysql(/.*)? all files system_u:object_r:mysqld_log_t:s0
Add an entry to the SELinux settings database to define the context of the new file tree:
# semanage fcontext --add -s system_u -t mysqld_log_t '/var/log/mysql(/.*)?'
semanage fcontext --list | egrep '/var/log/(mysql|mariadb)'
/var/log/mysql.* regular file system_u:object_r:mysqld_log_t:s0
/var/log/mariadb(/.*)? all files system_u:object_r:mysqld_log_t:s0
/var/log/mysql(/.*)? all files system_u:object_r:mysqld_log_t:s
Set SELinux attributes recursively on the new file tree itself:
restorecon -r -F /var/log/mysql/
This gives what we want:
# ls -lZR /var/log/mysql/
/var/log/mysql/:
drwxrwx---. root mysql system_u:object_r:mysqld_log_t:s0 binary
drwxrwx---. root mysql system_u:object_r:mysqld_log_t:s0 general
-rw-rw----. mysql mysql system_u:object_r:mysqld_log_t:s0 mysqld_safe_log.err
drwxrwx---. root mysql system_u:object_r:mysqld_log_t:s0 relay
-rw-rw----. mysql mysql system_u:object_r:mysqld_log_t:s0 server.err
drwxrwx---. root mysql system_u:object_r:mysqld_log_t:s0 slow
/var/log/mysql/binary:
-rw-rw----. mysql mysql system_u:object_r:mysqld_log_t:s0 bin_hull03.000001
-rw-rw----. mysql mysql system_u:object_r:mysqld_log_t:s0 bin_hull03.000002
-rw-rw----. mysql mysql system_u:object_r:mysqld_log_t:s0 bin_hull03.index
/var/log/mysql/general:
/var/log/mysql/relay:
/var/log/mysql/slow: