리눅스 SELinux 보안 정책 관리하기 – booleans와 policies 설정
리눅스 SELinux 보안 정책 관리하기 – booleans와 policies 설정
리눅스를 서버로 운영하다 보면 SELinux(Security-Enhanced Linux) 라는 보안 기능을 마주하게 됩니다. SELinux는 커널 수준의 접근 제어를 제공하여 시스템의 잠재적인 보안 위협을 최소화합니다.
이번 포스팅에서는 SELinux의 booleans와 policies 설정 방법을 소개하고, 실제 운영 환경에서 어떻게 적용할 수 있는지 예제를 통해 알아보겠습니다.
SELinux란?
SELinux는 미국 NSA와 Red Hat이 공동 개발한 강제 접근 제어(MAC) 시스템입니다. 기존의 리눅스는 사용자/그룹 기반의 자율 접근 제어(DAC) 방식인데 반해, SELinux는 파일, 프로세스, 포트 등 모든 객체에 대해 정책 기반으로 제어합니다.
SELinux 동작 모드
getenforce
- Enforcing: 정책을 강제 적용 (기본 설정)
- Permissive: 정책 위반은 허용하되 로그로 기록
- Disabled: 비활성화
모드 변경 방법:
setenforce 0 # Permissive
setenforce 1 # Enforcing
영구 설정은 /etc/selinux/config
에서 변경 가능합니다.
SELinux Booleans 설정
Booleans는 일시적으로 SELinux 정책을 토글할 수 있는 스위치입니다. 예를 들어, 아파치가 네트워크로 MySQL에 접근하도록 허용할지 설정할 수 있습니다.
Booleans 목록 확인
getsebool -a
특정 키워드로 검색:
getsebool -a | grep httpd
Booleans 값 변경
# 일시적으로 허용
setsebool httpd_can_network_connect on
# 영구적으로 허용
setsebool -P httpd_can_network_connect on
예제: 아파치 웹서버가 외부 데이터베이스에 접근하려면:
setsebool -P httpd_can_network_connect_db on
SELinux 정책 (Policy) 관리
기본적으로 SELinux는 targeted
정책이 적용되어 있으며, 대부분의 데몬에 대한 정책이 포함되어 있습니다. 그러나 정책을 직접 생성하거나 수정해야 하는 경우도 있습니다.
audit2allow 도구 사용하기
SELinux가 차단한 로그를 분석하여 허용 정책을 자동 생성해주는 도구입니다.
# 로그 보기
ausearch -m avc -ts recent
# 정책 생성
ausearch -m avc -ts recent | audit2allow -M my_custom_policy
# 정책 적용
semodule -i my_custom_policy.pp
정책 모듈 확인 및 삭제
# 설치된 정책 모듈 확인
semodule -l
# 모듈 삭제
semodule -r my_custom_policy
실전 예제: Nginx + PHP-FPM + 외부 Redis 접속
# 1. PHP-FPM이 외부 Redis에 접속하도록
setsebool -P httpd_can_network_connect on
# 2. 여전히 접근이 막힌다면 로그 확인 후 정책 생성
cat /var/log/audit/audit.log | audit2allow -M nginx_redis
semodule -i nginx_redis.pp
마무리
SELinux는 초기에 다소 복잡하게 느껴질 수 있지만, Booleans 설정과 정책 생성 도구를 적절히 활용하면 보안성과 편의성을 모두 확보할 수 있습니다.
운영 중인 시스템에서 SELinux를 무작정 끄기보다는, 필요한 보안 설정만 정확히 조정하는 습관이 중요합니다.
참고 명령 요약
작업 | 명령어 |
---|---|
모드 확인 | getenforce |
모드 변경 | setenforce 0/1 |
Booleans 목록 확인 | getsebool -a |
Booleans 변경 (영구) | setsebool -P [boolean] on/off |
정책 로그 확인 | ausearch -m avc |
정책 생성 및 적용 | audit2allow -M [name] |
정책 제거 | semodule -r [name] |