도메인 전환과 대상 정책


도메인 전환(Domain Transition)

도메인 전환은 SELinux 의 중요한 특징중 하나로 부모 프로세스에서 생성된 자식 프로세스에는 부모 프로세스보다 적은 권한을 가진 도메인을 할당하는 정책입니다.


이를 확인하기 위해 ls -Z 로  웹 컨텐츠를 제공하는 /var/www/html 폴더의 보안 컨텍스트를 확인해 보면 다음과 같은 정보를 볼 수 있습니다.

$ ls -ldZ /var/www/html/

drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html/

TODO: httpd_sys_content_t 진하게

컨텍스트 조회


여기에서 첫 번째 system_u  SELinux 의 사용자를 의미하며 2번째 object_r 는 SELinux 역할, 3번째 httpd_sys_content_t 는 타입, 마지막 s0 은 레벨이며 가장 중요한 타입은 httpd_sys_content_t 입니다.


다음은 아파치 웹 서버인 httpd 의 보안 컨텍스트를 확인해 봅시다.

$ ls -Z /usr/sbin/httpd 

-rwxr-xr-x. root root system_u:object_r:httpd_exec_t:s0 /usr/sbin/httpd

TODO: httpd_exec_t 진하게

httpd 보안 컨텍스트

httpd 실행 파일은 system_u:object_r:httpd_exec_t 이라는 보안 컨텍스트를 갖고 있는 것을 알 수 있습니다.


CentOS 에 설치하는 아파치 httpd 는 실행시에 /etc/httpd 폴더내의 설정 파일을 읽고 /var/log/httpd 폴더에 로그를 기록합니다. SELinux 하에서 어떻게 처리되는지 확인해 보기 위해 두 폴더의 컨텍스트를 확인해 봅시다.

$ ls -ldZ /var/log/httpd/ /etc/httpd/

drwxr-xr-x. root root system_u:object_r:httpd_config_t:s0 /etc/httpd/
drwx------. root root system_u:object_r:httpd_log_t:s0 /var/log/httpd/

TODO: type 진하게

httpd 관련 폴더의 컨텍스트

/etc/httpd 는 httpd_config_t 라는 타입을 갖고  /var/log/httpd 는 httpd_log_t 라는 타입을 갖는 것을 확인할 수 있습니다.


이제 아파치 httpd 가 구동되었을 때 어떤 보안 컨텍스트를 갖게 되는지 확인해 보기 위해 "ps -ZC httpd" 명령을 실행합니다. -C 옵션은 pid 대신 프로세스 이름으로 프로세스의 정보를 얻어오는 옵션이며 -Z 는 SELinux 의 컨텍스트를 표시하는 옵션입니다.

$ ps -ZC httpd         

LABEL                               PID    TTY       TIME        CMD
unconfined_u:system_r:httpd_t:s0   30374    ?       00:00:00    httpd
unconfined_u:system_r:httpd_t:s0   30376    ?       00:00:00    httpd
unconfined_u:system_r:httpd_t:s0   30377    ?       00:00:00    httpd


TODO: httpd_t 진하게

ps 로 확인한 런타임 보안 컨텍스트


관리자가 httpd 프로세스를 실행하면 SELinux 내부 정책 설정에 따라 httpd_exec_t 의 도메인은 httpd_t 로 전환되며 사전에 분류되고 승인된 리소스에만 접근이 허용됩니다.

예로 로그를 기록하는 폴더인 /var/log/httpd 에 쓰려면 root 권한으로 httpd 를 실행하더라도 httpd_t 가 없으면 쓸 수가 없습니다.


반대로 소유자가 웹 서버인 폴더를 만들더라도 허용된 타입이 붙어 있지 않다면 웹 서버가 접근할 수 없습니다.

SELinux 도메인 전환


타입 강제

위에서 설명한대로 웹 서버 프로세스가 로그를 기록하려면 해당 객체에는 httpd_log_t 타입이 부여되어야 하고 웹 서버 설정 파일에는 httpd_config_t 가 있어서 읽을 수 있는 것은 SELinux 내의 타입 강제(TE; Type Enforcement) 라는 핵심 기능때문입니다.


TE는 위와 같은 MAC 기반의 접근 통제를 처리하는 매커니즘으로 주체가 객체에 접근하려고 할 때 주체에 부여된 보안 컨텍스트가 객체에 접근할 권한이 있는지 판단하는 제어하는 역할을 수행합니다.


예로 아파치 웹 서버가 /var/log/httpd/access.log 에 로그 기록을 위해 접근할 때 아파치 웹 서버는 주체가 되며 /var/log/httpd/access.log 는 객체가 되며 아파치 웹 서버 프로세스는 httpd_exec_t 에서 도메인 전환에 따라 httpd_t 타입이 됩니다.


이제 httpd 가 리소스에 접근할 경우 SELinux 의 TE 는 권한이 있는지 여부를 판단하며 예로 /var/www/html/index.html (타입 httpd_sys_content_t) 에 접근시 읽기를 허용하므로 클라이언트에 웹 서비스를 제공할 수 있으며 /tmp 폴더(tmp_t 타입) 에 파일을 쓰려고 할 경우 허용되지 않았으므로 차단하게 됩니다.


SELinux 를 켤 경우 서비스가 제대로 동작하지 않는 대부분의 이유는 바로 보안 컨텍스트를 잘못 설정해서 TE 가 접근 차단해서이며 이번 장을 읽고 난 독자는 이런 상황을 해결할 능력을 갖게 될 것입니다.


대상 정책(Targeted Policy)

레드햇의 지원으로 RHEL 배포판은 버전 4 부터 SELinux 를 기본 포함시켰고 사용이 용이하도록 프로세스, 파일등 모든 객체에 대해 상세한 보안 정책을 만들어서 같이 탑재하였습니다.


사전에 정의된 이 정책을 targeted policy 라고 하며 /etc/selinux/targeted/ 에 정의되어 있습니다. 아래는 httpd_t 타입에 대한 설정의 일부분으로 아파치 웹서버가 갖는 보안 컨텍스트인 httpd_t 는 httpd_sys_content_t 에만 접근이 가능하며 허용된 시스템 콜은 ioctl, read, getattr, lock, open 이라는 의미입니다.

allow httpd_t httpd_sys_content_t : file { ioctl read getattr lock open };
targeted policy


사전에 탑재된 대상 정책중 중요한 것은 Confined process 정책으로 소켓을 리슨하는 모든 프로세스(서버 프로세스)에 대해서 엄격하게 별도의 도메인으로 격리하고 Buffer overflow 공격을 방지하기 위해 memory 에 있는 코드 실행을 차단하여 해당 서버가 해킹 당해도 피해가 최소화 되도록 설정되어 있습니다.


소켓을 리슨하지 않고 setuid, setgid 비트가 없는 기존의 일반적인 프로세스(Unconfined process)는 강제 접근 통제를 적용하지 않고 기존의 임의 접근 통제에 따라서 동작하므로 사용에 아무 문제가 없습니다.

SELinux 의 이런 정책은 기존 프로그램들과의 호환성을 확보하면서 주요 해킹 대상인 소켓을 사용하는 데몬 프로세스(예: httpd, ftpd, sambad)의 보안 취약점을 방지하기 위한 해결책으로 나온 것입니다.


만약 서버 데몬을 개발하는 개발자라면 위에서 설명한 SELinux 에서도 잘 동작하도록 보안 정책을 작성하거나 정책을 수정할 필요가 있을 수 있지만 웹 개발자나 관리자는 SELinux 의 아키텍처와 대해서 이해하고 보안 컨텍스트에 대한 지식을 갖춘다면 사용에 크게 어려움이 없습니다.


이제 실제 SELinux 를 사용하기 위한 관리 명령어에 대해서 알아 봅시다.