Linux SELinux란? 강제 접근 제어(MAC)와 보안 정책의 동작 원리 완벽 이해

Linux는 기본적으로 사용자와 파일의 권한을 관리하기 위해 DAC(Discretionary Access Control, 임의 접근 제어) 방식을 사용합니다. 하지만 DAC만으로는 Root 권한을 가진 사용자의 모든 행동을 제한할 수 없기 때문에 보안 측면에서 한계가 있습니다.

이를 보완하기 위해 등장한 것이 SELinux(Security-Enhanced Linux) 입니다.

SELinux는 미국 국가안보국(NSA)이 개발한 Linux 보안 프레임워크로, MAC(Mandatory Access Control, 강제 접근 제어) 방식을 통해 시스템 자원에 대한 접근을 더욱 엄격하게 통제합니다.

이번 글에서는 SELinux의 개념과 동작 원리, 주요 구성 요소, 동작 모드, 확인 및 관리 방법, 그리고 실무 활용 사례까지 자세히 알아보겠습니다.

SELinux란?

SELinux는 프로세스와 파일에 보안 정책을 적용하여 접근을 강제 제어하는 Linux Kernel 보안 기능입니다.

기본 구조는 다음과 같습니다.

Application

↓

SELinux Policy

↓

허용 여부 확인

↓

Kernel

↓

파일 또는 시스템 자원 접근

사용자의 권한뿐만 아니라 정책(Policy) 을 기준으로 접근을 허용하거나 차단합니다.

SELinux가 필요한 이유

기존 Linux 권한 시스템에서는 Root 권한을 가진 사용자가 대부분의 작업을 수행할 수 있습니다.

예를 들어 웹 서버가 해킹당해 Root 권한을 획득했다면 다음과 같은 위험이 발생할 수 있습니다.

  • 시스템 파일 수정
  • 사용자 정보 탈취
  • 중요 서비스 종료
  • 악성 프로그램 설치

SELinux는 이러한 상황에서도 정책에 의해 접근을 제한하여 피해를 최소화합니다.

DAC와 MAC의 차이

Linux에는 두 가지 접근 제어 방식이 존재합니다.

방식설명
DAC파일 소유자와 권한(rwx)에 따라 접근 허용
MAC보안 정책에 따라 접근 허용 여부 결정

DAC는 사용자가 권한을 변경할 수 있지만, MAC은 시스템 정책을 우선 적용합니다.

SELinux의 구성 요소

SELinux는 다음과 같은 요소로 구성됩니다.

요소설명
Subject접근을 시도하는 프로세스
Object접근 대상 파일 또는 자원
Policy접근 허용 규칙
Context보안 레이블

모든 파일과 프로세스는 Security Context를 가지며, 정책은 이 Context를 기준으로 적용됩니다.

Security Context란?

SELinux는 파일과 프로세스에 다음과 같은 형식의 Context를 부여합니다.

system_u:object_r:httpd_sys_content_t:s0

각 항목의 의미는 다음과 같습니다.

항목설명
UserSELinux 사용자
Role역할(Role)
Type보안 유형(Type)
Level보안 수준(Level)

실무에서는 Type이 가장 중요한 요소입니다.

현재 SELinux 상태 확인

SELinux 상태를 확인하려면 다음 명령을 사용합니다.

getenforce

예시

Enforcing

또는

sestatus

출력 예시

SELinux status: enabled

Current mode: enforcing

Policy: targeted

SELinux 동작 모드

SELinux는 세 가지 모드를 제공합니다.

모드설명
Enforcing정책을 적용하고 위반 시 차단
Permissive정책은 적용하지만 차단하지 않고 로그만 기록
DisabledSELinux 비활성화

운영 서버에서는 일반적으로 Enforcing 모드를 사용하는 것이 권장됩니다.

현재 Context 확인

파일의 SELinux Context는 다음 명령으로 확인할 수 있습니다.

ls -Z

예시

-rw-r--r--

system_u:object_r:httpd_sys_content_t:s0

index.html

프로세스 Context 확인

ps -eZ

실행 중인 프로세스의 보안 Context를 확인할 수 있습니다.

SELinux 모드 변경

일시적으로 Permissive 모드로 변경

sudo setenforce 0

Enforcing 모드로 복원

sudo setenforce 1

영구적으로 변경하려면

sudo vi /etc/selinux/config

다음 항목을 수정합니다.

SELINUX=enforcing

또는

SELINUX=permissive

SELinux 로그 확인

SELinux가 차단한 이벤트는 감사 로그(Audit Log)에 기록됩니다.

sudo ausearch -m avc

또는

sudo journalctl | grep AVC

차단 원인을 분석할 때 자주 사용하는 명령입니다.

SELinux 정책 관리

현재 Boolean 목록 확인

getsebool -a

예를 들어 Apache가 네트워크 연결을 허용하도록 설정하려면

sudo setsebool -P httpd_can_network_connect on

Boolean 기능을 이용하면 정책을 수정하지 않고도 일부 동작을 허용할 수 있습니다.

실무에서 자주 사용하는 명령어

SELinux 상태 확인

getenforce

상세 상태 확인

sestatus

파일 Context 확인

ls -Z

프로세스 Context 확인

ps -eZ

Permissive 모드

sudo setenforce 0

Enforcing 모드

sudo setenforce 1

Audit 로그 확인

sudo ausearch -m avc

Boolean 확인

getsebool -a

실무 사례

예를 들어 Apache 웹 서버가 정상적으로 실행 중이지만 특정 디렉터리의 파일을 읽지 못하는 상황을 가정해 보겠습니다.

다음 순서로 점검합니다.

  1. getenforce로 SELinux 활성화 여부 확인
  2. ls -Z로 파일의 Security Context 확인
  3. ausearch -m avc로 차단 로그 확인
  4. 필요한 경우 restorecon으로 Context 복원
  5. Boolean 설정 또는 정책 수정

많은 경우 단순한 파일 권한 문제가 아니라 SELinux 정책 때문에 접근이 차단되는 사례가 발생합니다.

자주 묻는 질문

SELinux와 일반 파일 권한은 어떤 차이가 있나요?

일반 파일 권한은 사용자와 그룹을 기준으로 접근을 제어하는 DAC 방식입니다. 반면 SELinux는 보안 정책과 Security Context를 기준으로 접근을 강제 제어하는 MAC 방식입니다.

SELinux를 비활성화해도 되나요?

테스트 환경에서는 가능하지만 운영 서버에서는 권장되지 않습니다. 비활성화하면 중요한 보안 계층이 사라져 시스템이 공격에 더 취약해질 수 있습니다.

SELinux 때문에 서비스가 동작하지 않을 수도 있나요?

가능합니다. 잘못된 Security Context나 정책으로 인해 접근이 차단될 수 있습니다. 이 경우 SELinux를 끄기보다는 로그를 확인하여 원인을 해결하는 것이 바람직합니다.

마무리

SELinux는 Linux Kernel에서 제공하는 강력한 보안 프레임워크로, 보안 정책을 기반으로 시스템 자원에 대한 접근을 강제 제어합니다. DAC의 한계를 보완하여 Root 권한을 가진 프로세스도 정책에 따라 제한할 수 있으며, 서버 보안을 크게 향상시킬 수 있습니다. getenforce, sestatus, ls -Z, ausearch 등의 명령을 익혀 두면 SELinux 관련 문제를 보다 효과적으로 분석하고 해결할 수 있습니다.

댓글 남기기