此内容没有您所选择的语言版本。
10.4. Configuration Examples
10.4.1. PostgreSQL Changing Database Location 复制链接链接已复制到粘贴板!
复制链接链接已复制到粘贴板!
When using Red Hat Enterprise Linux 6, the default location for PostgreSQL to store its database is
/var/lib/pgsql/data. This is where SELinux expects it to be by default, and hence this area is already labeled appropriately for you, using the postgresql_db_t type.
The area where the database is located 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 PostgreSQL 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 PostgreSQL. Comprehensive documentation of PostgreSQL is beyond the scope of this document. Refer to the official PostgreSQL documentation for further details. This example assumes that the postgresql-server package is installed.
- Run the
ls -lZ /var/lib/pgsqlcommand to view the SELinux context of the default database location forpostgresql:ls -lZ /var/lib/pgsql
~]# ls -lZ /var/lib/pgsql drwx------. postgres postgres system_u:object_r:postgresql_db_t:s0 dataCopy to Clipboard Copied! Toggle word wrap Toggle overflow This showspostgresql_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. - Create a new directory for the new location of the database(s). In this example,
/opt/postgresql/data/is used. If you use a different location, replace the text in the following steps with your location:mkdir -p /opt/postgresql/data
~]# mkdir -p /opt/postgresql/dataCopy to Clipboard Copied! Toggle word wrap Toggle overflow - Perform a directory listing of the new location. Note that the initial context of the new directory is usr_t. This context is not sufficient for SELinux to offer its protection mechanisms to PostgreSQL. Once the context has been changed, it will be able to function properly in the new area.
ls -lZ /opt/postgresql/
~]# ls -lZ /opt/postgresql/ drwxr-xr-x. root root unconfined_u:object_r:usr_t:s0 dataCopy to Clipboard Copied! Toggle word wrap Toggle overflow - Change the ownership of the new location to allow access by the postgres user and group. This sets the traditional Unix permissions which SELinux will still observe.
chown -R postgres:postgres /opt/postgresql
~]# chown -R postgres:postgres /opt/postgresqlCopy to Clipboard Copied! Toggle word wrap Toggle overflow - Open the PostgreSQL init file
/etc/rc.d/init.d/postgresqlwith a text editor and modify thePGDATAandPGLOGvariables to point to the new location:vi /etc/rc.d/init.d/postgresql
~]# vi /etc/rc.d/init.d/postgresql PGDATA=/opt/postgresql/data PGLOG=/opt/postgresql/data/pgstartup.logCopy to Clipboard Copied! Toggle word wrap Toggle overflow Save this file and exit the text editor. - Initialize the database in the new location.
su - postgres -c "initdb -D /opt/postgresql/data"
~]$ su - postgres -c "initdb -D /opt/postgresql/data"Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Having changed the database location, starting the service will fail at this point:
service postgresql start
~]# service postgresql start Starting postgresql service: [FAILED]Copy to Clipboard Copied! Toggle word wrap Toggle overflow SELinux has caused the service to not start. This is because the new location is not properly labelled. The following steps explain how to label the new location (/opt/postgresql/) and start the postgresql service properly: - Run the
semanagecommand to add a context mapping for/opt/postgresql/and any other directories/files within it:semanage fcontext -a -t postgresql_db_t "/opt/postgresql(/.*)?"
~]# semanage fcontext -a -t postgresql_db_t "/opt/postgresql(/.*)?"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 postgresql /etc/selinux/targeted/contexts/files/file_contexts.local
~]# grep -i postgresql /etc/selinux/targeted/contexts/files/file_contexts.local /opt/postgresql(/.*)? system_u:object_r:postgresql_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 /opt/postgresql
~]# restorecon -R -v /opt/postgresqlCopy to Clipboard Copied! Toggle word wrap Toggle overflow - Now that the
/opt/postgresql/location has been labeled with the correct context for PostgreSQL, thepostgresqlservice will start successfully:service postgresql start
~]# service postgresql start Starting postgreSQL service: [ OK ]Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Confirm the context is correct for
/opt/postgresql/:ls -lZ /opt
~]$ ls -lZ /opt drwxr-xr-x. root root system_u:object_r:postgresql_db_t:s0 postgresqlCopy to Clipboard Copied! Toggle word wrap Toggle overflow - Check with the
pscommand that thepostgresqlprocess displays the new location:ps aux | grep -i postmaster
~]# ps aux | grep -i postmaster postgres 21564 0.3 0.3 42308 4032 ? S 10:13 0:00 /usr/bin/postmaster -p 5432 -D /opt/postgresql/data/Copy to Clipboard Copied! Toggle word wrap Toggle overflow - The location has been changed and labeled, and the
postgresqldaemon has started successfully. At this point all running services should be tested to confirm normal operation.