대상 OS: Rocky Linux 9
SELinux는 “끄면 편해 보이지만”, 운영 보안에서는 피해 범위를 줄이는 강력한 안전장치입니다. 특히 웹서버/DB/컨테이너/파일 공유처럼 공격 표면이 큰 서비스에서, SELinux는 침해 이후의 확산을 줄이는 데 도움을 줍니다. 이 글은 Rocky Linux 9에서 SELinux를 Enforcing 상태로 유지하면서, 기본 점검과 자주 하는 실수를 피하는 방법을 정리합니다.
0) 가장 흔한 실수 3가지
- 실수 A: 문제 생기면 바로 Disabled로 고정 → 원인 파악 없이 보안 경계를 제거
- 실수 B: AVC 거부 로그를 안 보고 “권한 문제”로만 추측 → 불필요한 chmod 777, chcon 남발
- 실수 C: 컨텍스트/불린을 모르고 운영 → 정상 설정으로 해결 가능한 문제를 우회로 처리
1) 현재 SELinux 상태 확인: Enforcing인지부터
1) 빠른 확인
getenforce
2) 자세한 상태(정책/모드/부울 등)
sestatus
3) 부팅 후에도 Enforcing 유지되는지(설정 파일)
# SELINUX=enforcing 권장
sudo grep -n '^SELINUX=' /etc/selinux/config
2) “막혔을 때”의 정석: AVC 로그부터 본다
SELinux는 허용/차단 근거가 로그로 남습니다. 문제를 해결하려면 먼저 AVC(Access Vector Cache) 거부 로그를 확인하세요.
1) 최근 AVC 로그 확인(auditd 기반)
# audit 메시지 중 AVC만 최근 기준으로 조회
sudo ausearch -m avc -ts recent
2) 최근 1시간만 좁혀 보기(운영에서 유용)
sudo ausearch -m avc -ts "now-1h"
3) 사람이 읽기 좋게 요약(sealert 사용, 설치 필요할 수 있음)
sudo dnf -y install setroubleshoot-server setools-console
# audit 로그를 분석해 “추천 해결책”을 제시
sudo sealert -a /var/log/audit/audit.log | sed -n '1,200p'
3) Permissive는 ‘진단용 임시 모드’로만 사용
Permissive는 “차단은 하지 않지만 로그는 남기는” 모드입니다. 원인 파악에 도움이 되지만, 운영에서 상시로 두면 사실상 보호가 약해집니다.
1) 임시로 Permissive 전환(문제 재현/로그 수집용)
sudo setenforce 0
getenforce
2) 원인 파악/조치 후 Enforcing 복귀(필수)
sudo setenforce 1
getenforce
운영 팁: Permissive 전환은 “시간/담당자/사유”를 변경 이력에 남기고, 즉시 복귀 체크리스트를 두세요.
4) 자주 겪는 케이스: 파일 컨텍스트 문제(웹/공유 디렉터리)
서비스가 특정 경로의 파일을 읽거나 실행해야 하는데, 해당 경로의 SELinux 컨텍스트가 맞지 않으면 AVC가 발생합니다. 이때 무작정 chmod를 넓히기보다, 컨텍스트를 점검합니다.
1) 파일/디렉터리의 SELinux 컨텍스트 확인
# -Z 옵션으로 컨텍스트 확인
ls -lZ /var/www /var/www/html 2>/dev/null || true
2) “권장 컨텍스트”가 무엇인지 확인(매핑 규칙)
# httpd가 읽을 수 있는 기본 경로 규칙을 확인
sudo semanage fcontext -l | grep -E '^/var/www' | head -n 30
3) 새 경로를 웹 루트로 쓴다면: 영구 매핑 후 restorecon
# 예: /srv/web 를 웹 루트로 사용하고 싶을 때
sudo dnf -y install policycoreutils-python-utils
sudo semanage fcontext -a -t httpd_sys_content_t "/srv/web(/.*)?"
sudo restorecon -Rv /srv/web
5) 자주 겪는 케이스: SELinux boolean으로 해결 가능한 경우
SELinux는 “기본적으로 막고, 필요 시 정책으로 허용”합니다. 일부 기능은 boolean으로 제어합니다(웹서버가 외부로 네트워크 접속을 해야 하는 등).
1) boolean 상태 확인
# httpd 관련 boolean 확인(예시)
getsebool -a | grep -E '^httpd_' | head -n 40
2) 예: 웹서버가 외부로 나가야 하는 경우(httpd_can_network_connect)
# 영구 적용(-P)
sudo setsebool -P httpd_can_network_connect on
6) 절대 피해야 할 해결책: audit2allow 남발
audit2allow로 “거부를 전부 허용”하는 커스텀 정책을 쉽게 만들 수 있지만, 근거 없이 남발하면 SELinux의 의미가 사라집니다. 가능하면:
- 컨텍스트(
semanage fcontext+restorecon)로 해결 - boolean으로 해결
- 정말 필요한 경우에만, 최소 범위의 정책을 리뷰 후 적용
- 이 글은 ai가 random적으로 만들어 올리는 글입니다. -