9.4. Configuration Examples
9.4.1. MySQL Changing Database Location Copy linkLink copied to clipboard!
Copy linkLink copied to clipboard!
When using Red Hat Enterprise Linux 6, the default location for MySQL to store its database is
/var/lib/mysql/. This is where SELinux expects it to be by default, and hence this area is already labeled appropriately for you, using the mysqld_db_t type.
The location where the database is stored can be changed depending on individual environment requirements or preferences, however it is important that SELinux is aware of this new location; that it is labeled accordingly. This example explains how to change the location of a MySQL database and then how to label the new location so that SELinux can still provide its protection mechanisms to the new area based on its contents.
Note that this is an example only and demonstrates how SELinux can affect MySQL. Comprehensive documentation of MySQL is beyond the scope of this document. Refer to the official MySQL documentation for further details. This example assumes that the mysql-server and setroubleshoot-server packages are installed, that the
auditd service is running, and that there is a valid database in the default location of /var/lib/mysql/.
- Run the
ls -lZ /var/lib/mysqlcommand to view the SELinux context of the default database location formysql:ls -lZ /var/lib/mysql
~]# ls -lZ /var/lib/mysql drwx------. mysql mysql unconfined_u:object_r:mysqld_db_t:s0 mysqlCopy to Clipboard Copied! Toggle word wrap Toggle overflow This showsmysqld_db_twhich is the default context element for the location of database files. This context will have to be manually applied to the new database location that will be used in this example in order for it to function properly. - Enter
mysqlshow -u root -pand enter themysqldroot password to show the available databases:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Shut down the
mysqlddaemon with theservice mysqld stopcommand as the root user:service mysqld stop
~]# service mysqld stop Stopping MySQL: [ OK ]Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Create a new directory for the new location of the database(s). In this example,
/mysql/is used:mkdir -p /mysql
~]# mkdir -p /mysqlCopy to Clipboard Copied! Toggle word wrap Toggle overflow - Copy the database files from the old location to the new location:
cp -R /var/lib/mysql/* /mysql/
~]# cp -R /var/lib/mysql/* /mysql/Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Change the ownership of this location to allow access by the mysql user and group. This sets the traditional Unix permissions which SELinux will still observe.
chown -R mysql:mysql /mysql
~]# chown -R mysql:mysql /mysqlCopy to Clipboard Copied! Toggle word wrap Toggle overflow - Run the
ls -lZ /optcommand to see the initial context of the new directory:ls -lZ /opt
~]# ls -lZ /opt drwxr-xr-x. mysql mysql unconfined_u:object_r:usr_t:s0 mysqlCopy to Clipboard Copied! Toggle word wrap Toggle overflow The contextusr_tof this newly created directory is not currently suitable to SELinux as a location for MySQL database files. Once the context has been changed, MySQL will be able to function properly in this area. - Open the main MySQL configuration file
/etc/my.cnfwith a text editor and modify thedatadiroption so that it refers to the new location. In this example the value that should be entered is/mysql.[mysqld] datadir=/mysql
[mysqld] datadir=/mysqlCopy to Clipboard Copied! Toggle word wrap Toggle overflow Save this file and exit. - Run the
service mysqld startcommand as the root user to startmysqld. The service should fail to start, and a denial will be logged to the/var/log/messagesfile. However, if theauditdaemon is running alongside thesetroubleshootservice, the denial will be logged to the/var/log/audit/audit.logfile instead:SELinux is preventing /usr/libexec/mysqld "write" access on /mysql. For complete SELinux messages. run sealert -l b3f01aff-7fa6-4ebe-ad46-abaef6f8ad71
SELinux is preventing /usr/libexec/mysqld "write" access on /mysql. For complete SELinux messages. run sealert -l b3f01aff-7fa6-4ebe-ad46-abaef6f8ad71Copy to Clipboard Copied! Toggle word wrap Toggle overflow The reason for this denial is that/mysql/is not labeled correctly for MySQL data files. SELinux is stopping MySQL from having access to the content labeled asusr_t. Perform the following steps to resolve this problem: - Run the following
semanagecommand to add a context mapping for/mysql. Note thatsemanageis not installed by default. If it is missing on your system, install the policycoreutils-python package.semanage fcontext -a -t mysqld_db_t "/mysql(/.*)?"
~]# semanage fcontext -a -t mysqld_db_t "/mysql(/.*)?"Copy to Clipboard Copied! Toggle word wrap Toggle overflow - This mapping is written to the
/etc/selinux/targeted/contexts/files/file_contexts.localfile:grep -i mysql /etc/selinux/targeted/contexts/files/file_contexts.local
~]# grep -i mysql /etc/selinux/targeted/contexts/files/file_contexts.local /mysql(/.*)? system_u:object_r:mysqld_db_t:s0Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Now use the
restoreconcommand to apply this context mapping to the running system:restorecon -R -v /mysql
~]# restorecon -R -v /mysqlCopy to Clipboard Copied! Toggle word wrap Toggle overflow - Now that the
/mysql/location has been labeled with the correct context for MySQL, themysqlddaemon starts:service mysqld start
~]# service mysqld start Starting MySQL: [ OK ]Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Confirm the context has changed for
/mysql/:ls -lZ /opt
~]$ ls -lZ /opt drwxr-xr-x. mysql mysql system_u:object_r:mysqld_db_t:s0 mysqlCopy to Clipboard Copied! Toggle word wrap Toggle overflow - The location has been changed and labeled, and the
mysqlddaemon has started successfully. At this point all running services should be tested to confirm normal operation.