본문 바로가기
개발, IT

SELINUX에 대하여 - 1편-

by Nabi™ 2008. 9. 17.

1. SELInux(Security-Enhanced Linux) 란?

SELinux 란 미 국가 보안국 (U.S. National Security Agency)리 오픈소스커뮤니티에 릴리즈한 Linux의 보안 강화 버전(코드 포함)으로서 리눅스 보안 모듈 구조체(Linux Security Modules(LSM) framework)를 이용하여 리눅스 커널에 의무 접근 제어(Mandatory Access Control - MAC)를 구현하는 것이다. Fedora Core3부터 기본으로 적용되기 시작하였고, 현재 대부분의 최신 리눅스 배포판에서 지원되고있다.


SELinux에 대한 이해를 돕기위해서 DAC, MAC를 잠깐 이야기 해보자.

표준 리눅스 보안은 Discretionary Access Control - DAC 모델을 따른다. DAC 모델에서, 파일과 자원에 대한 결정권은 오직 해당 객체(objects)의 사용자(user id)에게 있고 소유권(ownership)에 따라 이뤄진다. 각 사용자와 그 사용자에 의해 실행된 프로그램은 자기에게 할당된 객체에 대해 전적으로 자유재량권을 갖는다. 이러한 상황에서는, 악의 있는 일반 혹은 루트 사용자(예로, setuid와 setgid)가 실행시킨 결함이 있는 소프트웨어를 통해 주어진 객체로 원하는 어떠한 일을 해도 막아낼 방법이 없으며 보안 정책을 시스템 전체에 걸쳐 시행되도록 할 방법이 없다.

반면에 SELinux하에서 MAC는 모든 주체(subjects - 사용자, 프로그램, 프로세스)와 객체(파일, 디바이스)에 대해서 국부적으로 허가(granular permissions)해 줄 수 있다. 응용프로그램에서 불필요한 부분은 제외하고 오직 필요한 기능에 대해서만 사용 권한을 안전하게 부여하는것이 가능하다.

SELinux는 모든 주체 (사용자, 프로그램, 프로세스) 및 객체 (파일과 장치)에 각각 다른 권한을 부여할 수 있게 해줍니다. 따라서 사용자는 한 응용 프로그램에게 그 프로그램이 제대로 작동하는데 필요한 권한만 안전하게 부여할 수 있다.


2. SELinux 정책이란 무엇인가?

SELinux 정책은 사용자, 프로그램, 프로세스 그리고 이들의 동작 대상인 파일과 디바이스를 포함한 시스템 전체, 즉, 모든 주체와 객체에 대한 접근 허가(access permissions)를 포함한 패키지를 이야기한다. 페도라에서 사용가능한 정책 패키지는 strict , targeted 두가지가 있다.

페도라코어에서 SELinux 정책으로 strict policy 를 적용함으로 인해서 다양한 사용자들이 많은 문제점을 일으킴으로 인해서(일반사용자들이 SELinux를 사용하기 위해서는 수준높은 전문기술이 필요하다) 현재 RHEL4 에서는 보다 완화된 정책패키지 targeted poicy 가 설치시 기본으로 제공된다.

targeted policy는 자주 문제시되는 부분들만 우선적으로 적용시키고, 나머지는 표준 리눅스 보안과 동일하게 운영되도록 적용한 정책이다.

현재, targeted policy 에서는 dhcpd, httpd(apache.te), named, nscd, ntpd, portmap, snmpd, squid 그리고 syslogd 데몬에 대해서 관리한다.
이 데몬들에 대한 정책 파일은 /etc/selinux/targeted/src/policy/domains/program에서 찾을 수 있다.


3. SELinux 설치여부 확인

SELinux 를 사용하고 있는지를 확인하는 방법은 보안문맥을 확인하는 방법으로 알 수 있다.
파일, 사용자, 프로세스등의 문맥을 확인할 때는 -Z 라는 새 옵션을 이용해서 확인할 수 있다.

ls -lZ /etc/selinux

-rw-r--r-- root root system_u:object_r:selinux_config_t config
drwxr-xr-x root root system_u:object_r:selinux_config_t targeted

-Z옵션을 이용해서 보안문맥을 보여주는데 이 결과를 통해서 "system_u" 사용자, "object_r" 역할, "selinux_config_t" 타입을 확인할수 있다. 이런 문맥으로 SELinux의 정책에 비교해서 허용하거나 거부하게 되므로 문맥이 확인가능하다면 SELinux 를 사용중인 것이다.

파일 이외에 프로세스와 사용자에도 각각 아래처럼 보안문맥을 확인할수 있다.

root@example# ps axZ | grep squid

user_u:system_r:squid_t
3912 ? Ss 0:00 squid -D
user_u:system_r:squid_t 3915 ? S 9:10 (squid) -D
user_u:system_r:squid_t 3916 ? Ss 0:01 (unlinkd)

root@example# id

uid=0(root)
gid=0(root)groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel)
context=root:system_r:unconfined_t


RedHat 의 SELinux 패키지 경우에는 sestatus -v 라는 명령을 이용해서 현재 SELinux의 사용상태를 아래와 같이 확인할수 있다.

[root@ns selinux]# sestatus -v
SELinux status: enabled
SELinuxfs mount: /selinux
Current mode: enforcing
Mode from config file: enforcing
Policy version: 18
Policy from config file:targeted
Policy booleans:
allow_ypbind active
dhcpd_disable_trans inactive
httpd_disable_trans active
httpd_enable_cgi active
httpd_enable_homedirs active
httpd_ssi_exec active
httpd_tty_comm inactive
httpd_unified active
mysqld_disable_trans inactive
named_disable_trans active
named_write_master_zonesactive
nscd_disable_trans active
ntpd_disable_trans inactive
portmap_disable_trans inactive
postgresql_disable_transinactive
snmpd_disable_trans inactive
squid_disable_trans inactive
syslogd_disable_trans inactive
winbind_disable_trans inactive
ypbind_disable_trans inactive

Process contexts:
Current context: root:system_r:unconfined_t
Init context: user_u:system_r:unconfined_t
/sbin/mingetty user_u:system_r:unconfined_t
/usr/sbin/sshd user_u:system_r:unconfined_t

File contexts:
Controlling term: root:object_r:devpts_t
/etc/passwd root:object_r:etc_t
/etc/shadow system_u:object_r:shadow_t
/bin/bash system_u:object_r:shell_exec_t
/bin/login system_u:object_r:bin_t
/bin/sh system_u:object_r:bin_t -> system_u:object_r:shell_exec_t
/sbin/agetty system_u:object_r:sbin_t
/sbin/init system_u:object_r:init_exec_t
/sbin/mingetty system_u:object_r:sbin_t
/usr/sbin/sshd system_u:object_r:sbin_t
/lib/libc.so.6 system_u:object_r:lib_t -> system_u:object_r:shlib_t
/lib/ld-linux.so.2 system_u:object_r:lib_t -> system_u:object_r:ld_so_t

4. SELinux 기본설정 - /etc/sysconfig/selinux

배포판마다 서비스 설정방법은 차이가 있다. 필자가 테스트한 레드햇과 페도라 배포판에서는 /etc/sysconfig/selinux 파일에서 SELinux 의 사용가능한 모드를 설정한다.

/etc/sysconfig/selinux 파일의 내용

# 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 - SELinux is fully disabled.
SELINUX=enforcing
# SELINUXTYPE= type of policy in use. Possible values are:
# targeted - Only targeted network daemons are protected.
# strict - Full SELinux protection.
SELINUXTYPE=targeted

이 파일에는 두부분의 설정이 있는데 SELINUX 의 상태(enforcing, permissive, disabled)를 설정하는 부분과 활성화시킬 보안정책(strict 또는 targeted 중 하나)을 결정하는 SELINUXTYPE 이라는 부분이 있다.

disabled - SELinux 보안 제어를 사용하지 않으려면 disalbed 옵션을 선택한다. disalbed 설정은 보안 제어 기능을 끄고 시스템이 보안 정책을 사용하지 않도록 설정한다.

permissive - 이것을 선택하면 서비스 거부 메시지를 통보받을 수 있다. permissive 상태로 설정하면 자료와 프로그램에 이름을 할당한 후 로그를 기록하지만 보안 정책을 사용하지는 않는다. permissive 상태는 SELinux를 처음 접하는 경우 처음부터 이 기능을 완전히 활성화하지 않고 우선 이 정책을 사용해서 일반 시스템 작업시 어떠한 영향을 미치는지 알아보려는 경우 좋은 시작점이 될 수 있다. 그러나 경고 옵션을 선택시 가끔씩 보안경고 대상이 아닌 것을 경고 대상으로 탐지하는 오류(false positive)나 경고 대상인 것을 탐지하지 않는 오류(false negative)가 발생할 가능성도 있으니 주의가 필요하다.

enforcing - SELinux를 완전히 활성화하시려면 enforcing 옵션을 선택하자. enforcing 옵션을 선택하면 추가 시스템 보안을 위해 모든 보안 정책 (예, 허가가 없는 사용자가 특정한 파일이나 프로그램에 접근하는 것을 거부하기)을 사용한다. SELinux가 완전히 실행되어도 아무런 지장을 받지않고 일반적인 시스템 작업을 수행할 수 있다고 자신하시경우 이 옵션을 선택한다.

좋은정보가 되셨다면 아래 한번 클릭해주세요^^


댓글