SELinux (Security Enhanced Linux)

ohyujeong·2023년 12월 21일
1

network

목록 보기
2/8

SELinux (Security Enhanced Linux)

SELinux는 Linux Kernel에 내장된 MAC(Mandatory Access Control) 시스템이다.

MAC 시스템은 시스템 관리자가 설정한 중앙 정책에 따라 주체(사용자, 프로세스 또는 엔터티)가 개체( 파일 , 디렉터리 , 장치 등)에 대해 수행할 수 있는 작업을 제한하고 제어하도록 설계한 시스템이다. 최소 권한을 원칙으로 한다.

이러한 MAC 시스템을 사용하기 때문에 기존 리눅스의 광범위하게 정의된 권한 대신, 특정 리소스에 접근할 수 있는 사용자와 프로세스를 세세하게 정의할 수 있다. 이는 Security Policy(보안정책)을 수립하여 이루어진다.

대부분의 Linux 배포판에서 사용할 수는 있지만 주로 RedHat 계열 Linux에서 사용된다. 실습을 주로 하던 Ubuntu에서 사용해보려고 설치했으나 재부팅 후 VM이 돌아가지 않아서..😅 RedHat 계열의 Rocky를 사용했다.
참고로 Ubuntu에 SELinux를 설치하는 것은 아래 링크를 참고했다.
https://www.makeuseof.com/how-to-install-configure-selinux-on-ubuntu/

SELinux 작동 절차

SELinux 작동 절차는 다음과 같다. 예를 들어 어떤 프로세스가 파일에 접근하려고 시도할 때 아래와 같은 절차를 거쳐 접근이 제어된다.

맨 처음으로 SELinux의 Status가 활성화(enabled)인지 비활성화(disabled)인지 확인한다.
활성화되어있다면 프로세스가 파일에 접근을 시도한 이력을 지정된 Log 파일에 작성하고,
그 후 SELinux의 ModeSecurity policy가 어떤 것인지에 따라 파일에 대한 접근을 허가하거나 불허한다.

SELinux의 Status, Mode, Security policy에 대해 자세히 알아보자.

Status

다음과 같은 명령어로 현재 SELinux Status를 확인한다.

sestatus

SELinux가 활성화되어 있는 것을 확인할 수 있다.

Mode

SELinux는 다음과 같이 3가지 모드로 동작한다.

  • Enforcing : SELinux가 활성화되고 보안 정책이 적용된다.
  • Permissive : SELinux가 활성화되지만 기록을 할 뿐, 보안 정책이 적용되지 않는다.
  • Disabled : SELinux가 비활성화된다.

Log

EnforcingPermissive Mode에서는 시스템의 주체(예: 사용자, 프로세스)가 객체(예: 파일, 디렉토리)에 접근하고, 어떤 Security Policy가 적용되었는지 그 내역들을 /var/log/audit/audit.log 파일에 기록한다. 다음과 같은 형식의 Log가 기록되어 있다.

Mode 확인/변경 명령어

getenforce

현재 런타임에서 설정된 Mode를 확인할 수 있다. 간단하게 현재 설정된 Mode가 출력된다. 다음과 같이 사용한다.

getenforce

출력 예:
Permissive

sestatus

종합적인 SELinux 상태 정보를 확인할 수 있다. 다음과 같이 사용한다.

sestatus


Current mode (현재 설정된 Mode)와 Mode from config file (설정 파일에 정의된 Mode)를 모두 확인할 수 있다.

setenforce

Permissive (0), Enforcing (1) Mode로 변경할 수 있다. 다음과 같이 사용한다.

# Permissive 로 설정
setenforce 0

# Enforcing 로 설정
setenforce 1

단, 이 명령어로는 현재 Mode만 변경할 수 있다. 기본 설정값을 변경하려면 SELinux 설정 파일을 수정해야 한다.

SELinux 설정 파일

SELinux는 실행 중인 세션에서 활성화(Enforcing 또는 Permissive) Mode와 비활성화(Disabled) Mode 간 전환이 되지 않는다. Mode를 전환하려면 /etc/sysconfig/selinux 설정 파일에서 SELINUX 값을 원하는 Mode 값으로 변경해주고 시스템을 다시 시작해야 한다. 다음과 같은 형식을 가지고 있다.

시스템 부팅 시 이 설정 파일을 참고하여 SELinux의 Mode를 설정한다. 활성화 Mode로 설정되었을 경우 Linux는 SELinux에 필요한 라이브러리를 로드하지만 비활성화 되었을 경우 로드하지 않는다. 이렇게 동작하기 때문에 실행 중인 세션에서는 Mode를 변경할 수 없다.

Security Policy (Policy)

Security Policy는 어떤 프로세스가 어떤 파일, 디렉터리 및 포트에 액세스할 수 있는지 정의하는 규칙 집합이다. 기본적으로 모든 사용자와 어플리케이션의 작업을 제한하고(최소 권한 원칙) 거기에 필요한 설정을 추가하는 방식이다.

  • Linux 배포판은 기본적으로 SELinux Policy를 포함하고 있다. 일반적인 사용 사례를 기반으로 하여 사전에 구성되어 제공되고, 필요에 따라 해당 Policy를 커스텀하거나 새로 생성할 수 있다.

  • Policy파일은 /etc/selinux/targeted/policy/policy.33 경로에 있다. Binary 파일로 되어있어 내용을 확인할 수는 없다.

  • SELinux는 Security Policy를 적용할 때 가장 먼저 AVC(Access Vector Cache)에서 이전에 같은 요청에 대한 결과를 확인하고, 없다면 Security Policy를 참조한다. 다음 그림과 같이 진행된다.

Label(Context)

SELinux는 각 파일에 Label을 할당한다(Context라는 명칭으로도 불린다). 이 Label은 Security Policy가 접근 제어 Policy를 적용하는데 사용된다. 다음과 같이 ls 명령어에 label을 확인하는 -Z 옵션을 추가하여 파일의 Label을 확인할 수 있다.

# -Z 옵션과 -l(long) 결합
ls -Zl

왼쪽에서부터 5번째에 있는 컬럼 값이 파일의 Label이다. 4가지의 Label들이 : 으로 결합되어 표현된다. 다음 그림과 같이 구성된다.

User : SELinux 사용자를 의미한다.
- SELinux 사용자는 Policy에 정의되어 있고 따로 쉘에서 명령어로 생성할 수는 없다.
- 각 Linux 사용자 계정은 SELinux 사용자 계정과 매핑되고, Policy파일에 이 매핑이 정의되어 있다.

Role : SELinux Policy에 따라 사용자가 수행할 수 있는 역할을 나타낸다.
Type : 어떤 유형의 객체인지를 정의한다. Type Enforcement가 적용된다.

Type Enforcement란 주체(프로세스)가 객체(파일)에 접근을 시도할 때마다 해당 접근이 Policy에 의해 허용되는지 결정하는 것이다.
예) Policy프로세스의 Type이 httpd_t 일 경우 Type이 httpd_sys_content_t인 파일에 접근이 가능하다고 설정되어 있다면, Policy에 의해 Type이 httpd_t 인 웹 프로세스는 Type이 user_home_t 인 파일에 접근할 수 없다.

Level : 보안 레벨을 나타낸다. SELinux Policy 유형이 MLS 모드로 설정된 경우에만 사용되고 일반 서버에서는 거의 사용되지 않는다.

Label(Context) 변경 명령어

chconseamanage 명령어로 파일의 Label을 변경할 수 있다.

chcon

다음과 같은 형식으로 사용한다.

chcon [options] <label> <filename>

옵션은 다음과 같다.

Option설명
-R재귀적으로 적용한다.
-v대략적인 결과를 출력한다.
-uUser label을 세팅한다.
-rRole label을 세팅한다.
-tType label을 세팅한다.

예시로 -t 옵션을 사용하여 test2.html 파일의 Type을 user_home_t 에서 admin_home_t 로 변경해보자.

# Type 변경
chcon -t admin_home_t test2.html

# 변경확인
ls -LZ test2.html
-> -rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 test2.html

하지만 이렇게 chcon 명령어로 Type을 변경한다면 SELinux Policy 자체를 변경한 것이 아니고 리눅스 파일 시스템 단에서 변경한 것이다. restorecon 명령어에 의해 relabel 되거나 원래 policy를 적용하게 되면 다시 원 상태로 복귀될 수 있다.

restorecon

SELinux Policy에는 파일시스템의 각 경로에 대해 지정된 Type이 설정되어 있다.

예를 들어
/var/www/html 경로에 있는 파일들은 httpd_sys_content_t Type을 가진다.
/home/username 경로에 있는 파일들은 user_home_t Type을 가진다.

restorecon 명령어는 이 Policy에 의해 지정된 Label을 파일에 적용하기 위해 사용된다.

다음은 위에서 chcon 명령어로 변경한 /home/username 경로에 있는 test2.html 파일의 Type을 Policy에 의해 지정된 Type인 user_home_t 로 돌리는 예시이다.

restorecon test2.html

seamanage

chcon 명령어와 달리 seamanage 명령어는 SELinux Policy를 업데이트한다. 앞서 설명한 것처럼 SELinux Policy는 시스템이 시작하면서 파일시스템이 적용되므로 seamanage 명령어를 통해 변경한 사항들은 시스템을 재부팅해야 적용된다.
다음과 같은 옵션을 가지고 있다.

Option설명
fcontext파일/디렉토리의 label을 수정할 것을 알린다.
-a새로운 Policy를 추가할 것을 알린다.
-tType label을 세팅한다.
-R재귀적으로 적용한다.

다음은 지정한 경로 /lab/typetest 의 하위 모든 파일/디렉토리의 Type label을 httpd_sys_content_t 로 적용하기 위한 새 Policy를 추가하는 명령어 예시이다.
대상 파일/디렉토리를 지정할 때 정규식 사용이 가능하다.

semanage fcontext -a –t httpd_sys_content_t   “/lab/typetest(/.*)?”

참고

https://www.computernetworkingnotes.com/linux-tutorials/selinux-explained-with-examples-in-easy-language.html
https://medium.com/thesystemadmin/selinux-part-2-creating-custom-policy-fdc6ed90e36
https://it-serial.tistory.com/entry/Linux-SELinux-%EA%B0%9C%EB%85%90-%EA%B4%80%EB%A0%A8-%EB%AA%85%EB%A0%B9%EC%96%B4
https://phoenixnap.com/kb/selinux
https://www.makeuseof.com/how-to-install-configure-selinux-on-ubuntu/
https://www.tecmint.com/install-gui-desktop-rocky-linux-9/

profile
거친 돌이 다듬어져 조각이 되듯

0개의 댓글