InfraPlatform

CentOS 8에서 mariaDB 의 Selinux 설정

IT오이시이 2020. 3. 10. 21:35
728x90

Linux - mariaDB 의 Selinux 설정 (CentOS8)

 

linux application 설치 후 작동이 되지않는 원인 중에 selinux와 연관이 많다. selinux는 어플리케이션의 실행 권한과  접근하는 파일의 권한을 제어하는 것으로 어플리케이션 설치 후 권한 설정이 필요합니다. 

SELinux (Security-Enhanced Linux)?

SElinux 는 특정 프로세스가 특정 디렉토리나 파일을 접근하지 못하도록 제한하는 리눅스의 보안 설정입니다.

지금까지 대부분의 운영/개발자들은 selinx를 disabled 상태로 변경하거나 firewall을 중지하는 것으로  문제를 해결 하여 왔습니다. 제일 간단한 방법이기는 하지만 실제 리눅스의 안전한 사용을 위해서는 올바른 설정이 필요합니다.

 

1) 가장 자주 접하는 프로그램을 설치하고 작동이 안되는 이슈 Selinux 디버깅하기

#     enforcing - SELinux 를 강제적으로 시행한다..
#     permissive - SELinux 시행을 하지만 문제에 대한 워닝을 제공한다. 
#     disabled - No SELinux 정책을 적용하지 않는다.

Selinux 때문에 설치한 프로그램이 작동이 잘 되는지 확인하는 좋은 방법은  "SELINUX=permissive" 로 설정하는 것입니다. 적용 하는 방법은 수정하고 재부팅을 하면 적용이 됩니다.  (* 변경시 반드시 재부팅을 해야합니다.)

[ cat /etc/selinux/config ]

[ cat /etc/selinux/config ]

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
#*SELINUX=enforcing
SELINUX=permissive
# SELINUXTYPE= can take one of these three values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected.
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted

 

2) SELinux 문제 찾기  

[tail -f /var/log/messages]

Mar 10 07:41:19 main setroubleshoot[13614]: SELinux is preventing /usr/sbin/mysqld from write access on the directory Maria_Data. 
For complete SELinux messages run: sealert -l ba176fb3-70bd-4bbb-842a-2990f7d010c7
Mar 10 07:41:19 main platform-python[13614]: SELinux is preventing /usr/sbin/mysqld from write access on the directory Maria_Data.
#012#012*****  Plugin catchall_labels (83.8 confidence) suggests   *******************
#012#012If you want to allow mysqld to have write access on the Maria_Data directory
#012Then you need to change the label on Maria_Data
#012Do#012# semanage fcontext -a -t FILE_TYPE 'Maria_Data'
#012where FILE_TYPE is one of the following: faillog_t, krb5_host_rcache_t, mysqld_db_t, mysqld_log_t, mysqld_tmp_t, mysqld_var_run_t, tmp_t, var_lib_t, var_log_t, var_run_t.#012Then execute:
#012restorecon -v 'Maria_Data'
#012#012#012*****  Plugin catchall (17.1 confidence) suggests   **************************
#012#012If you believe that mysqld should be allowed write access on the Maria_Data directory by default.
#012Then you should report this as a bug.
#012You can generate a local policy module to allow this access.
#012Do#012allow this access for now by executing:
#012# ausearch -c 'mysqld' --raw | audit2allow -M my-mysqld
#012# semodule -X 300 -i my-mysqld.pp#012

 

위의 내용으로 정리하면 SELinux는 이 문제를 해결하기 위해 두 가지 가능한 제안을 제시합니다:

Option 1 - Changing the SELinux Label:

첫 번째 제안은 "Maria_Data" 디렉토리에 대해 "mysqld"에 대한 쓰기 권한을 허용하기 위해 SELinux 레이블을 변경하는 것입니다. 아래 명령어를 실행하여 이를 수행할 수 있습니다. ('Maria_Data' 디렉토리의 컨텍스트와 가장 적합한 타입을 선택)

semanage fcontext -a -t FILE_TYPE 'Maria_Data'
restorecon -v 'Maria_Data'

 

Option 2 - Reporting as a Bug or Creating a Local Policy:

두 번째 제안은 'mysqld'가 'Maria_Data' 디렉토리에 대해 기본적으로 쓰기 권한을 가져야 한다고 생각하는 경우 이 문제를 버그로 보고하거나 로컬 정책 모듈을 생성하는 것입니다. 임시로 이 접근을 허용하려면 'audit2allow' 도구와 다음 명령어를 사용할 수 있습니다

ausearch -c 'mysqld' --raw | audit2allow -M my-mysqld
semodule -X 300 -i my-mysqld.pp

 

3)  SElinux 정책 입력 하기

 MariaDB가 접근하여 사용하는 디렉토리의 설정으로 mysqld_db_t 타입의 컨텍스트를 설정합니다.

[change_semanage.sh]

 dataDir="/data/MariaDB"
 getenforce
 semanage fcontext -a -t mysqld_db_t "${dataDir}(/.*)?"
 restorecon -Rv ${dataDir}
 chcon -R -u system_u -r object_r -t mysqld_db_t ${dataDir}
 ls -lh -Zd ${dataDir}

 


[추가 설명]

1. dataDir="/data/MariaDB":
스크립트의 첫 번째 줄은 dataDir 변수를 선언하고 "/data/MariaDB"를 할당합니다. 이 변수는 정책을 적용할 대상 디렉토리를 나타냅니다.

 

2. SElinux 상태 확인

# getenforce
Permissive

getenforce 명령은 현재 SELinux 상태를 확인하는데 사용됩니다.

getenforce 명령은 현재 SELinux 적용 모드를 출력하며, Enforcing 또는 Permissive가 출력됩니다. Enforcing은 SELinux가 활성화되어 엄격한 보안 정책을 적용하는 모드를 의미하고, Permissive는 SELinux가 활성화되어 경고만 표시하지만, 권한은 허용하는 모드를 의미합니다.

 

3. SElinux의 파일의 context를 설정한다.

# semanage fcontext -a -t mysqld_db_t "${dataDir}(/.*)?"
  -a :  Add a record of the specified object type 
  -t : SELinux Type for the object

 semanage fcontext -a -t mysqld_db_t "${dataDir}(/.*)?": 이 명령은 /data/MariaDB 디렉토리와 그 하위 모든 파일과 디렉토리에 대해 mysqld_db_t 타입의 SELinux 컨텍스트를 추가합니다. 이것은 MariaDB와 관련된 데이터 디렉토리를 정책에 맞는 컨텍스트로 지정하는 것입니다.

 

4. Selinux의 기본 설정으로 복원한다.

# restorecon -Rv ${dataDir}
Relabeled /data/MariaDB from unconfined_u:object_r:default_t:s0 to unconfined_u:object_r:mysqld_db_t:s0 Relabeled /data/MariaDB/Maria_Bins from unconfined_u:object_r:default_t:s0 to unconfined_u:object_r:mysqld_db_t:s0 
Relabeled /data/MariaDB/Maria_Bins/maria_bin.index from unconfined_u:object_r:default_t:s0 to unconfined_u:object_r:mysqld_db_t:s0 
Relabeled /data/MariaDB/Maria_Bins/maria_bin.000001 from unconfined_u:object_r:default_t:s0 to unconfined_u:object_r:mysqld_db_t:s0
restorecon                  # restore file(s) default SELinux security contexts

 restorecon -Rv ${dataDir}: 이 명령은 /data/MariaDB 디렉토리의 SELinux 컨텍스트를 기본 정책으로 복원합니다. restorecon은 파일과 디렉토리의 SELinux 컨텍스트를 해당 파일 시스템에 저장된 기본 정책으로 다시 설정하는데 사용됩니다.

 

4. 파일 시스템의 정책으로  "mysqld_db_t"  type를 설정한다.

# chcon -R -u system_u -r object_r -t mysqld_db_t   ${dataDir}
 chcon <옵션> <보안문맥> <파일명>
chcon # change file security context (temporally)
chcon 은 change context 의 약자로 객체의 보안 컨텍스트를 지정하는 명령어입니다. 보안 컨텍스트의 여러 가지 옵션이 있지만 가장 많이 사용되는 것은 재귀적으로 처리하는 -R 옵션과 타입을 지정하는 -t  옵션입니다.

chcon -R -u system_u -r object_r -t mysqld_db_t ${dataDir}: 이 명령은 /data/MariaDB 디렉토리의 SELinux 컨텍스트를 mysqld_db_t 타입으로 변경합니다. chcon 명령은 파일과 디렉토리의 SELinux 컨텍스트를 일시적으로 변경하는데 사용됩니다.

 

5. 마지막  ls -lh -Zd ${dataDir}: 파일 시스템의 정책으로  "mysqld_db_t"  type를 설정한 것을 확인한다.

 

이명령 /data/MariaDB 은 디렉토리의 세부 정보를 출력하고 각 파일과 디렉토리의 SELinux 컨텍스트를 보여줍니다. -Z 옵션은 SELinux 컨텍스트 정보를 표시하는데 사용됩니다.

# dataDir="/data/MariaDB"
# ls -lh -Zd   ${dataDir}
drwxr-xr-x. 5 root root system_u:object_r:mysqld_db_t:s0 100 Mar 10 07:55 /data/MariaDB

 /data/MariaDB에 대한 설정 과 /data 의 차이는 아래와 같이 "mysqld_db_t:"가 없는 것을 확인 할 수 있다.

#  ls -lh -Zd /data
drwxr-xr-x. 4 root root unconfined_u:object_r:default_t:s0 34 Mar  9 08:24 /data

 

 

6. FILE_TYPE 추가 확인 :

 아래와 같이 디렉토리를 생성하면 파일의 권한이 기본 FILE_TYPE 설정되면 root가 아닌 mysql로 데몬을 구동하면 "unconfined_u:object_r:var_run_t:s0 " FILE_TYPE을 읽고 쓰기 가 안되는 경우를 확인합니다.

[mysql 데몬 정보 저장 위치 생성]
#mkdir -p  /var/run/mysql
#chown mysql:mysql /var/run/mysql

[파일 설정 권한 확인]
#ls -alZ   /var/run/mysql
drwxr-xr-x.  2 mysql mysql unconfined_u:object_r:var_run_t:s0   40 Mar 10 08:31 .
drwxr-xr-x. 42 root  root  system_u:object_r:var_run_t:s0     1280 Mar 10 08:31 ..

#아래는 시스템 계정  (ROOT)가 이용하는 권한으로 설정 되어 있다.
# mysql 권한 정책을 부여하려면 아래와 같이 설정한다. (안해도됨)
chcon -R -u system_u -r object_r -t mysqld_db_t /var/run/mysql



728x90
반응형