SELinux의 정책·컨텍스트와 거부 분석
일반 파일 권한이 허용해도 SELinux 정책이 접근을 거부할 수 있습니다. 모드와 컨텍스트, 거부 로그를 연결해 원인을 찾습니다.
개념부터 찾아보기
정의·역할·동작 원리를 독립 페이지에서 확인하세요. 본문의 밑줄 용어에도 설명이 있습니다.
이 노트에서 설명할 수 있게 되는 것
- 프로세스 도메인·파일 타입·요청 동작을 묶어 접근을 설명한다.
- DAC 거부와 SELinux AVC 거부의 차이를 관찰한다.
- 레이블 오류와 필요한 정책 예외를 구분한다.
01주체·객체·동작으로 접근 요청을 모델링하기
- 접근 통제의 대상는 가 어떤 자원에 어떤 동작을 할 수 있는지를 제한한다.
- 웹 서버웹 서버가 파일을 읽는 상황에서 주체는 웹 서버 , 객체는 파일, 동작은 open/read 등이다.
- DAC와 파일 모드 0644가 읽기를 허용해도 정책상 해당 도메인에서 파일 타입을 읽을 수 없으면 거부된다.
- DAC일반적인 DAC 검사에서 먼저 거절된 요청은 까지 도달하지 않아 AVC 거부 로그가 없을 수 있다.
- 방화벽과 통제 범위방화벽은 주로 패킷의 주소·프로토콜·연결 상태를 분류하지만 는 와 자원 사이의 허용 관계를 다룬다.
- 포트의 객체 타입네트워크 포트도 객체가 될 수 있으므로 네트워크 기능과 관련이 없다는 말도 정확하지 않다.
- 파일 접근·포트 같은 포트에 도착한 요청이 허용되더라도 서비스가 비표준 파일을 읽거나 새로운 포트에 하는 행위는 별도 정책 조건을 가진다.
- enforcing·정책enforcing 모드는 정책 위반을 차단하고 기록한다.
- permissivepermissive 모드는 해당 정책 위반을 기록하지만 가 그 접근을 차단하지 않는다.
- disabled·disabled는 가 비활성인 상태이며 permissive와 같지 않다.
Disabled 화면에서 알 수 있는 것과 정책 검증에 필요한 것
방화벽 서비스 상태와 상태를 분리하고, 정책의 허용·거부를 검증할 수 있는 실행 조건을 정한다.
실습 구성과 전제
- 두 화면 모두 getenforce가 Disabled를 반환하는 사례다. 이 상태의 서비스 성공으로 정책의 적절성을 입증할 수는 없다.
- 정책 실습을 재구성할 때에는 가 활성화된 별도 을 사용한다. 방화벽이나 를 끄는 절차를 해결책으로 삼지 않는다.
서로 다른 제어 장치의 상태를 나눈다
- systemctl status 는 방화벽 관리 서비스의 상태다. getenforce는 실행 상태를 보고하므로 두 출력은 독립된 제어 경계다.
- 관리 서비스가 inactive라는 사실만으로 커널의 모든 방화벽 규칙이 없다고 단정할 수 없다. 또한 Disabled는 Permissive와 다르다.
bashgetenforce sestatus systemctl status firewalld --no-pager상태 조회만 수행하는 예시이며 보안 기능을 변경하지 않는다.
원본 크기로 보기 ↗- firewalld는 Loaded disabled와 Active inactive (dead)로 표시된다.
- 그 아래 getenforce 결과는 Disabled로 나타나 방화벽 출력과 별도로 SELinux 상태를 알려 준다.
확인 기준상태를 firewall 서비스 상태로 대신 판단하지 않는다. 이 화면에는 접근 거부 기록이 없다.
Disabled와 Permissive의 증거 차이를 설명한다
- Disabled에서는 정책이 접근을 판정하는 상태가 아니다. Permissive에서는 정책을 로드한 채 거부될 요청을 기록하지만 강제 차단하지 않는다.
- 따라서 두 번째 화면의 Disabled는 첫 화면과 같은 상태 분류를 보일 뿐, 특정 파일의 레이블이나 allow 규칙이 올바르다는 결과는 아니다.
원본 크기로 보기 ↗- getenforce 명령 하나와 Disabled 응답이 보인다.
- 정책 타입, 파일 컨텍스트, AVC 기록은 이 화면에 표시되지 않는다.
확인 기준서비스가 열렸다는 결과만 남기지 말고, Enforcing·Permissive·Disabled 중 어떤 조건에서 시험했는지 기록한다.
활성화된 VM에서는 주체·객체·동작을 묶어 검증한다
- 웹 서버 의 도메인, 요청 파일의 타입, 요구한 read·open 같은 동작을 연결한다. 실패 시 AVC의 scontext·tcontext·tclass·denied 항목을 읽는다.
- 재구성 조회 결과에 레이블 차이가 보이면 영구 파일 컨텍스트 매핑과 실제 레이블을 확인한다. 임의 허용 규칙을 추가하기 전에 경로와 배포판 정책의 의도를 대조한다.
bashps -eZ | grep -E "httpd|nginx" ls -Zd /srv/lab-web ausearch -m AVC -ts recent가 활성화된 별도 실습 에서 컨텍스트와 최근 AVC를 읽는 예시다. 감사 로그 조회에는 권한이 필요할 수 있다.
확인 기준Disabled 환경에서 AVC가 없다는 사실은 허용 규칙의 증명이 아니다. Enforcing 환경의 실제 재현 요청과 시간 범위를 맞춰 확인한다.
실습에서 확인한 동작 원리
- 정책을 검증하려면 정책이 적용되는 모드와 실제 요청을 함께 제시해야 한다.
- 방화벽은 네트워크 경로, 는 와 객체 사이의 허용 동작을 다루므로 상태와 증거를 분리한다.
설정·출력 추가로 확인하기 1장
아래 화면을 펼쳐 위 실습의 설정값, 명령과 확인 기준을 비교해 보세요. 각 묶음은 별도 실습 기록입니다.
실습 화면 묶음 01 1장
원본 크기로 보기 ↗- 문서 문맥에 삽입된 원본 실습·개념 참고 화면이다. SELinux의 정책·컨텍스트와 거부 분석 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
동작·명령 참고 문서
02컨텍스트의 네 필드와 type enforcement
- 컨텍스트의 네 필드전형적인 security context는 user:role:type:level 형식이다.
- 여기서 user는 /etc/passwd의 로그인 사용자 이름과 다른 정책상 식별자다.
- rolerole은 도메인 접근의 역할 관계를, level은 MLS/MCS와 관련된 보안 수준·범주를 나타낸다.
- 주체·객체의 타입일반적인 서버 서비스에서 먼저 보는 중심은 의 domain과 파일의 type이다.
- 이름에 _t가 붙는 것은 타입 명명 관례다.
- 예를 들어 httpd_t 가 httpd_sys_content_t로 표시된 웹 문서를 읽는 관계와, 데이터베이스 전용 파일 타입을 읽으려는 관계는 다르게 취급된다.
- 타입웹 문서를 /var/www에서 /srv/web로 옮기면 Unix 소유권을 그대로 보존했더라도 새 경로의 기본 파일 타입이 적절하지 않을 수 있다.
- 레이블·정책경로 문자열 자체가 모든 권한을 결정하는 것이 아니라 실제 객체의 레이블과 정책 관계가 핵심이다.
ps -eZ
ls -Zd /srv/web
ls -lZ /srv/web
id -Z교육용 설정·명령 예시. 실행 환경과 대상 경로를 가정하며 이 페이지를 만들면서 실행하지 않았다.
03현재 레이블과 영구 경로 매핑을 나누어 설정하기
- ·컨텍스트은 현재 파일의 컨텍스트를 바꾼다.
- 그러나 기본 경로 매핑을 바꾸는 것은 아니므로 restorecon이나 전체 재레이블링 뒤 의도한 변경이 사라질 수 있다.
- 는 경로 패턴에 어떤 기본 타입을 적용할지 정책 매핑을 추가하고, restorecon은 그 매핑을 실제 파일에 적용한다.
- 설정 선언과 객체 상태 반영이라는 두 단계다.
- ·정책아래 예시는 RHEL 계열 정책에서 /srv/web 이하를 읽기용 웹 콘텐츠로 제공하려는 경우다.
- (/.*)?는 디렉터리 자체와 하위 경로를 함께 포함한다.
- 이미 같은 경로 매핑이 있으면 추가 -a 대신 수정 -m이 적합할 수 있다.
- 타입웹 애플리케이션이 쓰는 업로드 디렉터리까지 읽기용 타입 하나로 처리하기보다 필요한 쓰기 범위를 따로 구분한다.
- 최소한의 정책 수정과도한 권한 부여로 경로 오류를 숨기지 않는다.
sudo semanage fcontext -a -t httpd_sys_content_t '/srv/web(/.*)?'
sudo restorecon -Rv /srv/web
matchpathcon /srv/web/index.html
ls -lZ /srv/web/index.html교육용 설정·명령 예시. 실행 환경과 대상 경로를 가정하며 이 페이지를 만들면서 실행하지 않았다.
04boolean과 포트 타입은 이미 설계된 정책의 선택점이다
- ·정책은 정책에 미리 정의된 조건부 기능을 켜고 끄는 장치다.
- httpd_can_network_connect처럼 웹 서비스의 외부 연결 허용과 관계된 선택지는 서비스가 실제로 해야 하는 동작과 맞추어 판단한다.
- 의 영구 반영setsebool의 현재 변경과 -P를 사용한 영구 변경은 재부팅 후 지속 여부가 다르다.
- 이름이 비슷한 을 모두 켜면 최소 접근 범위를 잃게 된다.
- 포트 타입포트 타입 매핑은 특정 / 포트를 어떤 서비스 타입으로 해석할지 연결한다.
- 서비스가 8443 같은 비표준 포트에서 listen할 때 방화벽에서 허용하는 작업과 가 를 허용하는 작업은 다르다.
- 타입semanage port -l은 기존 타입별 목록을 보여 주므로 새 설정을 중복 추가하기 전에 현재 소속을 읽는다.
- 포트 번호 변경포트 번호 변경은 의 실제 listen 설정도 별도로 바꾸어야 한다.
getsebool httpd_can_network_connect
sudo semanage port -l
# 포트 목록의 프로토콜과 타입을 애플리케이션 설정과 비교한다.교육용 설정·명령 예시. 실행 환경과 대상 경로를 가정하며 이 페이지를 만들면서 실행하지 않았다.
05AVC 한 줄을 정책의 문장으로 읽기
- scontext거부 기록에서 scontext는 요청한 주체, tcontext는 대상 객체, tclass는 객체 종류, 중괄호 안의 권한은 거절된 동작을 나타낸다.
- 예를 들어 scontext의 httpd_t, tcontext의 user_home_t, tclass=file, denied { read }가 함께 있으면 웹 서비스가 사용자 홈 타입 파일을 읽으려 했다는 문장으로 바꿀 수 있다.
- 단순히 error라는 라벨만 붙이면 어느 접근 관계가 잘못됐는지 드러나지 않는다.
- Enforcing·PermissiveEnforcing은 정책을 적용하여 거부하고 기록하며 Permissive는 정책상 거부를 관찰하되 차단하지 않는다.
- 정책·permissiveDisabled는 정책을 사용하지 않는 상태여서 permissive와도 다르다.
- 레이블원인을 설명할 때는 잘못된 파일 위치·레이블·서비스 설정을 먼저 교정하고, 정책이 의도적으로 금지한 동작인지 구분한다.
- audit2allow의 한계audit2allow 결과를 무조건 적용하면 공격 시도까지 정상 권한으로 추가할 수 있으므로 기존 정책 의미를 대신하는 자동 승인 도구로 사용하지 않는다.
getenforce
sestatus
sudo ausearch -m AVC,USER_AVC -ts recent
# scontext / tcontext / tclass / denied permission을 함께 읽는다.교육용 설정·명령 예시. 실행 환경과 대상 경로를 가정하며 이 페이지를 만들면서 실행하지 않았다.
06접근 결정·AVC·감사 기록의 관계
- 접근 결정의 입력는 주체 컨텍스트, 객체 컨텍스트, 객체 클래스와 요청 권한을 함께 평가한다. 파일의 read와 디렉터리의 search는 이름이 비슷한 접근이라도 다른 검사다.
- AVC는 Access Vector Cache로 접근 판단을 캐시하는 구조다. 로그에 AVC가 나타난다는 것과 모든 접근이 매번 하나의 새 로그로 기록된다는 것은 다르다.
- 허용과 기록의 분리enforcing의 거부 판단과 감사 기록의 저장은 관련되지만 별도 조건을 갖는다. dontaudit, 감사 데몬·수집 경로, 기록 보존 때문에 거부가 있어도 기대한 위치에서 로그를 못 찾을 수 있다.
- 객체 레이블의 역할경로 매핑은 파일에 붙일 기대 컨텍스트를 정의하고 현재 레이블은 실제 검사 입력이다. fcontext 선언만 추가한 뒤 실제 파일에 적용하지 않으면 두 상태가 다를 수 있다.
- 도메인과 실행 방식같은 UID로 실행해도 서비스 실행 경로와 정책 전환에 따라 도메인이 다를 수 있다. 사용자 이름만 같다고 터미널 테스트와 서비스 테스트를 동등하게 보지 않는다.
07가상 AVC 한 줄에서 요청을 재구성하기
- 가상 관찰값아래는 웹 가 다른 용도의 파일 타입을 읽으려다 거부된 형식 예다. 실제 장비에서 수집한 로그가 아니며 정책의 허용 여부는 사용 중인 배포판에서 달라질 수 있다.
- 주체 복원scontext의 httpd_t는 웹 서비스 도메인이다. comm과 PID는 요청 시점의 식별을 돕지만 경로·도메인·실제 상태와 함께 읽는다.
- 대상과 동작tcontext의 samba_share_t는 대상 파일 타입, tclass=file은 객체 종류, { read }는 거절된 권한이다. 파일의 를 출력한 줄이 아니다.
- 차단 여부permissive=0인 예에서는 의 enforcing 판정이 적용된 상황을 가리킨다. permissive 관찰 로그와 동일하게 성공 요청이라고 처리하지 않는다.
- 수정 방향웹 문서가 잘못된 타입인지, 웹 앱이 원래 읽으면 안 되는 공유 파일을 가리키는지 먼저 구별한다. 필요 없는 요청이면 앱 경로를 고쳐야 하며 타입을 넓히는 것이 답은 아니다.
avc: denied { read } for pid=2400 comm="httpd"
scontext=system_u:system_r:httpd_t:s0
tcontext=system_u:object_r:samba_share_t:s0
tclass=file permissive=0주체·대상·동작 판독을 위한 가상 AVC 필드. 실제 운영 로그가 아니다.
08레이블 오류·boolean·포트 거부의 분기
- 파일 read 거부대상 경로·실제 컨텍스트와 기본 매핑을 비교한다. 읽기 전용 웹 문서와 앱이 써야 하는 업로드 경로는 같은 권한 요구가 아니다.
- 소켓 name_bind 거부서비스가 새 포트를 하지 못하면 tclass=tcp_socket와 name_bind 등 동작을 살핀다. 방화벽은 이미 열린 소켓으로 가는 패킷을 다루므로 거부를 직접 고치지 못한다.
- 외부 연결 거부서비스의 외부 DB·API 연결이 거부된 경우에는 목적과 관련된 정책 ·포트 타입을 검토한다. 파일 fcontext 변경은 이 연결 요구를 대신 표현하지 못한다.
- AVC 없는 실패동일 시각의 DAC·마운트·서비스 오류와 감사 경로를 함께 본다. AVC가 없다는 이유만으로 를 범인으로 확정하거나 완전히 배제하지 않는다.
- 최소 변경의 검증필요한 요청이 성공한 뒤에도 인접한 비허용 경로·쓰기 동작이 계속 제한되는지 비교한다. 전체 정책 해제로 한 요청이 성공한 결과는 최소 권한 해결과 다르다.
09예외를 만들기 전에
- 접근 필요성 판단서비스가 실제로 그 접근을 필요로 하는지 먼저 판단한다.
- 정책·거부 로그 전체를 자동으로 허용 정책으로 바꾸거나 를 영구 해제하면 잘못된 애플리케이션 동작까지 허용할 수 있다.
- 변경 후 재현변경 후에는 필요한 접근이 성공하고 불필요한 접근은 여전히 제한되는지 확인한다.
getenforce
sestatus
ls -Zd .모드와 현재 디렉터리의 컨텍스트를 조회한다. 설치·활성화 상태에 따라 도구가 없을 수 있다.
10웹 서버의 파일 읽기를 정책에 대입하기
- 타입·정책웹 서버 가 문서 파일을 읽는 상황에서는 의 도메인과 파일의 타입, 요청한 읽기 동작이 정책 판단의 핵심이다.
- 도메인·타입 허용 관계파일 소유권과 모드가 읽기를 허용해도 해당 도메인이 대상 타입을 읽도록 허용되지 않았다면 enforcing 환경에서 접근이 거부될 수 있다.
- 이동·복사 후 레이블경로를 옮기거나 다른 곳에서 파일을 복사하면서 기대와 다른 타입이 붙는 경우가 대표적인 진단 대상이다.
- 실제 타입 이름과 기본 경로 규칙은 배포판 정책에서 확인한다.
- AVC·scontextAVC 기록에서 scontext는 요청 주체의 컨텍스트, tcontext는 대상의 컨텍스트를 나타내고 tclass와 요청 권한은 대상 종류와 수행 동작을 해석하는 단서다.
- 동작별 허용 조건같은 파일에 대한 read와 write는 별도 허용 조건일 수 있다.
- 거부된 동작거부된 동작을 그대로 모두 허용하기 전에 그 접근이 서비스 설계에 필요한지 판단한다.
- 정책설정 경로가 잘못되어 비밀 파일에 접근한 경우에는 정책 완화보다 애플리케이션 경로 수정이 올바른 해결이 될 수 있다.
- 파일 읽기 요청httpd_t 도메인의 웹 서버 가 웹 문서를 열고 읽으려 한다. 접근 요청에는 주체의 컨텍스트, 대상 파일의 컨텍스트와 동작이 관계한다.
- 기본 접근 조건 검사경로 탐색과 파일 모드· 등 DAC 조건이 충족돼야 한다. DAC에서 거부된 요청을 의 허용 규칙이 대신 허용해 주지는 않는다.
- 타입과 동작의 정책 평가는 주체 타입과 대상 타입, 객체 클래스, 요청 권한의 관계를 정책에 대입한다. 같은 파일이라도 read와 write는 다른 허용 조건을 가질 수 있다.
- 모드에 따른 결과 반영enforcing에서 정책이 허용하지 않으면 접근을 거부한다. permissive에서는 의 거부 판단을 기록하되 그 판단만으로 접근을 막지는 않는다.
- 읽기 결과 또는 거부 반환필요한 접근 검사를 통과하면 읽기가 진행된다. 거부는 애플리케이션의 접근 오류로 나타나며 AVC 기록을 남길 수 있지만 로깅·억제 규칙에 따라 기록 여부는 달라질 수 있다.
설명과 함께 보는 보조 도식
DAC는 허용하지만 타입 정책은 거부하는 사례
일반 파일 읽기 요청을 설명하는 논리적 조건도이며 커널 내부 호출 순서를 그대로 나타내지 않는다.
주체 확인
프로세스의 실제 컨텍스트를 확인한다.
- 주체
- 서비스 도메인
전체 단계를 한 번에 읽기
- 01
주체 확인
프로세스의 실제 컨텍스트를 확인한다.
- 주체
- 서비스 도메인
- 02
대상 확인
파일 유형·경로·컨텍스트를 확인한다.
- 요청
- 일반 파일 read
- 03
기본 권한과 분리
모드 비트가 허용해도 최종 허용을 의미하지 않는다.
- DAC
- 허용
- 04
정책 판단
대상 타입에 대한 허용 규칙이 없고 enforcing이면 거부된다.
- SELinux
- 거부
- 05
증거 대조
주체·대상·동작과 실제 요청 시각을 연결한다.
- 관찰
- scontext·tcontext·권한
11거부를 재현하고 수정 범위를 좁히기
- 실행 도메인 차이같은 계정의 터미널 테스트와 서비스 요청은 서로 다른 도메인에서 실행될 수 있다.
- 정책터미널에서 파일을 읽었다는 사실만으로 서비스의 정책 문제를 배제하지 않는다.
- AVCAVC 로그가 보이지 않을 때도 감사 설정, 로그 보존, 기록 제한과 일반 권한 단계의 실패를 고려해야 한다.
- permissivepermissive에서 문제가 사라졌다는 관찰은 유력한 단서지만, 어떤 규칙을 어떻게 바꿀지까지 자동으로 결정해 주지는 않는다.
- 레이블표준 경로라면 기대되는 레이블과 실제 레이블을 비교하고, 사용자 정의 경로라면 필요한 영구 파일 컨텍스트 매핑과 복구 절차를 검토한다.
- ·정책으로 붙인 값과 정책의 기본 매핑은 서로 다른 관리 상태다.
- 타입파일 타입이 맞아도 비표준 포트나 특정 네트워크 접근 기능 때문에 정책 조정이 필요할 수 있다.
- 최소 범위 수정 검증변경 뒤에는 필요한 한 동작의 성공뿐 아니라 읽기와 쓰기, 인접 경로의 접근 범위가 의도대로 유지되는지 확인한다.
| 구성·관찰 대상 | 확인하는 정보 | 구분할 문제 |
|---|---|---|
| 주체 | 도메인 | 터미널과 서비스의 차이 |
| 대상 | 파일 타입·포트 타입 | 이동·복사·비표준 경로 |
| AVC | 주체·대상·권한·시각 | 실제 요청과 무관한 로그 |
| 영구 규칙 | 컨텍스트 매핑· | 임시 변경이 재레이블 후 사라짐 |
함께 보는 학습 자료
아래 공식 자료를 본문의 개념·예제와 함께 읽어 보세요. 자료별로 확인할 위치와 관찰할 내용을 적었습니다.
SELinux 구조와 Apache·MariaDB 접근 도해
1.1의 Figure 1.1과 1.4의 설명을 함께 읽는다. 파일 소유 권한이 같아도 도메인과 파일 타입 조합에 따라 결과가 달라지는 사례다.
- httpd_t와 mysqld_t가 각각 접근하는 파일 타입
- DAC가 먼저 거부했을 때 거부 로그가 없는 이유
- enforcing과 permissive의 실제 차단 차이
이해했는지 확인하기
- DAC 권한과 SELinux 정책을 각각 확인한다.
- 거부 로그의 주체·대상·동작을 읽는다.
- 레이블·정책 변경의 영구 적용 여부를 확인한다.