[Linux][CentOS][7.x] 간단한 SELinux 설정법
CentOS 설치 후에 어플리케이션 설치 및 설정 후 무언가 제대로 되지 않는다면 대부분 SELinux 설정 때문인 경우가 많습니다.
SELinux 에 대해서 알아보도록 하겠습니다.
SELinux란 Security-Enhanced Linux 의 줄임말로 보안이 향상된 리눅스라고 정의되어 있습니다.
보안과 사용자 편의는 양날의 검인지라, 보안이 향상되었다는 것은 무언가 사용하기 불편할 수 있다라는 의미입니다.
SELinux 상에서는 각 응용 프로그램에 대해서 접근이 가능한 설정 파일이나 사용할 수 있는 폴더의 위치에 대해서 권한이 명확하게 정의가 되었습니다.
예를 들자면 httpd 프로세스가 php 를 통해서 특정 경로에 파일을 write 하는 것도 SELinux context type이 맞아야만 가능합니다.
또한 mysql 의 DB 경로를 변경할 때에도 해당 폴더에 맞는 SELinux context type 이어야 가능합니다.
1. SELinux 기본
SELinux는 enforcing, permissive, disabled 세 가지 정책을 설정할 수 있습니다.
enforcing 의 경우 보안 정책을 적용하는 것이고, permissive 의 경우는 경고만 보여주고, disabled 는 아예 로딩하지 않는 것입니다.
그리고 targeted, minimum, mls 등의 타입을 지정할 수 있습니다.
targeted는 지정된 프로세스들을 보호하는 것이고, minimum 은 targeted 를 변형하여 선택된 프로세스만 보호하는 것이고, mls 는 여러 레벨로 보안을 설정하는 것입니다.
현재 설정을 확인하기 위해서는 getenforce 명령어를 사용합니다.
# getenforce |
그리고 임시 설정 변경을 위해서는 setenforce 명령어를 이용하면 됩니다. (리부팅시 원래 상태로 돌아옴)
SELinux 설정을 permissive 로 변경
# setenforce 0 |
SELInux 설정을 enforcing 으로 변경
# setenforce 1 |
영구적인 설정 변경을 위해서는 아래의 설정파일을 열어서 변경하면 됩니다.
# vi /etc/selinux/config |
2. chcon 을 이용한 context type 변경
SELinux 를 사용하지 않으면 설정에 문제는 사라지겠지만 보안이 약해지는 문제가 있습니다. 따라서 SELinux 를 적용한 상태에서 특정 폴더 혹은 파일의 context type 을 상황에 맞게 적용하는 방법에 대해서 설명 드리겠습니다.
이전에 mysql 설정 포스팅에서도 잠깐 소개되었었는데, mysql의 DB 경로를 변경하는 경우에 대해서 설명해 보겠습니다.
기본 경로 (/var/lib/mysql)를 /datadir 로 변경한다고 가정하면, 아래와 같이 새 DB 경로의 context 를 변경해 주면 mysql 프로세스가 사용이 가능한 권한을 얻게 됩니다.
# chcon --reference=/var/lib/mysql -R /datadir |
또한 php 프로세스가 httpd 상에서 파일 쓰기 권한이 필요하다면, 권한이 필요한 경로 (/var/www/html/phpfile) 에 다음과 같이 설정해 주면 됩니다.
# chcon -t httpd_sys_rw_content_t -R /var/www/html/phpfile |
3. SELinux 설정값 확인 및 변경
이번에는 getsebool / setsebool 명령어를 이용해서 SELinux 설정을 확인하고 변경해 보겠습니다.
httpd 프로세스에서 네트워크 연결 허용 여부를 결정하는 SELinux 설정은 httpd_can_network_connect 입니다.
아래와 같이 입력하여 현재 설정값을 확인해 봅니다.
# getsebool httpd_can_network_connect |
혹은 getsebool -a 후에 grep 으로도 확인할 수 있습니다.
위의 연결을 허용해 주고 싶으면 아래와 같이 입력하면 됩니다.
# setsebool -P httpd_can_network_connect on |
on 대신 1을 입력해도 됩니다.
반대로 연결을 허용하지 않겠다면,
# setsebool -P httpd_can_network_connect off |
off 대신 0을 입력해도 됩니다.
[Linux][CentOS][7.x] MySQL 5.6 기본 설정
이전 포스팅에서 CentOS 7.x 서버에 MySQL 5.6 을 설치해 보았습니다. [MySQL 설치 다시보기]
이번 포스팅에서는 MySQL 설치 후에 필요한 세팅에 대해서 알아보도록 하겠습니다.
MySQL은 시작할 때 /etc/my.cnf 파일을 읽어서 필요할 설정을 하게 됩니다.
아래 명령으로 해당 파일을 열어서 편집합니다.
# vi /etc/my.cnf |
파일을 열어보면 [mysqld], [mysqld_safe] 와 같이 설정 영역이 나뉘어져 있습니다. 설정은 반드시 필요한 영역에 적어줘야 합니다.
1. DB 경로 설정
- [mysqld] 에 있는 datadir 의 경로를 변경해 줍니다. datadir을 변경할 때는 변경할 datadir의 context를 같이 변경해 주어야 합니다.
[mysqld] datadir=/var/lib/mysql |
- context 변경 (mysql DB 경로를 /datadir 로 변경했다고 가정)
다음 중 하나만 실행해 주면 됩니다.
- selinux 상에서 context 변경
- semanage 설치
# yum install policycoreutils-python |
- context 설정 변경
# semanage fcontext -a -t mysqld_db_t "/datadir(/.*)?" |
- 변경된 설정 적용
# restorecon -Rv /datadir |
- chcon 을 이용해서 context 직접 변경
# chcon --reference=/var/lib/mysql /datadir |
2. 기본 DB 엔진 설정
- 테이블을 생성할 때 기본으로 사용할 DB 엔진을 설정할 수 있습니다. 트랜젝션을 지원하는 InnoDB 엔진을 기본으로 설정하려면 다음을 추가해 주면 됩니다.
[mysqld] default-storage-engine=InnoDB |
MySQL 4.x 버전에서는 default-storage-engine 대신 default-table-type 이라는 옵션을 사용했었는데, 5.x 버전에서는 이 설정이 있으면 에러가 나면서 MySQL이 실행되지 않습니다.
3. 인코딩 설정
- 한글이나 일본어 중국어 등의 문자를 사용하는 경우 utf8 방식으로 인코딩을 하여 저장하는 것이 편리합니다.
인코딩에 대해서는 데이터가 저장될 때의 인코딩과 클라이언트와 서버간의 주고 받는 데이터의 인코딩 등이 다르게 설정될 수 있으므로, 데이터 저장에 대한 것은 [mysqld] 영역에 클라이언트 접속시의 기본 인코딩은 [client] 영역에 다음과 같이 적어 주면 됩니다.
[mysqld] character-set-server=utf8 collation-server=utf8_general_ci [client] default-character-set=utf8 |
MySQL에서는 서버, 데이터베이스, 테이블, 컬럼에 대해서 각각의 인코딩 방식을 적용할 수 있습니다. 이미 생성된 데이터베이스나 테이블 등은 백업 / 리스토어 시에 해당 인코딩 설정이 붙어서 오기 때문에 기존에 생성된 데이터베이스, 테이블, 컬럼에 대해서는 alter 명령어로 변경해 주는 작업이 필요할 수 있습니다.
4. Slow Query 로그 설정
- MySQL의 성능을 모니터링 하기 위해서 필요한 설정입니다. MySQL 서버에서 처리하는 query 중에 지나치게 오랜 시간이 소요되어 퍼포먼스에 영향을 주는 query가 없는지 혹은 index를 타지 않아 문제의 소지가 될 만한 query가 있는지를 로그에 남기는 작업입니다.
slow-query-log 는 Slow Query 로그를 남긴다는 설정입니다. slow-query-log=1 과 같은 의미 입니다.
long_query_time은 Slow Query 로그에 남길 기준 시간을 초단위로 설정합니다.
log_queries_not_using_indexes 는 index를 타지 않는 Query를 로그에 기록합니다.
[mysqld] slow-query-log long_query_time=2 log_queries_not_using_indexes |
slow_query_log_file 옵션으로 파일명을 별도로 설정을 하지 않았다면, MySQL DB가 설치된 경로에 localhost-slow.log 파일에 Slow Query 로그가 생성됩니다.
5. Max Connections 설정
최대 접속 가능 클라이언트 숫자 지정 (default 151)
[mysqld] max_connections=500 |
6. Timeout 시간 지정
default 28800
[mysqld] wait_timeout=60 |