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.log에 avc: 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 권한이 없어서 차단된 상황을 보여줍니다.
문제 해결 절차
- Permissive 모드로 전환하여 문제 재현 및 로그 수집
- avc: denied 로그에서 scontext, tcontext, tclass, denied 작업 분석
- 필요한 경우 정책 추가(semanage, audit2allow 등 활용)
- 테스트 후 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의 세밀함이 더 큰 장점입니다.
'리눅스 > 개념' 카테고리의 다른 글
| [LINUX] iscsi.service vs iscsid.service (0) | 2024.08.28 |
|---|---|
| [LINUX]특수 권한 및 파일 설정 (1) | 2023.12.07 |
| [LINUX]라우팅 매트릭 및 최적 경로 (3) | 2023.11.18 |
| [오픈스택] TripleO란? (0) | 2023.03.10 |
| [LINUX] ANSIBLE (앤서블)이란? (0) | 2022.02.27 |