19장. SELinux 사용
19.1. SELinux 시작하기
SELinux(Security Enhanced Linux)는 추가 시스템 보안 계층을 제공합니다. SELinux는 기본적으로 질문에 대답합니다. <subject>는 <action>에서 <object>?로 실행할 수 있습니다. 예를 들면 다음과 같습니다. 웹 서버가 사용자의 홈 디렉토리에 있는 파일에 액세스할 수 있습니까?
19.1.1. SELinux 소개
DAC(Degretionary Access Control)라고 하는 사용자, 그룹 및 기타 권한을 기반으로 하는 표준 액세스 정책에서는 시스템 관리자가 로그 파일을 볼 수 있도록 특정 애플리케이션을 제한하는 것과 같은 포괄적이고 세분화된 보안 정책을 생성할 수 없습니다. 또한 다른 애플리케이션에서는 로그 파일에 새 데이터를 추가할 수 없습니다.
SELinux(Security Enhanced Linux)는 MAC(강제적 액세스 제어)를 구현합니다. 모든 프로세스 및 시스템 리소스에는 SELinux 컨텍스트 라는 특수 보안 레이블이 있습니다. SELinux 레이블이라고도 하는 SELinux 컨텍스트는 시스템 수준 세부 정보를 추상화하고 엔터티의 보안 속성에 중점을 두는 식별자입니다. 이렇게 하면 SELinux 정책에서 오브젝트를 참조하는 일관된 방법을 제공할 뿐만 아니라 다른 식별 방법에서 볼 수 있는 모호성이 제거됩니다. 예를 들어, 파일은 바인드 마운트를 사용하는 시스템에서 여러 개의 유효한 경로 이름을 가질 수 있습니다.
SELinux 정책은 프로세스가 서로 상호 작용하는 방법과 다양한 시스템 리소스와 상호 작용하는 방법을 정의하는 일련의 규칙에서 이러한 컨텍스트를 사용합니다. 기본적으로 정책은 규칙에서 명시적으로 액세스 권한을 부여하지 않는 한 상호 작용을 허용하지 않습니다.
DAC 규칙 다음에 SELinux 정책 규칙을 확인합니다. DAC 규칙이 먼저 액세스를 거부하면 SELinux 정책 규칙이 사용되지 않습니다. 즉, 기존 DAC 규칙이 액세스를 차단하는 경우 SELinux 거부가 기록되지 않습니다.
SELinux 컨텍스트에는 사용자, 역할, 유형, 보안 수준 등 여러 필드가 있습니다. SELinux 유형 정보는 전체 SELinux 컨텍스트가 아니라 프로세스와 시스템 리소스 간에 허용되는 상호 작용을 정의하는 가장 일반적인 정책 규칙이므로 SELinux 정책과 관련하여 가장 중요한 정보일 수 있습니다. SELinux 유형은 _t
로 끝납니다. 예를 들어 웹 서버의 유형 이름은 httpd_t
입니다. /var/www/html/
에서 일반적으로 발견되는 파일 및 디렉토리의 유형 컨텍스트는 httpd_sys_content_t
입니다. /tmp 및
. 웹 서버 포트의 유형 컨텍스트는 /var/tmp/
에서 일반적으로 발견되는 파일 및 디렉토리에 대한 유형 컨텍스트는 tmp_t
입니다http_port_t
입니다.
Apache(httpd _t로 실행하는 웹 서버 프로세스)가
/var/www/html/
및 기타 웹 서버 디렉터리(httpd_sys_content_t
)에서 일반적으로 발견되는 컨텍스트의 파일 및 디렉터리에 액세스할 수 있도록 허용하는 정책 규칙이 있습니다. /tmp 및
액세스가 허용되지 않습니다. SELinux를 사용하면 Apache가 손상되어 악의적인 스크립트에서 액세스를 제공하더라도 /var/tmp/
에서 일반적으로 발견되는 파일에 대한 정책에 허용 규칙이 없으므로/tmp
디렉토리에 액세스할 수 없습니다.
그림 19.1. SELinux가 안전한 방식으로 Apache 및 MariaDB를 실행하는 데 어떤 도움을 줄 수 있는지의 예는 다음과 같습니다.

이전 체계에서 볼 수 있듯이 SELinux를 사용하면 httpd_t
로 실행되는 Apache 프로세스가 /var/www/html/
디렉터리에 액세스할 수 있으며 httpd_t 및
유형 컨텍스트에 대한 허용 규칙이 없기 때문에 mysqld_db_t
/data/mysql/
디렉터리에 액세스하는 프로세스가 거부됩니다. 반면 mysqld_t
로 실행되는 MariaDB 프로세스는 /data/mysql/
디렉터리에 액세스할 수 있으며 SELinux도 mysqld_t 유형의 프로세스를 올바르게 거부하여
로 레이블이 지정된 httpd_sys_content_t
/var/www/html/
디렉터리에 액세스합니다.
추가 리소스
-
apropos
도움말 페이지 및 도움말 페이지.selinux
명령으로 나열된 SELinux(8) -
selinux-policy-doc
패키지를 설치할 때man -k _selinux
명령으로 나열된 도움말 페이지. - SELinux 컬러링북을 사용하면 SELinux 기본 개념을 더 잘 이해할 수 있습니다.
- SELinux Wiki FAQ
19.1.2. SELinux 실행의 이점
SELinux는 다음과 같은 이점을 제공합니다.
- 모든 프로세스와 파일에 레이블이 지정됩니다. SELinux 정책 규칙은 프로세스가 파일과 상호 작용하는 방법과 프로세스가 서로 상호 작용하는 방식을 정의합니다. 액세스는 특별히 허용하는 SELinux 정책 규칙이 있는 경우에만 허용됩니다.
- SELinux는 세분화된 액세스 제어를 제공합니다. 사용자 재량에 Linux 사용자 및 그룹 ID에 따라 제어되는 기존 UNIX 권한을 벗어나 SELinux 액세스 결정은 SELinux 사용자, 역할, 유형 및 선택적으로 보안 수준과 같은 사용 가능한 모든 정보를 기반으로 합니다.
- SELinux 정책은 관리 방식으로 정의되고 시스템 전체에 적용됩니다.
- SELinux는 권한 에스컬레이션 공격을 완화할 수 있습니다. 프로세스는 도메인에서 실행되므로 서로 분리됩니다. SELinux 정책 규칙은 프로세스가 파일 및 기타 프로세스에 액세스하는 방법을 정의합니다. 프로세스가 손상되면 공격자는 해당 프로세스의 일반 기능에만 액세스할 수 있으며 프로세스가 액세스하도록 구성된 파일에만 액세스할 수 있습니다. 예를 들어 Apache HTTP 서버가 손상되면 공격자는 특정 SELinux 정책 규칙을 추가하거나 이러한 액세스를 허용하도록 구성하지 않은 한 해당 프로세스를 사용하여 사용자 홈 디렉토리의 파일을 읽을 수 없습니다.
- SELinux는 데이터 기밀성과 무결성을 강제 적용할 수 있으며 신뢰할 수 없는 입력에서 프로세스를 보호할 수 있습니다.
SELinux는 안티바이러스 소프트웨어, 보안 암호, 방화벽 또는 기타 보안 시스템을 대체하지 않고 기존 보안 솔루션을 개선하도록 설계되었습니다. SELinux를 실행하는 경우에도 분석하기 어려운 암호 및 방화벽을 사용하여 소프트웨어를 최신 상태로 유지하는 등 모범적인 보안 사례를 계속 따르는 것이 중요합니다.
19.1.3. SELinux 예
다음 예제에서는 SELinux가 보안을 강화하는 방법을 보여줍니다.
- 기본 작업은 deny입니다. 파일을 여는 프로세스와 같이 액세스를 허용하기 위한 SELinux 정책 규칙이 없으면 액세스가 거부됩니다.
-
SELinux는 Linux 사용자를 제한할 수 있습니다. SELinux 정책에는 많은 제한된 SELinux 사용자가 있습니다. 제한된 SELinux 사용자에게 Linux 사용자를 매핑하여 보안 규칙 및 메커니즘을 활용할 수 있습니다. 예를 들어 Linux 사용자를 SELinux
user_u
사용자에게 매핑하면 sudo 및 su와 같은sudo
및su
와 같은 사용자 ID(setuid) 애플리케이션을 설정하지 않으면 Linux 사용자가 실행되지 않습니다. - 프로세스 및 데이터 분리 증가. SELinux 도메인 개념을 사용하면 특정 파일 및 디렉터리에 액세스할 수 있는 프로세스를 정의할 수 있습니다. 예를 들어, SELinux를 실행할 때 공격자는 Samba 서버를 손상시킬 수 없으며 MariaDB 데이터베이스와 같은 다른 프로세스에서 사용하는 파일을 읽고 쓸 수 있는 공격 벡터로 해당 Samba 서버를 사용할 수 없습니다.
-
SELinux를 사용하면 구성 실수로 인한 손상을 완화할 수 있습니다. DNS(Domain Name System) 서버는 영역 전송에서 서로 간에 정보를 복제하는 경우가 많습니다. 공격자는 영역 전송을 사용하여 false 정보로 DNS 서버를 업데이트할 수 있습니다. RHEL에서 DNS 서버로 Berkeley Internet Name Domain(BIND)을 실행하는 경우, 관리자가 영역 전송을 수행할 수 있는 서버를 제한하지 않더라도 기본 SELinux 정책은 영역 파일의 업데이트를 방지합니다. [1] 데몬
이라는
BIND에서 영역 전송을 사용하고 다른 프로세스에 의해 영역 전송을 사용합니다. -
SELinux가 없으면 공격자는 Apache 웹 서버에서 보안 취약점을 해결하고 다음과 같은 특수 요소를 사용하여 파일 시스템에 저장된 파일 및 디렉터리에 액세스할 수 있습니다.
httpd
프로세스가 액세스할 수 없는 파일에 대한 액세스를 거부합니다. SELinux는 이러한 유형의 공격을 완전히 차단할 수는 없지만 효과적으로 완화합니다. -
강제 모드의 SELinux는 비SMAP 플랫폼에서 커널 NULL 포인터 역참조 연산자(CVE-2019-9213)를 악용하지 않습니다. 공격자는
mmap
함수의 취약점을 악용하여 null 페이지의 매핑을 확인하지 않고 이 페이지에 임의의 코드를 배치합니다. -
deny_ptrace
SELinux 부울 및 SELinux 강제 모드의 SELinux는 PTRACE_TRACEME 취약점(CVE-2019-13272)으로부터 시스템을 보호합니다. 이러한 구성으로 인해 공격자가root
권한을 얻을 수 있는 시나리오가 방지됩니다. -
nfs_export_all_rw
및nfs_export_all_ro
SELinux 부울을 사용하면 실수로/home
디렉터리와 같은 NFS(Network File System)의 잘못된 설정을 방지하기 위해 사용하기 쉬운 툴이 제공됩니다.
추가 리소스
- 운영 체제의 보안 약자인 SELinux - 실제 이점 및 예 (Red Hat 지식베이스)
- Ansible을 통한 SELinux 강화 (Red Hat Knowledgebase)
- SELinux 강화를 위한 Ansible 플레이북이 포함된 selinux-playbooks Github 리포지토리
19.1.4. SELinux 아키텍처 및 패키지
SELinux는 Linux 커널에 빌드된 Linux 보안 모듈(LSM)입니다. 커널의 SELinux 하위 시스템은 관리자가 제어하고 부팅 시 로드하는 보안 정책에 의해 구동됩니다. 시스템의 모든 보안 관련 커널 수준 액세스 작업은 SELinux에서 가로채고 로드된 보안 정책 컨텍스트에서 검사합니다. 로드된 정책에서 작업을 허용하면 작업을 계속합니다. 그렇지 않으면 작업이 차단되고 프로세스가 오류를 수신합니다.
액세스 허용 또는 허용하지 않기와 같은 SELinux 결정은 캐시됩니다. 이 캐시를 AVC(액세스 벡터 캐시)라고 합니다. 이러한 캐시된 의사 결정을 사용할 때는 SELinux 정책 규칙을 보다 적게 확인하여 성능이 향상되어야 합니다. DAC 규칙이 먼저 액세스를 거부하면 SELinux 정책 규칙이 적용되지 않습니다. 원시 감사 메시지는 /var/log/audit/audit.log
에 기록되며 type=AVC
문자열로 시작합니다.
RHEL 8에서는 시스템 서비스가 systemd
데몬에 의해 제어됩니다. systemd
는 모든 서비스를 시작하고 중지하며, 사용자와 프로세스는 systemctl
유틸리티를 사용하여 systemd
와 통신합니다. systemd
데몬은 SELinux 정책을 참조하여 호출 프로세스의 레이블과 호출자가 관리하려는 유닛 파일의 레이블을 확인한 다음, 호출자가 액세스할 수 있는지 여부를 SELinux에 요청할 수 있습니다. 이 접근 방식을 통해 시스템 서비스의 시작 및 중지를 비롯한 중요한 시스템 기능에 대한 액세스 제어를 강화합니다.
systemd
데몬은 SELinux 액세스 관리자로도 작동합니다. systemctl
을 실행하는 프로세스 또는 D-Bus
메시지를 systemd
로 보낸 프로세스의 레이블을 검색합니다. 그런 다음 데몬은 프로세스가 구성하려는 유닛 파일의 레이블을 조회합니다. 마지막으로 SELinux 정책에서 프로세스 레이블과 유닛 파일 레이블 간의 특정 액세스를 허용하는 경우 systemd
는 커널에서 정보를 검색할 수 있습니다. 즉, 특정 서비스의 systemd
와 상호 작용해야 하는 손상된 애플리케이션은 이제 SELinux에서 제한할 수 있습니다. 정책 작성자는 이러한 세분화된 제어를 사용하여 관리자를 제한할 수도 있습니다.
프로세스에서 D-Bus
메시지를 다른 프로세스에 전송하고 SELinux 정책에서 이러한 두 프로세스의 D-Bus
통신을 허용하지 않으면 시스템은 USER_AVC
거부 메시지와 D-Bus 통신 시간이 초과됩니다. 두 프로세스 간의 D-Bus 통신은 양방향으로 작동합니다.
잘못된 SELinux 레이블 지정 및 후속 문제를 방지하려면 systemctl start
명령을 사용하여 서비스를 시작해야 합니다.
RHEL 8에서는 SELinux를 사용하기 위한 다음 패키지를 제공합니다.
-
policy:
selinux-policy-targeted
,selinux-policy-mls
-
툴:
policycoreutils
,policycoreutils-gui
,libselinux-utils
,policycoreutils-python-utils
,setools-console
,checkpolicy
19.1.5. SELinux 상태 및 모드
SELinux는 세 가지 모드(강제, 허용 또는 비활성화) 중 하나로 실행될 수 있습니다.
- 강제 모드는 기본 및 권장되는 작업 모드입니다. 강제 모드에서 SELinux는 정상적으로 작동하여 전체 시스템에서 로드된 보안 정책을 적용합니다.
- 허용 모드에서는 SELinux가 개체에 레이블을 지정하고 로그에 액세스 거부 항목을 내보내는 등 로드된 보안 정책을 적용하는 것처럼 동작하지만 실제로는 어떤 작업도 거부하지 않습니다. 프로덕션 시스템에는 권장되지 않지만 허용 모드는 SELinux 정책 개발 및 디버깅에 유용할 수 있습니다.
- 비활성화 모드는 강력하지 않습니다. 시스템이 SELinux 정책을 적용하지 않을 뿐만 아니라 파일과 같은 영구 오브젝트의 레이블을 방지하여 나중에 SELinux를 활성화하기가 어렵습니다.
setenforce
유틸리티를 사용하여 강제 모드와 허용 모드 간에 변경합니다. setenforce
를 사용한 변경 사항은 재부팅 시 유지되지 않습니다. 강제 모드로 변경하려면 Linux root 사용자로 setenforce 1
명령을 입력합니다. 허용 모드로 변경하려면 setenforce 0
명령을 입력합니다. getenforce
유틸리티를 사용하여 현재 SELinux 모드를 확인합니다.
# getenforce
Enforcing
# setenforce 0 # getenforce Permissive
# setenforce 1 # getenforce Enforcing
Red Hat Enterprise Linux에서는 개별 도메인을 허용 모드로 설정할 수 있으며 강제 모드에서 시스템을 실행할 수 있습니다. 예를 들어 httpd_t 도메인을 허용하려면 다음을 수행합니다.
# semanage permissive -a httpd_t
허용 도메인은 시스템의 보안을 손상시킬 수 있는 강력한 도구입니다. 예를 들어 특정 시나리오를 디버깅하는 경우 허용 도메인을 주의해서 사용하는 것이 좋습니다.