kjh00n의 기록저장소

SELinux 본문

시스템 보안 운영

SELinux

kjh00n 2024. 12. 20. 11:49

SELinux

● 강제적 접근 제어(MAC)를 포함한 접근 제어 보안 정책을 지원하는 매커니즘을 제공하는 리눅스 커널 보안 모듈

● 모든 주체와 객체에 대한 접근 허가를 기술

● 어떠한 활동을 시스템이 개별 사용자, 프로세스, 데몬에 허용할 것인지를 잠재적으로 제어할 수 있다.

● 시스템 또는 데몬이 버그에 의해 공격당하여 공격자에게 권한이 탈취당할 경우 해당 사용자의 권한이 미치는 모든 파일들에 접근이 가능하여 위험해지게 된다.

● SELinux 적용시 프로그램 사용자가 소유하고 있는 파일이라도 마음대로 접근, 수정이 불가능하게 만들 수 있다.

● 기존 접근 통제 규칙보다 먼저 동작하므로 SELinux의 보안 정책에 맞지 않을 경우 차단

● 보안의 기본 Rule은 Deny All

● 활성화되는 프로세스를 Subject(주체)라고 하며, 주체를 통해 액세스 되는 파일, 소켓, 파이프 또는 네트워크 인터페이스와 같은 리소스를 Object(객체)라고 한다.


/etc/sysconfig/selinux -> disabled로 비활성화된 상태
SELinux 옵션
영구설정

이렇게 저장하고 실행하려면 reboot해야 된다.

setenforce를 사용하면 임시설정이다. / 재부팅하면 적용이 초기화된다
부팅 중 SELinux와 관련된 항목들
SELinux의 상태 확인 1 / sestatus
SELinux의 상태 확인 2 / getenforce


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로 표시된다

seinfo -u (SELinux의 계정정보 확인)
현재 로그인한 계정과 연계된 SELinux 사용자 정보 확인

일반계정은 root이지만 root로 접속했을 때의 SELinux 계정이름은 unconfined_u이다.

역할role

  • SELinux에서 user가 여러 가지 역할을 소유하여 역할 기반 접근 통제를 수행할 수 있도록 해주는 보안 컨텍스트
  • 사용자에 따라서 역할이 결정되는데 역할에 따라 접근할 수 있는 유형(type, domain)이 정해진다.
  • 일반적으로 마지막에 _r로 표시된다.

seinfo -r로 전체 역할 조회
unconfined_u 사용자의 역할을 조회 / system_r과 unconfiend_r 이라는 역할이 부여됨

사용자별 역할 조회↑

seinfo -u[사용자명] -x (-u와 사용자명은 붙여서 사용해야 된다.)

유형 (Type / Domain)

● type : 파일, 디렉토리, 인터페이스, 자원 등 객체에 적용되는 보안컨텍스트

(해당 객체에 접근 가능한 주체를 결정짓는 요소)

● domain : 사용자, 프로그램, 프로세스 등 주체에 적용되는 보안컨텍스트

(모든 주체는 특정 domain 안에서 영향을 받고 어떤 접근이 가능한가를 결정짓는 요소)

● 일반적으로 마지막에 _t로 표시된다. (type과 domain 둘다 _t로 표시된다)

seinfo -t 로 치면 너무 많아서 seinfo -t ❘ less로 확인한다.

● 사용자가 누구냐에 따라 역할이 결정되고 역할이 뭐냐에 따라 유형이 결정된다.

● 사용자는 여러 역할을 가질 수 있고 역할은 여러 type, domain을 가질 수 있다.

특정계정의 역할을 확인 / seinfo -r[역할명] -x

가령 특정 파일(객체)에 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을 갖고 있느냐에 따라 접근이 달라진다.

type 상세 조회 / admin_home_t는 file_type이다
httpd는 domain

수준(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 상세 조회

파일(객체)에 대한 프로세스(주체)의 접근 정책

vim /var/www/html/setest.html
ls -Z /var/www/html/setest.html

setest.html의 보안 태그는 httpd_sys_content_t로 설정되어있다.

setest.html의 보안 태그는 html 디렉토리의 보안 태그에서 상속받아서 설정된다.

html 디렉토리의 보안태그를 확인

html 디렉토리의 보안 태그도 httpd_sys_content_t로 설정되어있다.

ps -ZC httpd (httpd 프로세스의 정책 확인)
httpd의 정책은 httpd_t로 설정되어있다.
sesearch -A -t httpd_sys_content_t -s httpd_t -ds

[httpd_t(웹 서버)가 httpd_sys_content_t(웹 컨텐츠 파일)에 접근할 수 있는지를 상세하게 출력해달라는 의미이다]

-A 는 허용정책 / -t는 타입 / -s는 도메인

chcon -t admin_home_t /var/www/html/setest.html ls -Z /var/www/html/setest.html

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

원래 타입이 나온다. httpd_sys_content_t가 기존 타입

restorecon /var/www/html/setest.html

자동복구시킨 모습

semanage fcontext -l | grep /var/www

사전에 설정된 정책 조회

matchpathcon 파일경로 자동복구시 변경될 보안 컨텍스트 확인
restorecon 파일경로 자동복구
semanage fcontext -l | grep 파일경로 객체별 기본 보안 컨텍스트

Port 보안컨텍스트

tcp 80이 http_port_t로 설정되어있다.

seinfo --portcon=[Port번호]

semanage port -l / 타입들의 Port번호 List를 출력
특정 타입의 Port 번호 확인 / semanage port -l ❘ grep [타입]
/etc/httpd/conf/httpd.conf에서 httpd의 Port 번호를 9000으로 변경
9000으로 활성화
주소뒤에 :9000으로 입력해야함
port를 9001로 변경하였더니 Error가 발생
name_bind 는 httpd_t 프로세스가 http_port_t 포트에 연결할 수 있도록 허용하는 SELinux 규칙으로, bind 는 "이 포트를 사용할 준비를 한다"는 의미입니다.
name_bind가 없음
80,81,443,488,8008,8009,8443,9000만 http_port_t에 등록되어있는 Port이다
8888은 타입에 설정이 되어있지 않음
-a 는 add / -t는 type / 8888이 추가되었다
httpd 재시작도 Error없이 잘된다
8888 Port로 접속이 된 모습

seinfo --portcon=포트  특정 포트의 보안 컨텍스트 확인
seinfo --portcon 
semanage port -l 
전체 포트의 보안 컨텍스트 확인
보안 컨텍스트 별로 확인
semanage port -a -t [포트타입] -p [프로토콜] [포트번호]  특정 Port 타입에 허용 Port 추가 / Port 삭제는 -a 대신 -d로

 

SELinux LOG

 

SELinux에서 발생하는 LOG들이 기록되는 파일 ↓

/var/log/audit/audit.log
type 변경
접속 불가능
/var/log/messages의 Error Log

위 사진에 sealert -l c44b7e41-0a0b-40c4-8649-37bbaa5cdbe0가 있는데 아래 사진처럼 치면 해결법이 나온다

restorecon을 입력하면 고쳐진다~

/sbin/restorecon -v /var/www/html/setest.html을 입력했더니 알아서 고쳐줘서 접속이 된다


 

SELinux Boolean

 

● boolean = 참/거짓으로 분류되는 데이터 Type

● SELinux 정책 작성에 대한 지식 없이 런타임에 SELinux 정책의 일부를 변경할 수 있게 도와주는 프로그램

가령 내가 ftp 기능중에서 익명접속을 SELinux로 차단하고 싶다

SELinux의 설정을 자세하게 바꾸지 못하더라도 특정 기능을 구현, 차단하는 설정을 간단하게 변경하도록 도와주는 기능

getseboll -a는 전체 boolean 정책을 조회한다
semanage boolean -l = 상세한 설명이 포함되어있다
이것을 활성화할거임

그러려면 WAS가 필요함

yum -y install php

systemctl restart httpd

/var/www/html/mail.php 만들기

mail.php 파일 설정

yum -y install sendmail

systemctl start sendmail

메일 자체의 기능에 문제가 있거나 메일은 동작하는데 SELinux가 차단하는 경우
setsebool httpd_can_sendmail true로 설정 실행시키기

설정을 끄고 싶으면 false로 입력하면 된다~

성공
/var/spool/mail/root

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