콘텐츠로 이동

MySQL SELinux 설정 (Production 기준)

SELinux가 활성화된 운영 서버(Production Server) 에서
MySQL을 정상적으로 운영하기 위한 SELinux 설정 기준과 운영 원칙을 정의함.

SELinux를 비활성화하지 않고 운영하는 것을 전제로 함.


1. SELinux에 대한 기본 전제

운영 환경에서 SELinux는 다음과 같은 위치를 가짐.

  • OS 보안의 최종 방어선
  • 방화벽 이후 단계의 접근 통제
  • 잘못된 설정을 즉시 차단하는 보호 장치

SELinux는 문제의 원인이 아니라 잘못된 설정을 드러내는 도구임


2. SELinux를 비활성화하지 않는 이유

운영 서버에서 다음 방식은 허용하지 않음.

setenforce 0

또는

SELINUX=disabled

금지 이유는 다음과 같음.

  • 문제 원인을 제거하지 않고 숨김
  • 보안 사고 발생 시 즉시 전체 침해 가능
  • 운영 환경 보안 기준 붕괴

SELinux를 끄는 것은 문을 부수고 경보기가 울리지 않는다고 안심하는 행위임.


3. SELinux 상태 확인

현재 SELinux 상태를 확인함.

getenforce

또는

sestatus

운영 기준:

  • Enforcing 상태 유지
  • Permissive는 임시 디버깅 용도로만 사용함

4. MySQL과 SELinux의 관계

SELinux는 다음 항목을 통제함.

  • MySQL이 사용할 수 있는 포트
  • MySQL이 접근 가능한 디렉터리
  • MySQL 프로세스의 네트워크 동작

따라서 다음 작업을 수행할 경우
SELinux 설정을 반드시 함께 수정해야 함.

  • MySQL 포트 변경
  • 데이터 디렉터리 변경
  • 로그 디렉터리 변경

5. MySQL 포트 변경 시 SELinux 설정

기본 MySQL 포트는 3306임.
다른 포트를 사용할 경우 다음 작업을 수행함.

5.1 허용된 포트 확인

sudo semanage port -l | grep mysql

위 명령어로 확인 후 - 없다면 -a (5.2 새로운 포트 추가) - 있다면 -m (5.3 기존 포트 수정)

5.2 새로운 포트 추가

sudo semanage port -a -t mysqld_port_t -p tcp 3307
  • 포트 변경 후 MySQL 재시작 필요함

5.3 기존 포트 수정

sudo semanage port -m -t mysqld_port_t -p tcp 3307
  • 포트 변경 후 MySQL 재시작 필요함

5.4 Port 수정 시 MySQL 설정 변경

MySQL 포트를 변경하는 경우 SELinux 설정과 함께 MySQL 설정 파일(my.cnf 또는 my.ini)도 반드시 수정해야 함.

[mysqld]
port = 3307

6. 데이터 디렉터리 변경 시 SELinux 설정

MySQL 데이터 디렉터리를 기본 경로(/var/lib/mysql) 외 위치로 변경할 경우 SELinux 컨텍스트를 반드시 설정함.

6.1 현재 컨텍스트 확인

ls -Z /var/lib/mysql

6.2 컨텍스트 복구

sudo restorecon -Rv /var/lib/mysql

6.3 사용자 정의 경로 사용 시

ex) /data/mysql 경로를 새로운 사용자 경로로 지정한다면,

sudo semanage fcontext -a -t mysqld_db_t "/data/mysql(/.*)?"
sudo restorecon -Rv /data/mysql

6.4 사용자 정의 경로 변경 시 MySQL 설정 변경

데이터 디렉터리를 기본값(/var/lib/mysql)에서 변경하는 경우
MySQL 설정 파일(my.cnf 또는 my.ini)에 datadir 설정을 반드시 함께 수정해야 함.

ex)

[mysqld]
datadir = /data/mysql


7. 로그 디렉터리 관련 주의 사항

Binary Log, Error Log 경로를 변경할 경우에도 SELinux 설정이 필요함. /var/log/mysql 은 OS 표준 경로이지만 MySQL이 직접 접근하는 경우 SELinux 컨텍스트를 명시적으로 설정함.

ex) /var/log/mysql 경로를 새로운 사용자 경로로 지정한다면,

sudo semanage fcontext -a -t mysqld_log_t "/var/log/mysql(/.*)?"
sudo restorecon -Rv /var/log/mysql

7.1 로그 디렉터리 경로 변경 시 MySQL 설정 변경

로그 디렉터리 경로를 변경한 경우 MySQL 설정 파일(my.cnf 또는 my.ini)에 해당 로그 경로를 명시해야 함.

[mysqld]
log_error = /var/log/mysql/error.log
log_bin   = /var/log/mysql/mysql-bin.log

8. SELinux 관련 문제 진단 방법

MySQL이 정상인데 접속 또는 기동이 실패할 경우
다음 로그를 반드시 확인함.

sudo ausearch -m avc -ts recent

또는

sudo journalctl -t setroubleshoot

로그 없이 추측으로 SELinux를 끄지 않음.


9. 금지 패턴 (운영 환경)

운영 환경에서 다음은 금지함.

  • SELinux 비활성화
  • 문제 원인 확인 없이 setenforce 0
  • 포트/디렉터리 변경 후 SELinux 미설정
  • SELinux 경고 무시

SELinux 경고는
운영 환경에서 가장 신뢰할 수 있는 힌트임.


10. 작업 완료 기준

다음 조건을 만족해야
SELinux 설정이 완료된 것으로 간주함.

  • SELinux Enforcing 상태 유지
  • MySQL 정상 기동
  • 포트 및 디렉터리 접근 정상
  • AVC 로그 오류 없음