Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

21.4. 설정 예

21.4.1. PostgreSQL 데이터베이스 위치 변경

Red Hat Enterprise Linux를 사용하는 경우 데이터베이스를 저장할 PostgreSQL의 기본 위치는 /var/lib/pgsql/data/ 입니다. 여기에서 SELinux는 기본적으로 이를 예상하므로 이 영역에는 postgresql_db_t 유형을 사용하여 이미 적절하게 레이블이 지정됩니다.
데이터베이스가 있는 영역은 개별 환경 요구 사항 또는 기본 설정에 따라 변경할 수 있지만 SELinux는 이 새 위치를 인식하는 것이 중요합니다. 이 영역에 따라 레이블이 지정되어야 합니다. 이 예에서는 PostgreSQL 데이터베이스의 위치를 변경한 다음 SELinux가 해당 콘텐츠를 기반으로 새 영역에 계속 보호 메커니즘을 제공할 수 있도록 새 위치에 레이블을 지정하는 방법을 설명합니다.
이 예제는 SELinux가 PostgreSQL에 미치는 영향을 보여줍니다. PostgreSQL의 포괄적인 설명서는 이 문서의 범위를 벗어납니다. 자세한 내용은 공식 PostgreSQL 설명서 를 참조하십시오. 이 예제에서는 postgresql-server 패키지가 설치되어 있다고 가정합니다.
  1. postgresql 의 기본 데이터베이스 위치의 SELinux 컨텍스트를 확인합니다.
    ~]# ls -lZ /var/lib/pgsql
    drwx------. postgres postgres system_u:object_r:postgresql_db_t:s0 data
    
    데이터베이스 파일 위치의 기본 컨텍스트 요소인 postgresql_db_t 가 표시됩니다. 이 컨텍스트가 제대로 작동하려면 이 예제에서 사용할 새 데이터베이스 위치에 수동으로 적용해야 합니다.
  2. 데이터베이스의 새 위치에 대한 새 디렉터리를 만듭니다. 이 예에서는 /opt/postgresql/data/ 가 사용됩니다. 다른 위치를 사용하는 경우 다음 단계의 텍스트를 해당 위치로 바꿉니다.
    ~]# mkdir -p /opt/postgresql/data
  3. 새 위치의 디렉터리 목록을 수행합니다. 새 디렉터리의 초기 컨텍스트는 usr_t 입니다. 이 컨텍스트는 SELinux가 PostgreSQL에 보호 메커니즘을 제공하는 데 충분하지 않습니다. 컨텍스트가 변경되면 새 영역에서 제대로 작동할 수 있습니다.
    ~]# ls -lZ /opt/postgresql/
    drwxr-xr-x. root root unconfined_u:object_r:usr_t:s0   data
    
  4. postgres 사용자 및 그룹의 액세스를 허용하도록 새 위치의 소유권을 변경합니다. 이렇게 하면 SELinux가 계속 관찰할 기존의 Unix 권한이 설정됩니다.
    ~]# chown -R postgres:postgres /opt/postgresql
  5. 텍스트 편집기를 사용하여 /etc/systemd/system/postgresql.service 파일을 열고 PGDATAPGLOG 변수를 수정하여 새 위치를 가리킵니다.
    ~]# vi /etc/systemd/system/postgresql.service
    PGDATA=/opt/postgresql/data
    PGLOG=/opt/postgresql/data/pgstartup.log
    
    이 파일을 저장하고 텍스트 편집기를 종료합니다.
    /etc/systemd/system/postgresql.service 파일이 없는 경우 파일을 생성하고 다음 콘텐츠를 삽입합니다.
    .include /lib/systemd/system/postgresql.service
    [Service]
    
    # Location of database directory
    Environment=PGDATA=/opt/postgresql/data
    Environment=PGLOG=/opt/postgresql/data/pgstartup.log
  6. 새 위치에서 데이터베이스를 초기화합니다.
    ~]$ su - postgres -c "initdb -D /opt/postgresql/data"
  7. 데이터베이스 위치를 변경하면 이 시점에 서비스 시작이 실패합니다.
    ~]# systemctl start postgresql.service
    Job for postgresql.service failed. See 'systemctl status postgresql.service' and 'journalctl -xn' for details.
    
    SELinux로 인해 서비스가 시작되지 않았습니다. 새 위치의 레이블이 올바르지 않기 때문입니다. 다음 단계에서는 새 위치(/opt/postgresql/)에 레이블을 지정하고 postgresql 서비스를 제대로 시작하는 방법을 설명합니다.
  8. semanage 유틸리티를 사용하여 /opt/postgresql/ 및 그 안에 있는 기타 디렉터리/ 파일에 대한 컨텍스트 매핑을 추가합니다.
    ~]# semanage fcontext -a -t postgresql_db_t "/opt/postgresql(/.*)?"
  9. 이 매핑은 /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:s0
    
  10. 이제 restorecon 유틸리티를 사용하여 이 컨텍스트 매핑을 실행 중인 시스템에 적용합니다.
    ~]# restorecon -R -v /opt/postgresql
  11. 이제 /opt/postgresql/ 위치에 PostgreSQL에 대한 올바른 컨텍스트로 레이블이 지정되었으므로 postgresql 서비스가 성공적으로 시작됩니다.
    ~]# systemctl start postgresql.service
  12. /opt/postgresql/ 에 대한 컨텍스트가 올바른지 확인합니다.
    ~]$ ls -lZ /opt
    drwxr-xr-x. root root system_u:object_r:postgresql_db_t:s0 postgresql
    
  13. postgresql 프로세스가 새 위치를 표시하는 ps 명령으로 확인합니다.
    ~]# 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/
  14. 위치가 변경 및 레이블이 지정되었으며 postgresql 이 성공적으로 시작되었습니다. 이제 정상적인 작업을 확인하기 위해 실행 중인 모든 서비스를 테스트해야 합니다.