SELinux(Security Enhanced Linux)
linux 내 모든 에플리케이션에 프로세스가 접근시 엑세스 제어 규칙에 의해 다른 에플리케이션들에 영향을줄 수 없도록 하는 기능이다.
하나의 프로세스가 시스템에 있는 에플리케이션(파일, 디렉토리, 포트)에 보안레이블로 인해 접근을 할수 있는지 없는지를 결정하는 정책을 정하는데 그 정책의 집합이 SELinux다. 즉 프로세스에게 접근할 수 있는 에플리케이션을 정책으로 지정하는것. 이 정책을 컨텍스트(context)라고 한다.
* 보안장비, 사물인터넷, 공유기 등에 주로 활용됨
SELinux 3가지 모드
Enforcing(적용) : 엑세스 제어(O), 로그기록(O), 일반적인 기본모드
Permissive(허용) : 엑세스 제어(X), 로그기록(O), 규칙위반의 경고만 수집하는 모드
Disabled(비활성화) : 엑세스 제어(X), 로그기록(X), 꺼져있는상태.
변경 순서 : Disabled <--(재부팅)--> Permissive <--(바로적용)--> Enforcing
SELinux 적용 및 확인
1. 확인 및 설정
getenforce 또는 sestatus CMD 들을 통해 설정 여부를 확인. (기본 disabled)
적용을 희망할 시 에는 /etc/selinux/config 파일을 읽어들인 후 직접 변경후 재부팅과정을 진행해야 한다
SELinux 기능 활성화 여부 확인법.
[root@server1 ~]# getenforce
Disabled
[root@server1 ~]# sestatus
SELinux status: disabled
SELinux 기능 활성화
[root@server1 ~]# vi /etc/selinux/config
# This file controls the state of SELinux on the system. #모드 활성화 여부
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=disabled #disabled -> enforcing로 변경
# SELINUXTYPE= can take one of these three values: #제어정책 지정
# targeted - Targeted processes are protected, #모든프로세서를 타겟팅해서 제어
# minimum - Modification of targeted policy. Only selected processes are protected. #특정 프로세스만 제어
# mls - Multi Level Security protection. #제어레벨을 나눠서 제어하게됨 (복잡함)
SELINUXTYPE=targeted
* 변경이후 재부팅 진행. (장시간 소요됨)
SELinux 기능 활성여부 확인
[root@server1 ~]# sestatus
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: enforcing (getenforce CMD)
Mode from config file: enforcing (cat /etc/selinux/config)
Policy MLS status: enabled
Policy deny_unknown status: allowed
Memory protection checking: actual (secure)
Max kernel policy version: 32
2. 모드변경 setenforce
* Disabled <--(재부팅)--> Permissive <--(바로적용)--> Enforcing
setenforce CMD : seliunx 의 활성화 여부를 적용하는 명령어
setenforce 0 : Permissive 상태를 적용
setenforce 1 : Enforcing 상태를 적용
적용 순서
/etc/selinux/config 내용변경 (Permissive or Enforcing)
setenforce CMD 를 작성하여 적용
* 단 disabled <--> Permissive or Enforcing 의 경우는 setenforce를 통해 적용하는것이 아닌 무조건 재부팅이 필요함.
[root@server2 ~]# vi /etc/selinux/config
SELINUX=parmissive #disabled -> permissive 로 변경
[root@server2 ~]# setenforce 0
[root@server2 ~]# getenforce
Permissive
[root@server2 ~]# setenforce 1
[root@server2 ~]# getenforce
Enforcing
SELinux의 핵심기능 3가지.
1. SELinux Context
모든 프로세스와 파일에 레이블이 지정됭 보안정책을 진행한다.
보안정책은 user, role, type, security level 4가지 방법으로 진행할 수 있으나. 모두 적용 시 서버 운영에 있어서 매우 복잡함이 생긴다, 이에 Contexttype : targeted 방식으로 진행하면 type정책만 적용되며 이하 정책은 적용되지 않는다.
* ls -z 옵션으로 context 확인가능.
* 모든 정책 적용 희망 시 mls으로 변경.
[root@server1 ~]# ls -Zd /var/www/html
system_u:object_r:httpd_sys_content_t:s0 /var/www/html
system_u : user (특정 유저 계층만 접근 및 제어)
object_r : role (특정 룰로 접근 및 제어)
httpd_sys_content_t : type (특정 타입만 접근 및 제어)
s0 : security level (보안레벨 지정 후 레벨별관리)
1) Context의 기본 CMD
ls -Z : 파일 및 디렉토리에 적용되어있는 context를 확인
* 모든 파일 및 디렉토리는 상위 디렉토리의 context를 상속받아 지정됨.
[참고] mvCMD와 cpCMD
mv CMD : 파일을 옮기는 작업임으로 기존 context를 유지한 체 이동됨. 이때 원치않는 접근제한이 적용되 프로세스 실행에 문제가 생길 수 있음.
cpCMD : 파일을 새로 생성하는 작업임으로 기존 context 가 아닌 cp 위치의 상위 디렉토리의 context를 상속받아 프로세스 실행에 문제가 없음.
chcon -t : context의 타입을 변경한다.
restorecon : context 타입을 참조파일을 기준으로 적용하라. (-R 의 경우 하위 모든 디렉토리, 파일 포함)
* 참조파일 : /etc/selinux/targeted/contexts/files/* 을 참조하여 원복을 진행한다.
[참고] chcon의 지속성.
chcon으로 변경하더라도 지속성의 유지를 기대할순 없다, 기본적으로 정책은 /etc/selinux/targeted/contexts/files/* 을 참조하여 유지하기 때문에 해당 위치의 값을 바꿔야 영구적인 적용이 가능하다. 이에 사용하는것이 semanage fcontext
라는 CMD 이다.
2) semanage fcontext
해당 CMD 를 활용해야만 context 의 변경여부가 지속성을 갖게 된다. semanage fcontext는 /etc/selinux/targeted/contexts/files/file_contexts.local 파일 내 선언한 값을 저장한다.
저장된 내용은 restorecon CMD 를 활용하여 적용시킬 수 있다.
옵션
-a : 지정한 개체 유형의 기록 추가
-d : 지정한 개체 유형의 기록 삭제
-l : 지정한 개체 유형의 기록 나열
(1) 설정 방법 실습.
[root@server2 ~]# mkdir /virtual
[root@server2 ~]# touch /virtual/file1
[root@server2 ~]#ls -Z /virtual/
unconfined_u:object_r:default_t:s0 file1
[root@server2 ~]# semanage fcontext -a -t httpd_sys_content_t '/virtual(/.*)?'
[root@server2 ~]# cat file_contexts.local
# This file is auto-generated by libsemanage # Do not edit directly. /virtual(/.*)?
system_u:object_r:httpd_sys_content_t:s0
[root@server2 /etc/selinux/targeted/contexts/files]# restorecon -R /virtual
[root@server2 ~]# ls -Z /virtual/
unconfined_u:object_r:httpd_sys_content_t:s0 file1
* context type 이 변경된걸 확인할 수 있다.
[참조] 표현식의 의미
semanage fcontext -a -t httpd_sys_content_t '/virtual(/.*)?'
( ) = 그룹으로 묶음.
? = 그룹핑 된 ( ) 을 0번, 1번 진행
* 즉 /virtual 과 /virtual(/.*) 을 진행
/.* = .은 한글자 이상을 의미 *은 .에 들어갈 수 있는 모든 경우의 수를 의미.
* 즉 '/virtual(/.*)?' 은 /virtual 그리고 /virtual 하위 모든 파일과 디렉토리에 적용하겠다 라는 의미가 된다.
2. SELinux Boolean (semanage boolean)
SELinux 정책의 동작을 변경하는 스위치이다. 예로 httpd 이 읽어드릴 수 있는 디렉토리를 매번 semanage fcontext 를 통해 등록하고 제거하는걸 반복하는건 매우 번거롭다. 이에 boolean 의 기능을 활용하여 일괄적으로 on / off 를 적용하여 보다 간편하게 관리할 수 있다.
1) Boolean 확인 및 설정
getsebool -a : boolean 현재 설정상태 확인.
setsebool : boolean 설정을 진행하는 CMD
on/off : boolean을 키고 끄는 옵션
-P : 현재상태 및 부팅상태 모두 적용하는 옵션
semanage boolean -l : boolean 의 현재 및 부팅시 적용여부 확인 CMD
-C : 상세히 정보 확인.
[root@server2 ~]# getsebool -a | grep httpd_enable_homedirs
httpd_enable_homedirs --> off
[root@server2 ~]# setsebool httpd_enable_homedirs on
[root@server2 ~]# getsebool -a | grep httpd_enable_homedirs
httpd_enable_homedirs --> on
[root@server2 ~]# semanage boolean -l | grep httpd_enable_homedirs
httpd_enable_homedirs (on , off) Allow httpd to enable homedirs
#(on , off) : 첫번째 필드의 on은 현재상태/ 2번쨰 필드의 off 부팅시 상태
[root@server2 ~]# setsebool -P httpd_enable_homedirs on
[root@server2 ~]# semanage boolean -l | grep httpd_enable_homedirs
httpd_enable_homedirs (on , on) Allow httpd to enable homedirs
[root@server2 ~]# setsebool -P httpd_enable_homedirs off
[root@server2 ~]# semanage boolean -l | grep httpd_enable_homedirs
httpd_enable_homedirs (off , off) Allow httpd to enable homedirs
* 설정정보를 정확히 확인하고 boolean을 관리할 수 있어야한다.
[실습] httpd 를 활용하여 실습을 진행해보자.
[참고] SELinux 정책 위반 모니터링.
SELinux 의 오류 메시지는 모두 /var/log/messages 와 /var/log/messages 에 보낸다. 즉 SELinux 에 의해 프로세스 또는 데몬이 정상작동이 되지 않는 경우, 위 내용의 로그들을 분석하여 context, boolean, port의 수정사항을 알맞게 수정해야한다.
* cat /var/log/messages | grep -i 'SELinux is preventing'
* cat /var/log/audit/audit.log | grep -i 'avc: denied'
[root@server2 ~]# cat /var/log/messages | grep preventing
Apr 16 11:43:50 server2 setroubleshoot[4728]: SELinux is preventing /usr/sbin/httpd from getattr access on the file /custom/index.html. For complete SELinux messages run: sealert -l c07f1e68-933d-4d34-bac2-2a1775ab6fbe
[root@server2 ~]# sealert -l c07f1e68-933d-4d34-bac2-2a1775ab6fbe
***** Plugin catchall_labels (83.8 confidence) suggests *******************
If you want to allow httpd to have getattr access on the index.html file Then you need to change the label on /custom/index.html
---- 중략 ----
Additional Information:
Source Context system_u:system_r:httpd_t:s0
Target Context unconfined_u:object_r:default_t:s0
Target Objects /custom/index.html [ file ]
Source httpd
Source Path /usr/sbin/httpd Port <Unknown>
Host server2.example.com
Source RPM Packages
Target RPM Packages
SELinux Policy RPM selinux-policy-targeted-3.14.3-54.el8.noarch
Local Policy RPM selinux-policy-targeted-3.14.3-54.el8.noarch
Selinux Enabled True
Policy Type targeted
Enforcing Mode Enforcing
Host Name server2.example.com
Platform Linux server2.example.com 4.18.0-240.el8.x86_64 #1 SMP Fri Sep 25 19:48:47 UTC 2020 x86_64 x86_64 Alert Count 2 First Seen 2021-04-16 11:43:36 KST Last Seen 2021-04-16 11:43:36 KST Local ID c07f1e68-933d-4d34-bac2-2a1775ab6fbe
Raw Audit Messages type=AVC msg=audit(1618541016.597:169): avc: denied { getattr } for pid=4488 comm="httpd" path="/custom/index.html" dev="dm-0" ino=101819295 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:default_t:s0 tclass=file permissive=0
* 위 정보들을 분석하여 T/S를 진행한다.
3. SELinux port
+ SEliunxs port
httpd 또한 selinux 의 영향을 받아서 기동될 때 제한을 받음. 이것도 역시나 port 변경해도 적용을 받기때문에 그에 따른 수정작업이 필요함.
semanage port -l : 전체 리스트 확인가능.
semanage port -a -t http_port_t -p tcp 82 : 서비스를 위한 포트 번호를 추가해야 하는 경우
semanage port -a -t http_port_t -p tcp 82 : 서비스 포트 변경 하는 경우(ssh port 22 -> ssh port 2222)
방화벽과 연관이 있음으로 포트를 추가 한 경우 방화벽에 포트추가 여부도 함깨 확인이 필요하다.
'모의해킹 침해대응 과정 > Liunx 관리' 카테고리의 다른 글
리눅스 DNS(domain name system) /day 16 (0) | 2021.04.16 |
---|---|
리눅스 방화벽(Firewalld) / day 15 (0) | 2021.04.16 |
리눅스 네트워크 인터페이스 관리 / day 14 (0) | 2021.04.15 |
리눅스 백업&복구 / day 12, 13 (0) | 2021.04.14 |
리눅스 잡 스케줄링 / day 12 (0) | 2021.04.14 |