Published 2022. 8. 9. 17:09

(Week 5 -Day 1) - (1/2)

SELinux

- Security Enhanced Linux

- 강제 접근 제어 모델인 MAC모델을 사용하여 시스템의 보안을 강화하는 니룩스 커널 모듈


접근 제어 모델

- Access Control Model

- 주체(Subject) : 시스템의 리소스에 접근할 수 있는 프로세스, 사용자

- 객체(Object) : 파일 또는 포트 등과 같은 시스템의 리소스

DAC

- Discretionary Access Control

- 사용자가 임의로 객체에게 권한을 부여하여 객체에 대한 접근을 제어하는 임의 접근 제어 모델

- 주체는 객체에 대한 권한만 설정되어 있다면 접근할 수 있다.

- Unix/Linux 시스템에서 기본적으로 사용하는 모델이다.

MAC

- Mandatory Access Control

- 강제 접근 제어 모델

- 주체와 객체에 각각 부여된 보안 레이블과 정책 스위치에 의해 접근을 제어하는 접근 제어 모델

- 주체가 객체에 접근할 때 먼저 객체에 접근할 수 있는 권한이 있는지 확인 후 보안 레이블을 확인함.

- 보안 레이블에 의해 거부된 접근은 정책 허용 스위치에 의해서 허용될 수 있음.

- SELinux를 사용하는 경우 시스템에 적용되는 접근 제어 모델

RBAC

- Role Based Access Control

- 역할 기반의 접근 제어 모델

- 역할 : 다수의 권한을 묶어 놓은 그룹

- 관리자는 이 역할을 사용자에게 부여함으로써 권한을 제어


SELinux 설정 파일

- 경로 : /etc/selinux/config

vim /etc/selinux/config

/etc/selinux/config

SELINUX : 동작 모드 지정

SELINUXTYPE :정책 유형 지정

targeted : 특정 대상 프로세스만 보호(기본 설정)

minimum : 최소한의 프로세스만 보호(targeted 변형)

mls : Multi-Level Security (기본 설정 +민감도)


SELinux 모드

Disabled 모드

- SELinux 커널 모듈을 메모리에 로드하지 않기 때문에 SELinux가 완전 비활성화 되어있는 상태

- DAC 모델 사용

- 프로세스가 파일에 접근할 때 파일에 부여된 권한을 기준으로 접근을 제어

Enforcing 모드

- SELinux 커널 모듈을 메묄에 로드(SELinux 활성화 & SELinux 정책을 강제함)

- MAC 모델 사용

- 프로세스가 파일에 접근할 때 권한과 컨텍스트, 부울 등을 확인하고 필요시 차단

Permissive 모드

- SELinux 커널 모듈을 메모리에 로드(SELinux 활성화 but, SELinux 정책을 강제하지 않음)

- DAC 모델 사용

- 프로세스가 파일에 접근할 때 권한과 컨텍스트, 부울 등을 확인하지만 차단을 강제하지 않고 메시지만 로그에 기록

(Enforcing 모드로 전환하기 전에 문제 해결용도로 사용하기 적당함)

 

재부팅시 적용 가능함


SELinux 보안 컨텍스트

SELinux가 활성화되어 있는 시스템에는 모든 프로세스와 파일에 컨텍스트가 부여된다.

보안 컨텍스트 확인

ps axZ
ls -lZ
#(-Z : 프로세스와 파일에 지정된 컨텍스트 확인)

컨텍스트 구조

SELINUX_USER : SELINUX_ROLE : SELINUX_TYPE : SELINUX_LEVEL

사용자 : 역할 : 유형 : 레벨

주로 타입을 비교하게 된다.

SELinux 보안 컨텍스트 관련 명령어

Chcon

- SELinux 보안 컨텍스트 임시 설정

# SELinux 보안 컨텍스트 임시 설정
chcon [OPTION] FILE

# SELinux Type 컨텍스트 임시 설정
chcon -t SELINUX_TYPE FILE

Semanage fcontext

- 시스템에 등록된 보안레이블을 참고하여 컨텍스트를 자동으로 변경

# SELinux Type Context 임시 설정
chcon -t SELINUX_TYPE_CONTEXT  FILE

# SELinux 파일 보안 컨텍스트 정책 영구 설정
semanage fcontext -a -t SELINUX_TYPE_CONTEXT  FILE_SPEC

# SELinux 파일 보안 컨텍스트 정책 삭제 영구 설정
semanage fcontext -d -t SELINUX_TYPE_CONTEXT  FILE_SPEC

# SELinux 파일 보안 컨텍스트 정책 목록 확인
semanage fcontext -l 

# 특정 파일 보안 컨텍스트 확인
semanage fcontext -l | grep XXXX

Restorecon

- 인자로 지정된 파일의 컨텍스트가 디렉토리에 지정된 컨텍스트와 일치하지 않을 경우 시스템에 등록된

보안 레이블 정책에 맞게 파일의 컨텍스트를 복구하는 명령

- 사용이 간단하지만 수동으로 컨텍스트를 지정할 수 없다는 단점 존재

- semanage fcontext 명령과 함께 사용


SELinux 부울(Boolean)

httpd 서비스는 MariaDB와 관련된 파일과 컨텍스트 유형이 맞지 않기 때문에 접근할 수 없다.

이 때 부울을 사용하여 컨텍스트 유형이 맞지 않더라도 주체가 객체에 접근할 수 있도록 정책의 동작 범위를

수정할 수 있다.

On/Off 로 기능을 수정할 수 있으며 시스템 재부팅 필요가 없다.

시스템에 적용되어 있는 명령어는 getsebool과 semanage가 있다.

부울의 확인

Getsebool

getsebool { -a | boolean-name}

Semanage

semanage boolean -l

SELinux		boolean		State	Default		Description
부울의 이름 | 부울의 현재 상태 | 부울의 영구설정 상태 | 부울에 대한 설명

부울의 설정

Setsebool

setsebool [-P] boolean-name { on | off }

ex)
# semanage boolean -l | grep 'httpd_can_network_connect_db'
httpd_can_network_connect_db (off , off) Allow httpd to can network connect db

# setsebool httpd_can_network_connect_db on

# semanage boolean -l | grep 'httpd_can_network_connect_db'
httpd_can_network_connect_db (on , off) Allow httpd to can network connect db

Semanage

semanage boolean -m { -0 | -1 } boolean-name

ex)
# semanage boolean -l | grep 'httpd_can_network_connect_db'
httpd_can_network_connect_db (on , on) Allow httpd to can network connect db

# semanage boolean -m -0 httpd_can_network_connect_db

# semanage boolean -l | grep 'httpd_can_network_connect_db'
httpd_can_network_connect_db (off , off) Allow httpd to can network connect db

SELinux 포트 레이블

- SELinux Port Label

SELinux가 활성화되면 서비스들이 사용하는 포트에도 레이블이 부여된다.

따라서 서비스가 기본적으로 사용하는 포트 외의 것을 사용하기 위해서는 해당 포트에 포트 레이블을 부여해야한다.

포트 레이블 확인

#SELinux 포트레이블 지정#
semanage port -a -t SELINUX_PORT_TYPE -p {tcp | udp} PORT
#SELinux 포트레이블 지정 삭제
semanage port -d -t SELINUX_PORT_TYPE -p {tcp | udp} PORT
#SELinux 포트레이블 수정
semanage port -m -t SELINUX_PORT_TYPE -p {tcp | udp} PORT

# 포트레이블 타입 확인
semanage port -l

포트 레이블 설정

semanage port {-a | -m | -d} -t port-type -p { tcp | udp } port-number

# 옵션
-a : 포트 번호에 포트 레이블 지정
-m : 포트 번호의 포트 레이블 변경
-d : 포트 번호의 포트 레이블 제거
-t : 포트 레이블의 유형
-p : 프로토콜 유형(TCP or UDP)

SELinux 문제 해결

문제 해결 순서

당연하겠지만 모든 것이 SELinux문제가 되는것은 아니다. 서비스 설정을 하다보면 서비스 설정파일을 변경 오탈자 등으로

인해 문제가 생길수 있다. 그래서 설정값을 먼저 확인한뒤 SELinux문제인지 확인하는 과정을 거친다.

  1. Permissive 모드로 변경해서 해결이되면 SELinux에서 문제가 있다. 해결이 안되면 SELinux와는 문제가 없다는 것이 된다. ( SELinux 문제인지 아닌지 )
  2. 파일의 보안 컨텍스트 확인
  3. 포트레이블 확인
  4. 부울확인

'Linux' 카테고리의 다른 글

[Linux] 22. FTP 서버  (0) 2022.08.09
[Linux] 21. DNS 서버  (0) 2022.08.09
[Linux] 19. 소프트웨어 패키지  (0) 2022.08.03
[Linux] 18. 리눅스 부트 프로세스  (0) 2022.08.03
[Linux] 17. 로그 관리  (0) 2022.08.02
복사했습니다!