클라우드 네이티브 애플리케이션 부트캠프 알림

티스토리 뷰

 

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) 이제 웹브라우저에서 확인해 보면 접근이 됩니다.

 

 

댓글

클라우드 네이티브 애플리케이션 부트캠프 알림