Linux 시스템 보안 기초 · 03/50편
이 글은
리눅스 시스템 기초·파일 · 권한 · 사용자 관리·서비스 · 프로세스 관리시리즈를 선행 학습으로 두고, 동일한 개념을 보안관제(SOC) 관점에서 한 단계 확장합니다.
리눅스 권한(rwx)만으로는 막지 못하는 공격이 있습니다. 파일 소유자가 마음대로 권한을 열어줄 수 있기 때문입니다. 이 한계를 메우는 것이 MAC(강제적 접근통제), 즉 SELinux와 AppArmor입니다. 이번 편은 두 접근통제 모델의 차이와, SOC가 왜 MAC 로그를 봐야 하는지 정리합니다.
쉽게 말해 DAC는 '집주인이 열쇠를 나눠주는 것', MAC은 '건물 전체에 적용되는 출입 규정'입니다.
접근 요청
│
▼
[ DAC 검사 ] ← 소유자/권한 비트(rwx), ACL
│ 통과
▼
[ MAC 검사 ] ← SELinux/AppArmor 정책 (통과해도 여기서 또 막힐 수 있음)
│ 통과
▼
접근 허용
리눅스에서 접근은 DAC를 먼저 통과한 뒤 MAC을 다시 통과해야 최종 허용됩니다. 즉 두 관문이 직렬로 놓여 있습니다.
SELinux는 모든 주체·객체에 보안 컨텍스트(label) 를 붙이고(예: httpd_t, httpd_sys_content_t), 'httpd_t 프로세스는 httpd_sys_content_t 파일만 읽는다' 같은 정책을 강제합니다. 그래서 웹서버가 침해되어도 정책 밖 파일(예: /etc/shadow)은 SELinux가 차단합니다. AppArmor는 label 대신 경로 기반 프로파일로 같은 목적을 달성합니다.
# --- RHEL/Rocky (SELinux) ---
getenforce # Enforcing / Permissive / Disabled
ls -Z /var/www/html # 파일의 보안 컨텍스트(label) 확인
sudo ausearch -m AVC -ts recent # SELinux 거부(AVC) 로그
# --- Ubuntu/Debian (AppArmor) ---
sudo aa-status # 로드된 프로파일 상태
sudo journalctl -k | grep -i apparmor | tail
SELinux Enforcing 상태에서 웹서버가 정책 밖 파일을 읽으려다 거부되면 다음과 같은 AVC 로그가 남습니다. (예시 출력 — RHEL 계열 기준, 본 실습 컨테이너는 SELinux 미탑재)
type=AVC msg=audit(1758.../0): avc: denied { read } for pid=1234 comm="httpd"
name="shadow" dev="dm-0" ino=... scontext=system_u:system_r:httpd_t:s0
tcontext=system_u:object_r:shadow_t:s0 tclass=file permissive=0
denied { read }, comm="httpd", tcontext=...shadow_t 조합은 '웹서버가 shadow 파일을 읽으려다 SELinux에 막혔다'는 뜻으로, 침해 시도의 강력한 근거입니다.
주의: 관리자가 SELinux를 Permissive나 Disabled로 꺼두는 경우가 많은데, 이는 MAC 관문을 통째로 여는 것이라 SOC 관점에서 위험 신호입니다.
ausearch -m AVC, /var/log/audit/audit.log의 avc: denieddmesg/journalctl -k의 apparmor="DENIED"getenforce가 Disabled면 그 자체가 점검 대상SIEM 규칙에서 AVC denied 급증은 익스플로잇/웹셸 활동의 지표로 씁니다. Wazuh는 SELinux/AppArmor 거부 로그를 룰로 파싱하며, 동일 프로세스에서 짧은 시간 다수 거부가 발생하면 알람을 올립니다. MAC 로그는 '공격이 DAC는 뚫었지만 MAC에서 막힌' 순간을 포착하는 마지막 방어선 겸 탐지원입니다.
[ ] DAC와 MAC의 차이를 한 문장으로 설명한다
[ ] getenforce/aa-status로 현재 모드를 확인한다
[ ] ls -Z로 보안 컨텍스트를 읽어 본다
[ ] AVC denied 로그의 의미를 해석한다
다음 편에서는 04. Linux UID와 GID 보안 를 다룹니다. 모든 권한의 출발점인 UID/GID, 특히 UID 0의 의미를 파고듭니다.
본 실습은 격리된 테스트 VM(Rocky Linux / Ubuntu, VMware) 및 테스트 계정 환경을 기준으로 하며, 운영 서버를 대상으로 하지 않습니다. 실행 결과는 실제 캡처와 예시 출력을 명확히 구분해 표기합니다.