전자책 출간 알림 [마이크로서비스패턴 쉽게 개발하기]

티스토리 뷰

 

SELinux(Security Enhanced Linux)는 ugo시스템File ACL보다 보안이 더 강화된 파일, 디렉토리, 프로세스 접근 제어 아키텍처입니다. ugo시스템이나 File ACL로 접근이 허용되더라도, SELinux에서 접근을 허용하지 않을 수 있습니다.

SELinux의 접근 제어 방법에는 타겟(Target)정책과 다단계보안(MLS: Multi Level Security)이 있는데 MLS는 정부기관과 같이 고도의 보안이 요구되는 곳에서만 사용됩니다. 

 

접근제어 방법

SELinux는 파일, 디렉토리, 프로세스에 부여된 라벨(Label)을 이용하여 접근을 통제합니다.

이 Label을 SELinux Context라고 합니다.

SELinux Context값을 보려면 ps나 ls명령의 'Z'옵션을 사용하십시오.

SELinux Context는 user, role, type, level로 구성됩니다. 타겟정책에서는 type만 사용합니다.  이 3번째 type을 특별히 Type Context라고 부릅니다.

 

SELinux가 enable되면 각 파일, 디렉토리, 프로세스는 Label이 부여됩니다. 보통 상위 디렉토리의 Label을 이어 받습니다.

Type Context는 접근을 허용하는 프로세스가 미리 정해져 있습니다. 아래 예에서 'httpd_sys_content_t'라는 type context로 지정된 디렉토리는 'httpd_t'라는 type context를 가지는 프로세스만 접근 가능합니다. 따라서 'mysql_t'라는 type context를 가진 프로세스는 아무리 ugo나 File ACL로 허용해도 /var/www/html디렉토리를 접근하지 못하게 됩니다.

실습하기

1) httpd 설치, start

$ sudo yum install -y httpd
...
$ sudo systemctl start httpd
...
$ sudo systemctl status httpd

httpd 프로세스의 SELinux context를 확인해 보면 type이 'httpd_t'인것을 확인할 수 있음.

$ ps -efZ | grep httpd

 

2) /var/www/html디렉토리에 index.html 만들기. SELinux context 확인. Web browser에서 확인하기.

$ cd /var/www/html
$ sudo vi index.html
Hello, SELinux!

$ ls -Z ./index.html

웹브라우저에서 확인

 

3) index.html의 SELinux context 변경하기. Web browser에서 확인하기. /var/log/messages에서 에러 메시지 확인하기.

chcon명령은 일시적으로 selinux context를 변경하는 명령임

$ sudo chcon -t home_root_t ./index.html

Web browser에서 파일 연결이 안됨

/var/log/messages에 보면 httpd가 index.html 파일을 접근하지 못한다는 로그가 있음

 

4) index.html의 SELinux context 원복하기. Web browser에서 확인하기.

restorecon은 부팅시의 selinux context로 복원하는 명령임.

$ sudo restorecon ./index.html

Web browser에서 다시 확인하면 이제 다시 연결이 됨.

 

SELinux모드 변경

먼저 현재 SELinux모드는 getenforce라는 명령으로 확인할 수 있습니다.

변경은 setenforce 1 OR 0을 이용합니다.

mode에는 3가지가 있습니다.

- enforcing: SELinux 가 적용되고, 정책에 위배되면 차단됨.

- permissive: SELinux가 적용되나, 정책에 위배되도 차단하지 않고 /var/log/messages에서 로깅만 함.

- disabled: SELinux를 비활성화함.

 

SELinux모드 영구 설정

setenforce는 일시적으로 SELinux 모드를 변경하는 명령입니다. 영구적으로 설정하려면 /etc/selinux/config 파일을 수정하고 리부팅하여야 합니다.

$ sudo vi /etc/selinux/config

$ sudo systemctl reboot

...

리부팅 후 selinux 모드를 확인합니다.

$ getenforce

위 실습에서 만든 index.html의 type context 를 'home_root_t'로 다시 바꾸고, web browser에서 httpd가 이 파일을 접근하는지 확인합니다.

$ sudo tail -f /var/log/messages

 

SELinux context 변경

일시적으로 변경할 때는 chcon -t <type context> <file / directory>를 이용합니다. restorecon <file/directory> 명령을 사용하면 원래대로 selinux context가 복원됩니다.

상위 디렉토리 'tmp'의 type context는 'tmp_t'이고, test.txt의 type context는 'usr_tmp_t'로 설정됨을 알 수 있습니다.

chcon으로 test.txt의 type context를 'tmp_t'로 변경했다가, restorecon으로 복원해 봅니다.

 

영구적으로 변경할 때는 semanage fcontext와 restorecon명령을 같이 사용합니다.

$ cd ~
$ mkdir virtual
$ ls -Zd virtual
....:user_home_t:...
$ echo 'hi' > virtual/test1
$ ls -Z virtual
....:user_home_t:...

~/virtual에 대한 selinux context가 정의되어 있지 않음을 확인합니다.
$ sudo semanage fcontext -l | grep home | grep virtual
<아무것도 안 나옴>

selinux context를 '/home/student/virtual(/.*)?'에 정의합니다.
$ sudo semanage fcontext -a -t tmp_t '/home/student/virtual(/.*)?'
$ sudo semanage fcontext -l | grep home | grep virtual
/home/student/virtual(/.*)?     all files    system_u:object_r:tmp_t:s0

기존 디렉토리와 파일의 type context를 변경합니다.
$ sudo restorecon -Rv virtual
...
$ ls -Zd virtual
...:tmp_t:... virtual
$ ls -Z virtual
...:tmp_t:... test1

 

SELinux 정책 관리

selinux의 미리 정해진 각종 기본 정책을 활성화 또는 비활성화 시킵니다.

기본 정책 리스트는 getsebool -a 명령으로 확인할 수 있습니다.

기본 정책을 변경하려면 setsebool <정책명> <on or off>를 이용합니다.  또한 영구 설정하려면 '-P'옵션을 사용합니다.

$ getsebool httpd_enable_homedirs
httpd_enable_homedirs --> off

setsebool명령으로 현재 상태를 on으로 변경합니다.
$ sudo setsebool httpd_enable_homedirs on
$ getsebool httpd_enable_homedirs
httpd_enable_homedirs --> on

semanage boolean -l 명령으로 현재값과 기본값을 확인할 수 있습니다. 
앞에 있는 상태값이 현재 상태이고, 뒤에 상태값이 기본값입니다. 
$ sudo semanage boolean -l | grep httpd_enable_homedirs
httpd_enable_homedirs          (on   ,   off)  Allow httpd to enable homedirs

-P 옵션으로 기본값을 바꿔 영구설정할 수 있습니다. 
$ sudo setsebool -P httpd_enable_homedirs on
$ sudo semanage boolean -l | grep httpd_enable_homedirs
httpd_enable_homedirs          (on   ,   on)  Allow httpd to enable homedirs

실습하기

위에서 설치한 웹서버의 user home directory에 html파일을 접근할 수 있도록 조정합니다.

$ sudo systemctl status httpd

userid가 student이고 domain이 workstation.lab.example.com이면, 웹브라우저를 열고 'http://workstation.lab.example.com/~student'라고 입력해 봅니다. 현재는 연결이 안될겁니다.

1) httpd의 userdir 허용

$ sudo vi /etc/httpd/conf.d/userdir.conf

UserDir disabled 를 remark하고, UserDir public_html의 remark는 해제합니다.

httpd를 재시작합니다.

$ sudo systemctl restart httpd

 

2) ~/public_html디렉토리를 만들고 home디렉토리 모드를 711로 변경합니다.

$ mkdir ~/public_html
$ chmod 711 ~

 

3) ~/public_html에 index.html파일을 만듭니다.

$ echo "Hello, httpd!" > ~/public_html

 

4) selinux의 기본정책중 httpd_enable_homedirs가 on되어 있는지 체크하고, 안되어 있으면 on합니다.

위 SELinux정책관리 참조

 

5) 웹브라우저에서 http://workstation.lab.example.com/~student 로 접근합니다.

 

참고: selinux 정책에 대한 매뉴얼 설치, 검색

getsebool -a로 보면 많은 selinux 정책이 나옵니다. 각각에 대한 매뉴얼을 보려면 아래와 같이 하십시오.

1) selinux 정책 매뉴얼 설치

$ yum list available '*selinux*'
...
$ sudo yum install -y selinux-policy-doc
...

2) 매뉴얼에서 정책 검색

$ man -K <정책명>

예) man -K httpd_enable_homedirs

 

 

SELinux 문제 조사 및 해결

대부분의 문제는 SELinux context의 type context가 잘못 되어 있는 경우입니다.

로그는 /var/log/audit/audit.log와 /var/log/messages에서 확인할 수 있습니다.

type context가 잘못된 경우는 restorecon -Rv <디렉토리 or file>명령으로 원복하면 해결됩니다.

에러에 대한 자세하 설명은 sealert -l <uuid>를 이용합니다.

아래와 같이 실습해 보십시오.

1) 위에서 만든 /home/student/virtual/index.html의 type context를 'root_t'로 바꿉니다.

$ chcon -t root_t /home/student/public_html/index.html
$ ls -Z ~/public_html
...:root_t:... index.html

 

2) 웹브라우저에서 http://workstation.example.lab.com/~student로 접근합니다. 

3) /var/log/messages에서 에러 메시지를 찾습니다.

2번째 줄의 'For complete SELinux messages run: sealert -l 599....'에서 sealert -l 599... 값을 복사하십시오.

참고로, /var/log/audit/audit.log에는 아래와 같이 메시지가 기록됩니다.

4) sealert -l 명령으로 자세한 에러 정보를 봅니다.

아래 보면 restorecon으로 selinux context를 변경하라는 가이드가 나옵니다.

5) restorecon으로 selinux context를 변경합니다.

6) 이제 웹브라우저에서 확인해 보면 접근이 됩니다.

 

 

댓글

전자책 출간 알림 [마이크로서비스패턴 쉽게 개발하기]