본문 바로가기
모의해킹 침해대응 과정/Liunx 관리

리눅스 SELinux /day 15

by 알거음슴 2021. 4. 15.

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)

 

방화벽과 연관이 있음으로 포트를 추가 한 경우 방화벽에 포트추가 여부도 함깨 확인이 필요하다.