페이지 트리

충분한 저장공간 또는 특별한 디스크에 MySQL 데이터 폴더를 위치시키는 경우가 많다. 이 때 폴더 접근 권한 설정은 SELinux를 고려해야한다. 이 페이지는 SELinux 에 대해 조금 소개하고 MySQL 데이터 폴더를 기본 위치에서 다른 경로로 이동하는 방법을 소개한다. 

Selinux 맛보기

Security-Enhanced Linux (SELinux)는 보안 강화를 위한 리눅스 커널 모듈로써 1998년 NSA와 RedHat이 제안하고 레드햇이 개발을 담당했다.

이 보안 모듈은 2003년 8월 8일 버전 2.6을 기점으로 주류 리눅스 커널에 통합되었고, CentOS 4에 처음 적용되었다.

해결하고 싶은 문제

SELinux는 아래의 문제 해결에 관심이 있다:

  • 사용자 제어 불가: 사용자가 임의로 모든 유저자가 읽고 쓸 수 있는 폴더 또는 파일을 생성할 수 있음
  • 프로세스가 보안 특성을 변경 가능: 사용자의 메일 파일은 해당 사용자만 읽을 수 있지만, 메일 client 프로세스가 해당 파일을 모든 사용자가 읽을 수 있도록 변경 가능

동작 모드

세 가지 동작 모드로 구성된다.

  • Enforcing: SELinux 보안정책 사용을 강제하고 접근 위반 행위를 기록함
  • Permissive: SELinux가 사용되지만 보안정책을 강제하지는 않고 접근 위반에 대해 경고하고 위반 행위를 기록함
  • Disable:  SELinux 사용 안함

SELinux 동작 상태 확인 방법:

$ setstatus
SELinux status:                 enabled
SELinuxfs mount:                /selinux
Current mode:                   enforcing
Mode from config file:          enforcing
Policy version:                 21
Policy from config file:        targeted

정책

SELinux는 기본적으로 접근을 거부하는 least-privilege 정책을 따른다. SELinux에서는 보안 정책을 "targeted policy"라는 용어로 정의하고 서로다른 보안정책간의 변환을 허용한다.

접근 제어

SELinux는 4가지 접근제어 형식 제공:

  • Type Encorcement (TE): primary mechanism
  • Role-Based Acess Control (RBAC): SELinux 사용자 기준의 접근제어
  • Multi-Level Security (MLS)
  • Multi-Category Security (MCS): MLS의 확장으로 virtual machine과 container 분류 (compartment)에 사용됨

SELinux context 정보 확인 방법:

$ ls -Z /var/lib/ 
drwxr-x--x. mysql   mysql   system_u:object_r:mysqld_db_t:s0 mysql


$ ps axZ | grep mysqld
system_u:system_r:mysqld_t:s0     1675 ?        Sl     0:00 /usr/sbin/mysqld

MySQL Data 폴더 변경

사전 조건

  • semanage  설치

    $ yum install policycoreutils-python

Step 1) MySQL 서비스 종료

$ systemctl stop mysqld


Step 2) 데이터 폴더 이동

설정 변경을 최소화하기 위해 Linux의 symbolic link 사용

  • 새로운 데이터 폴더 위치: /data/mysql-data
$ mv /var/lib/mysql /data/mysql-data
$ ln -s /data/mysql-data /var/lib/mysql

Step 3) SELinux context 설정

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

Step 4) MySQL 서비스 시작

$ systemctl start mysqld
  • 레이블 없음