Loading...
MySQL 9.5 Reference Manual 9.5의 8.7.6 Troubleshooting SELinux의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
SELinux를 트러블슈팅하는 일반적인 절차는 SELinux를 permissive 모드로 전환한 후 문제가 있는 동작을 다시 수행하고, SELinux 감사 로그에서 access 거부 메시지를 확인한 뒤, 문제가 해결되면 SELinux를 다시 enforcing 모드로 되돌리는 것입니다.
setenforce를 사용해서 전체 시스템을 permissive 모드로 전환하는 것을 피하기 위해, SELinux 도메인(mysqld_t)을 semanage 명령으로 permissive 모드로 설정하여 MySQL 서비스에 대해서만 permissive 모드로 허용할 수 있습니다:
1semanage permissive -a mysqld_t
트러블슈팅이 끝나면 다음 명령을 사용하여 mysqld_t 도메인을 다시 enforcing 모드로 되돌립니다:
1semanage permissive -d mysqld_t
SELinux는 거부된 동작에 대한 로그를 /var/log/audit/audit.log에 기록합니다. “denied” 메시지를 검색하여 거부 내역을 확인할 수 있습니다.
1grep "denied" /var/log/audit/audit.log
다음 섹션에서는 SELinux 관련 문제가 발생할 수 있는 몇 가지 일반적인 영역을 설명합니다.
MySQL 디렉터리 또는 파일에 잘못된 SELinux 컨텍스트가 설정된 경우 access가 거부될 수 있습니다. 이 문제는 MySQL이 기본이 아닌 디렉터리 또는 파일에서 읽거나 그곳에 쓰도록 설정된 경우 발생할 수 있습니다. 예를 들어, MySQL이 기본이 아닌 데이터 디렉터리를 사용하도록 설정된 경우, 해당 디렉터리에 예상되는 SELinux 컨텍스트가 없을 수 있습니다.
유효하지 않은 SELinux 컨텍스트를 가진 기본이 아닌 데이터 디렉터리에서 MySQL 서비스를 시작하려고 시도하면 다음과 같은 startup 실패가 발생합니다.
1$> systemctl start mysql.service 2Job for mysqld.service failed because the control process exited with error code. 3See "systemctl status mysqld.service" and "journalctl -xe" for details.
이 경우 “denial” 메시지가 /var/log/audit/audit.log에 기록됩니다:
1$> grep "denied" /var/log/audit/audit.log 2type=AVC msg=audit(1587133719.786:194): avc: denied { write } for pid=7133 comm="mysqld" 3name="mysql" dev="dm-0" ino=51347078 scontext=system_u:system_r:mysqld_t:s0 4tcontext=unconfined_u:object_r:default_t:s0 tclass=dir permissive=0
MySQL 디렉터리 및 파일에 대해 올바른 SELinux 컨텍스트를 설정하는 방법에 대한 정보는
Section 8.7.4, “SELinux File Context”를 참조하십시오.
SELinux는 MySQL Server와 같은 서비스가 특정 포트를 사용한다고 예상합니다. SELinux 정책을 업데이트하지 않은 상태에서 포트를 변경하면 서비스 실패가 발생할 수 있습니다.
mysqld_port_t 포트 타입은 MySQL이 listen하는 포트를 정의합니다. MySQL Server가 포트 3307과 같이 기본이 아닌 포트를 사용하도록 설정되어 있고, 변경 사항을 반영하도록 정책을 업데이트하지 않으면 MySQL 서비스는 시작에 실패합니다:
1$> systemctl start mysqld.service 2Job for mysqld.service failed because the control process exited with error code. 3See "systemctl status mysqld.service" and "journalctl -xe" for details.
이 경우, denial 메시지가 /var/log/audit/audit.log에 기록됩니다:
1$> grep "denied" /var/log/audit/audit.log 2type=AVC msg=audit(1587134375.845:198): avc: denied { name_bind } for pid=7340 3comm="mysqld" src=3307 scontext=system_u:system_r:mysqld_t:s0 4tcontext=system_u:object_r:unreserved_port_t:s0 tclass=tcp_socket permissive=0
MySQL에 대해 올바른 SELinux 포트 컨텍스트를 설정하는 방법에 대한 정보는
Section 8.7.5, “SELinux TCP Port Context”를 참조하십시오.
정의된 컨텍스트를 가지지 않은 포트를 사용하는 MySQL 기능을 활성화할 때도 이와 유사한 포트 access 문제가 발생할 수 있습니다. 더 많은 정보는
Section 8.7.5.2, “Setting the TCP Port Context for MySQL Features”를 참조하십시오.
SELinux는 애플리케이션 변경 사항을 인지하지 못할 수 있습니다. 예를 들어, 새 릴리스, 애플리케이션 확장, 또는 새 기능이 SELinux에서 허용하지 않는 방식으로 시스템 리소스에 access를 시도하면 access 거부가 발생할 수 있습니다. 이러한 경우, audit2allow 유틸리티를 사용하여 필요한 곳에 access를 허용하는 커스텀 정책을 생성할 수 있습니다.
커스텀 정책을 생성하는 일반적인 방법은 SELinux 모드를 permissive로 변경하고, SELinux 감사 로그에서 access 거부 메시지를 식별한 다음, audit2allow 유틸리티를 사용하여 access를 허용하는 커스텀 정책을 생성하는 것입니다.
audit2allow 유틸리티 사용 방법에 대한 정보는 사용하는 배포판의 SELinux 문서를 참조하십시오.
표준 MySQL SELinux 정책 모듈에서 처리되어야 한다고 생각되는 MySQL access 문제가 발생한 경우, 사용하는 배포판의 버그 추적 시스템에 버그 리포트를 등록하십시오.
8.7.5 SELinux TCP Port Context
8.8 FIPS Support