kjh00n의 기록저장소
SELinux 본문
SELinux
● 강제적 접근 제어(MAC)를 포함한 접근 제어 보안 정책을 지원하는 매커니즘을 제공하는 리눅스 커널 보안 모듈
● 모든 주체와 객체에 대한 접근 허가를 기술
● 어떠한 활동을 시스템이 개별 사용자, 프로세스, 데몬에 허용할 것인지를 잠재적으로 제어할 수 있다.
● 시스템 또는 데몬이 버그에 의해 공격당하여 공격자에게 권한이 탈취당할 경우 해당 사용자의 권한이 미치는 모든 파일들에 접근이 가능하여 위험해지게 된다.
● SELinux 적용시 프로그램 사용자가 소유하고 있는 파일이라도 마음대로 접근, 수정이 불가능하게 만들 수 있다.
● 기존 접근 통제 규칙보다 먼저 동작하므로 SELinux의 보안 정책에 맞지 않을 경우 차단
● 보안의 기본 Rule은 Deny All
● 활성화되는 프로세스를 Subject(주체)라고 하며, 주체를 통해 액세스 되는 파일, 소켓, 파이프 또는 네트워크 인터페이스와 같은 리소스를 Object(객체)라고 한다.
이렇게 저장하고 실행하려면 reboot해야 된다.
yum -y install setools-console → setools 모음
yum -y install policycoreutils-python-utils → SELinux의 보안정책을 조회하고 추가/변경/삭제할 수 있는 유틸리티
SELinux
● 특정 파일에 접근하고자 할 때 접근하는 쪽을 주체(Subject) (사용자, 프로그램, 프로세스)
접근당하는 쪽을 객체(Object) (파일, 디렉토리, I/F, 터미널, 시스템 자원, Port)
● SELinux는 모든 주체와 모든 객체에 보안 컨텍스트라는 정보를 부여하여 관리한다.
● 보안 컨텍스트(Security Context) = 보안 레이블 = 보안 태그
● 보안 컨텍스트 : 권한 정보, 등급 정보, 역할 정보 등등 SELinux 정보의 총칭
● 주체든 객체든 보안 컨텍스트가 설정되어 있는데
구조
→ 사용자user : 역할role : 유형(type,domain) : 수준level
사용자user
- 일반 계정(Rocky Linux)과는 별도로 사용되는 SELinux의 계정
- 역할이나 보안레벨과 연계하여 접근 권한을 결정하는 정보
- user 하나는 여러 역할과 연계가 가능하다
- 사용자 정보는 항상 마지막에 _u로 표시된다
일반계정은 root이지만 root로 접속했을 때의 SELinux 계정이름은 unconfined_u이다.
역할role
- SELinux에서 user가 여러 가지 역할을 소유하여 역할 기반 접근 통제를 수행할 수 있도록 해주는 보안 컨텍스트
- 사용자에 따라서 역할이 결정되는데 역할에 따라 접근할 수 있는 유형(type, domain)이 정해진다.
- 일반적으로 마지막에 _r로 표시된다.
↑ 사용자별 역할 조회↑
seinfo -u[사용자명] -x (-u와 사용자명은 붙여서 사용해야 된다.)
유형 (Type / Domain)
● type : 파일, 디렉토리, 인터페이스, 자원 등 객체에 적용되는 보안컨텍스트
(해당 객체에 접근 가능한 주체를 결정짓는 요소)
● domain : 사용자, 프로그램, 프로세스 등 주체에 적용되는 보안컨텍스트
(모든 주체는 특정 domain 안에서 영향을 받고 어떤 접근이 가능한가를 결정짓는 요소)
● 일반적으로 마지막에 _t로 표시된다. (type과 domain 둘다 _t로 표시된다)
● 사용자가 누구냐에 따라 역할이 결정되고 역할이 뭐냐에 따라 유형이 결정된다.
● 사용자는 여러 역할을 가질 수 있고 역할은 여러 type, domain을 가질 수 있다.
가령 특정 파일(객체)에 a_t라는 type이 적용되어있다. 다른 파일에는 b_t 적용, 또다른 파일은 c_t가 적용
특정 프로세스(주체)의 domain은 x_t로 적용되어있다.
해당 domain x_t는 각각의 타입 (a_t, b_t, c_t)에 어떤 접근, 일을 할 수 있는지 각각 전부 설정되어있다.
해당 x_t라는 domain이 a_t type에 어떤 일(읽기, 쓰기, 삭제 등)을 할 수 있는지 설정되어있다.
결국 주체가 어떤 domain을 갖고 있고 객체가 어떤 type을 갖고 있느냐에 따라 접근이 달라진다.
수준(Level)
레벨기반 접근 통제 → 다중 레벨 보호 모드 적용시 사용되는 보안컨텍스트
사용자User | |
ls -Z | 파일의 보안 태그 확인 |
ps -Z | 프로세스의 보안 태그 확인 |
seinfo -u | 전체 SELinux User 조회 |
semanage login -l | 시스템 계정과 SELinux 사용자 매핑 정보 조회 |
역할Role | |
seinfo -r | 전체 Role 조회 |
seinfo -u[사용자명] -x | SELinux User 별 Role 조회 |
유형Type or Domain | |
seinfo -t → | 전체 Type 조회 |
seinfo -r[역할명] -x | SELinux Role 별 Type 조회 |
seinfo -t[유형명] -x | Type 상세 조회 |
파일(객체)에 대한 프로세스(주체)의 접근 정책
setest.html의 보안 태그는 httpd_sys_content_t로 설정되어있다.
setest.html의 보안 태그는 html 디렉토리의 보안 태그에서 상속받아서 설정된다.
html 디렉토리의 보안 태그도 httpd_sys_content_t로 설정되어있다.
httpd의 정책은 httpd_t로 설정되어있다.
[httpd_t(웹 서버)가 httpd_sys_content_t(웹 컨텐츠 파일)에 접근할 수 있는지를 상세하게 출력해달라는 의미이다]
-A 는 허용정책 / -t는 타입 / -s는 도메인
setest.html의 Type을 httpd_sys_content_t에서 admin_home_t로 변경
ls -Z 파일 | 특정 파일의 보안 컨텍스트 확인 |
ls -Zd 디렉터리 | 특정 디렉터리의 보안 컨텍스트 확인 |
ps -eZ | grep 프로세스명 | 특정 프로세스의 보안 컨텍스트 확인 |
sesearch -A -t 타입 -s 도메인 -ds | 특정 도메인과 특정타입의 허용정책 확인 |
chcon -t 바꿀타입 파일경로 | 특정 파일의 타입 변경 |
자동복구 기능
matchpathcon /var/www/html/setest.html
restorecon /var/www/html/setest.html
semanage fcontext -l | grep /var/www
matchpathcon 파일경로 | 자동복구시 변경될 보안 컨텍스트 확인 |
restorecon 파일경로 | 자동복구 |
semanage fcontext -l | grep 파일경로 | 객체별 기본 보안 컨텍스트 |
Port 보안컨텍스트
seinfo --portcon=[Port번호]
seinfo --portcon=포트 | 특정 포트의 보안 컨텍스트 확인 |
seinfo --portcon semanage port -l |
전체 포트의 보안 컨텍스트 확인 보안 컨텍스트 별로 확인 |
semanage port -a -t [포트타입] -p [프로토콜] [포트번호] | 특정 Port 타입에 허용 Port 추가 / Port 삭제는 -a 대신 -d로 |
SELinux LOG
SELinux에서 발생하는 LOG들이 기록되는 파일 ↓
위 사진에 sealert -l c44b7e41-0a0b-40c4-8649-37bbaa5cdbe0가 있는데 아래 사진처럼 치면 해결법이 나온다
/sbin/restorecon -v /var/www/html/setest.html을 입력했더니 알아서 고쳐줘서 접속이 된다
SELinux Boolean
● boolean = 참/거짓으로 분류되는 데이터 Type
● SELinux 정책 작성에 대한 지식 없이 런타임에 SELinux 정책의 일부를 변경할 수 있게 도와주는 프로그램
가령 내가 ftp 기능중에서 익명접속을 SELinux로 차단하고 싶다
SELinux의 설정을 자세하게 바꾸지 못하더라도 특정 기능을 구현, 차단하는 설정을 간단하게 변경하도록 도와주는 기능
그러려면 WAS가 필요함
yum -y install php
systemctl restart httpd
/var/www/html/mail.php 만들기
yum -y install sendmail
systemctl start sendmail
설정을 끄고 싶으면 false로 입력하면 된다~
root계정의 메일함↑
getsebool -a | boolean 기능 전체 확인 |
getsebool [기능명] | boolean 특정 기능 확인 |
setsebool [기능명] true setsebool [기능명]=1 |
boolean 특정 기능 활성화 |
setsebool [기능명] false setsebool [기능명]=0 |
boolean 특정 기능 비활성화 |
'시스템 보안 운영' 카테고리의 다른 글
SELinux 명령어 정리 (0) | 2024.12.20 |
---|---|
접근 통제 모델 (0) | 2024.12.19 |
Beast 실습 (0) | 2024.12.19 |
Malware & RAT (0) | 2024.12.19 |