root 권한 필요
selinux 의 주요 기본 개념 : Label(보안문맥), policy(정책)
selinux 관점에서 리눅스 시스템은 수많은 객체로 분리되어있다.
(객체 : 모든 파일, 프로세스, 사용자, 소켓, 파이프)
selinux 문맥에서 모든 객체는 특별한 레이블을 가진다.
selinux 정책은 객체에 정의된 레이블을 사용해 객체에 대한 접근을 제어할 수 있는 규칙이다.
최소한의 권한 모델을 따른다. 즉, 모든 객체에 대한 최소한의 기능만 활성화한다는 의미이며 시스템 서비스와 같이 해당 기능만 수행하고 그 이상은 수행하지 않는다.
/var/log/audit/audit.log 에 selinux 의 모든 로그 정보가 저장되며 읽기 편한 에러 메세지는 /var/log/messages 에 저장된다.
#selinux 관련 커맨드 메뉴얼
man -k selinux
# 자주 사용하는 명령어
sestatus
setenforce
semanage fcontext
restorecon
setsebool
sesearch
sealert
Enforcing
permissive
disabled : SELinux 사용하지 않음
sestatus
임시 변경
setenforce [mode]
# 변경된 모드 확인
sestatus
영구 변경
vi /etc/selinux/config
# SELINUX 값 변경
# SELINUX=[mode]
# example SELINUX=enforcing
# vi 종료
yum -y update
# selinux 작업을 위해 기본 툴킷 설치
yum -y install policycoreutils-python
yum install -y setools setools-console setroubleshoot*
# selinux manual 설치.
# 특정 정책, 보안 문맥, SELinux boolean 에 대한 상세한 정보를 얻기위해 반드시 필요.
yum install -y policycoreutils-devel
# 시스템에서 사용 가능한 모든 SELinux 의 보안 문맥 정책에 대한 manual page 를 생성하고
# manual 페이지 데이터베이스를 변경
sepolicy manpage -a -p /usr/share/man/man8; mandb
모든 selinux 객체는 하나의 보안 문맥만 가질 수 있다.
selinux 보안 문맥을 출력하기 위해 표준 리눅스 커맨드라인에서 -Z 옵션 사용
객체의 보안 문맥
파일과 디렉토리 객체는 서로 연관된 객체의 그룹으로 묶기 위해 쓰이고
특정 정책 규칙을 파일과 디렉토리 객체에 정의할 수 있도록 동일하게 보호되거나 취급되어야 한다.
예를 들어 표준 메일 spool 디렉토리( /var/spool/mail) 의 모든 파일을
mail_spool_t 로 할당할 수 있으며 특정 접근을 허용할 수 있는 타입을 사용하는 접근 규칙 정책을 생성한다.
프로세스 문맥에서 타입 값은 도메인이라 불린다. 해당 타입은 프로세스를 격리하기 위해 사용된다.
특정 도메인 이름을 가진 모든 프로세스는 동일 도메인에서 다른 프로세스와 통신하고 상호 작용 할 수 있다. 도메인으로 프로세스를 분리하는 부분은 보안 위험을 크게 줄일 수 있다.
격리된 프로세스가 손상되면 해당 프로세스는 다른 프로세스에 영향을 주지 않고 해당 프로세스에만 영향을 준다.
ps -auxZ 를 실행하면 unconfined_t 라는 도메인으로 실행되는 프로세스를 볼 수 있다.
unconfined_t 레이블로 실행되는 프로세스는 SELinux 정책으로 보호받지 못한다.
즉, 프로세스가 손상되면 selinux 는 시스템 자원과 데이터에 접근 권한을 얻으려는 공격자를 방어할 수 없다.
그리고 보안은 표준 DAC(Discretionary Access Control) 규칙으로
후퇴해서 시스템에서는 유일한 보안 정책이 DAC 규칙이 될 것이며 DAC 규칙만 적용될 것이다.
# 시스템에서 사용할 수 있는 모든 문맥 타입을 출력
seinfo -t
# 모든 객체에 SELinux label 출력 방법(-Z 옵션 사용)
id -Z
ls -Z
ps -auxZ
netstat-tulpenZ
# semanage fcontext manual
man semanage-fcontext
# 시스템에서 파일과 디렉토리에 사용 가능한 모든 보안 문맥 이름을 출력
semanage fcontext -l
# httpd label 만 필터링
semanage fcontext -l | grep httpd
# 보안 문맥 변경
semanage fcontext -a -t [label] [object]
# 파일 시스템에 정책 레이블 동기화
restorecon -v [object]
# 변경된 내용이 제대로 반영됐는지 확인
ls -Z
# 보안 문맥 변경 example
touch /tmp/test.txt
ls -Z /tmp/test.txt
semanage fcontext -a -t httpd_sys_content_t /tmp/text.txt
restorecon -v /tmp/test.txt
# 변경된 내용이 제대로 반영됐는지 확인
ls -Z
# 모든 selinux boolean 정책 출력
semanage boolean -l
# httpd 데몬에만 적용된 모든 selinux boolean 정책 설정 출력
semanage boolean -l | grep httpd
# 특정 정책 활성화
setsebool [selinux boolean] [on 또는 off]
#example
setsebool httpd_can_network_connect on
setsebool httpd_can_network_connect off
# 특정 정책 영구적으로 활성화
setsebool -P [selinux boolean] [on 또는 off]
#example
setsebool -P httpd_can_network_connect on
setsebool -P httpd_can_network_connect off
# 사용할 수 있는 모든 httpd 정책 규칙 조회
sesearch --allow | grep httpd_t
# /var/log/audit/audit.log 를 사람이 읽을 수 있는 최신 로그 파일로 생성
sealert -a /var/log/audit/audit.log