리눅스/개념

[LINUX] Selinux - 1

ㅎㄷㄹㅁㅇ 2026. 6. 24. 13:05
반응형

SELinux 및 AppArmor 보안 정책 관리

1. SELinux란 무엇인가?

SELinux(Security-Enhanced Linux)는 리눅스 커널에 내장된 강력한 보안 아키텍처로, 미국 NSA와 오픈소스 커뮤니티가 협력해 개발했습니다. SELinux의 가장 큰 특징은 MAC(Mandatory Access Control, 강제 접근 제어) 기반의 보안 정책을 제공한다는 점입니다. 기존 리눅스의 DAC(Discretionary Access Control, 임의 접근 제어) 모델은 파일 소유자나 root 권한자가 모든 권한을 가질 수 있지만, SELinux는 시스템 전체의 정책에 따라 프로세스와 사용자, 파일, 포트 등 모든 객체의 접근을 세밀하게 제어합니다.
SELinux의 목적은 서비스나 애플리케이션이 취약점이나 오작동, 악성코드로 인해 시스템 전체를 위협하지 못하도록 "최소 권한 원칙"을 철저하게 적용하는 데 있습니다.

 

SELinux의 주요 기능

  • 시스템의 모든 객체(파일, 프로세스, 포트 등)에 보안 컨텍스트(레이블)를 부여
  • 정책에 따라 객체 간 접근을 세밀하게 통제
  • 정책 위반 시 로그 기록 및 차단
  • 서비스별, 사용자별로 독립적인 보안 정책 적용

 

2. SELinux 모드(Enforcing, Permissive, Disabled)

SELinux는 세 가지 동작 모드를 가집니다.

  • Enforcing: 정책을 강제 적용. 위반 시 접근 차단 및 로그 기록(실서비스 권장)
  • Permissive: 정책 위반 시 차단하지 않고 로그만 기록(문제 해결, 정책 테스트용)
  • Disabled: 완전 비활성화(보안 취약, 되도록 사용하지 않음)

 

모드 확인 및 변경

1. 현재 상태 확인

  • 명령어: getenforce
  • 현재 시스템에 적용된 SELinux 모드(Enforcing, Permissive 등)를 화면에 출력합니다.

 

2. 일시적 모드 변경 (즉시 적용)
명령어를 입력한 즉시 상태가 변경되지만, 시스템을 재부팅하면 원래 설정으로 되돌아갑니다.

  • Permissive 모드로 변경: setenforce 0
  • 보안 정책을 강제하지 않고, 위반 사항을 로그로만 남깁니다. (주로 에러 원인 파악 및 테스트 시 사용)
  • Enforcing 모드로 변경: setenforce 1
  • SELinux 보안 정책을 다시 엄격하게 적용하고 위반 사항을 차단합니다.

 

3. 영구적 모드 변경 (재부팅 후 적용)
설정 파일을 직접 수정하여 재부팅 후에도 변경된 모드가 계속 유지되도록 합니다.

  • 설정 파일 편집: vi /etc/selinux/config
  • 설정값 변경: 파일 내 SELINUX= 항목을 찾아 다음 세 가지 중 하나로 수정합니다.
  • SELINUX=enforcing (보안 정책 강제 적용)
  • SELINUX=permissive (정책 위반 시 로그만 기록)
  • SELINUX=disabled (SELinux 기능 비활성화)

 

운영 환경에서는 반드시 Enforcing 모드를 유지하는 것이 좋습니다.

 

 

3. SELinux 로그 분석 및 문제 해결

SELinux는 정책 위반 시 /var/log/messages 또는 /var/log/audit/audit.logavc: denied 메시지를 기록합니다.
이 로그는 다음과 같은 정보를 담습니다.

  • denied 유형: 허용되지 않은 작업(read, write, execute 등)
  • 소스 도메인(scontext): 접근 시도 프로세스의 SELinux 도메인
  • 타겟 객체(tcontext): 접근 대상 파일/디렉터리/포트의 컨텍스트
  • tclass: 객체 유형(file, dir, socket 등)
  • permissive 값: 0(Enforcing), 1(Permissive)

로그 예시

text

avc: denied { write } for pid=5678 comm="custom_daemon" path="/data/myfile" scontext=u:r:custom_daemon:s0 tcontext=u:object_r:system_data_file:s0 tclass=file permissive=0

 

이 로그는 custom_daemon 프로세스가 /data/myfile에 write 권한이 없어서 차단된 상황을 보여줍니다.

 

문제 해결 절차

  1. Permissive 모드로 전환하여 문제 재현 및 로그 수집
  2. avc: denied 로그에서 scontext, tcontext, tclass, denied 작업 분석
  3. 필요한 경우 정책 추가(semanage, audit2allow 등 활용)
  4. 테스트 후 Enforcing 모드로 복귀

 

4. SELinux 컨텍스트 변경(chcon, restorecon 등)

SELinux는 파일, 디렉터리, 프로세스 등에 보안 컨텍스트(user:role:type:level)를 부여합니다.
서비스가 정상 동작하려면 해당 객체의 컨텍스트가 정책에 맞아야 합니다.

 

컨텍스트 임시 변경: chcon

bash

chcon -t httpd_sys_content_t /web/index.html chcon -R -t httpd_sys_content_t /web

  • -t: type(유형) 지정
  • -R: 하위 디렉터리/파일까지 재귀 적용

 

컨텍스트 영구 변경: semanage fcontext + restorecon

bash

semanage fcontext -a -t httpd_sys_content_t "/web(/.*)?" restorecon -R -v /web

  • semanage로 파일/디렉터리 패턴에 type 지정(정책 DB에 등록)
  • restorecon으로 실제 파일에 정책 적용 및 컨텍스트 일괄 수정
  • 웹서버, DB 등 경로 변경 시 반드시 컨텍스트를 맞춰줘야 서비스가 정상 동작합니다.

 

5. AppArmor와 SELinux의 차이점 및 이해

AppArmor와 SELinux 모두 MAC 기반의 리눅스 보안 모듈이지만, 접근 제어 방식과 정책 관리 방식에 차이가 있습니다.

구분 SELinux AppArmor
접근 제어 레이블(컨텍스트) 기반 경로(Path) 기반
정책 적용 시스템 전체, 세밀한 적용 애플리케이션별, 단순 적용
정책 관리 복잡, 유연, 강력 단순, 직관적
기본 배포판 RHEL, CentOS, Fedora Ubuntu, SUSE, Debian 계열
성능 약간의 오버헤드, 대규모 최적 경량, 소규모에 적합
학습 곡선 높음 낮음
  • SELinux는 대규모, 고보안 환경에 적합하며, 세밀한 정책과 역할 기반 제어가 가능합니다.
  • AppArmor는 경로 기반으로 직관적이고, 정책 작성이 쉬워 소규모, 데스크탑 환경에 적합합니다.

 

RHEL8/9에서는 SELinux가 기본이며, AppArmor는 지원하지 않습니다. 단, Ubuntu/SUSE 등 타 배포판 환경을 이해할 필요가 있다면 AppArmor의 정책 구조와 관리법도 익혀두는 것이 좋습니다.

 


결론 및 실무 팁

  • SELinux는 리눅스 서버의 최후의 보루입니다. 서비스 장애가 발생하면 컨텍스트와 정책을 먼저 점검하세요.
  • Enforcing 모드 유지가 원칙이며, Permissive는 문제 진단용으로만 사용하세요.
  • 컨텍스트 변경은 임시(chcon)와 영구(semanage fcontext+restorecon) 방식을 구분하세요.
  • 로그 분석(audit.log, avc: denied)은 SELinux 트러블슈팅의 핵심입니다.
  • AppArmor는 SELinux에 비해 단순하지만, 대규모 환경에서는 SELinux의 세밀함이 더 큰 장점입니다.
반응형
TOP