웹사이트 검색

CentOS 7의 SELinux 소개 - 1부: 기본 개념


소개

Security Enhanced Linux 또는 SELinux는 대부분의 최신 Linux 배포판에 내장된 고급 액세스 제어 메커니즘입니다. 처음에는 악의적인 침입과 변조로부터 컴퓨터 시스템을 보호하기 위해 미국 국가안보국(National Security Agency)에서 개발했습니다. 시간이 지남에 따라 SELinux는 공개 도메인으로 출시되었으며 이후 다양한 배포판에서 SELinux를 코드에 통합했습니다.

많은 시스템 관리자는 SELinux가 다소 미지의 영역이라고 생각합니다. 이 주제는 벅차고 때로는 매우 혼란스럽게 보일 수 있습니다. 그러나 적절하게 구성된 SELinux 시스템은 보안 위험을 크게 줄일 수 있으며 이에 대해 조금만 알면 액세스 관련 오류 메시지 문제를 해결하는 데 도움이 될 수 있습니다. 이 자습서에서는 패키지, 명령 및 구성 파일과 같은 SELinux의 개념과 액세스가 거부될 때 기록하는 오류 메시지에 대해 알아봅니다. 또한 SELinux를 실행하는 몇 가지 실제 사례도 볼 수 있습니다.

메모

이 자습서에서는 달리 명시되지 않는 한 루트 사용자로 명령을 실행합니다. 루트 계정에 대한 액세스 권한이 없고 sudo 권한이 있는 다른 계정을 사용하는 경우 명령 앞에 sudo 키워드를 추가해야 합니다.

왜 SELinux인가

시작하기 전에 몇 가지 개념을 이해해 봅시다.

SELinux는 MAC(Mandatory Access Control)로 알려진 것을 구현합니다. 이는 모든 Linux 배포판에 이미 존재하는 DAC(Discretionary Access Control) 위에 구현됩니다.

DAC를 이해하기 위해 먼저 전통적인 Linux 파일 보안이 어떻게 작동하는지 살펴보겠습니다.

기존의 보안 모델에는 사용자, 그룹 및 기타(u,g,o)의 세 가지 엔터티가 있으며 이들은 파일 또는 디렉터리에 대한 읽기, 쓰기 및 실행(r,w,x) 권한의 조합을 가질 수 있습니다. 사용자 jo가 자신의 홈 디렉토리에 파일을 생성하면 해당 사용자는 해당 파일에 대한 읽기/쓰기 액세스 권한을 가지며 jo 그룹도 마찬가지입니다. "other\ 엔터티는 액세스 권한이 없을 수 있습니다. 다음 코드 블록에서 jo의 홈 디렉터리에 대한 가상 콘텐츠를 고려할 수 있습니다.

이 jo 사용자를 설정할 필요는 없습니다. 자습서의 뒷부분에서 많은 사용자를 설정할 것입니다.

다음과 같은 명령 실행:

ls -l /home/jo/

다음과 같은 출력을 표시할 수 있습니다.

total 4
-rwxrw-r--. 1 jo jo 41 Aug  6 22:45 myscript.sh

이제 jo는 이 액세스를 변경할 수 있습니다. jo는 다른 사용자 및 그룹에게 이 파일에 대한 액세스 권한을 부여(및 제한)하거나 파일 소유자를 변경할 수 있습니다. 이러한 작업으로 인해 이 액세스가 필요하지 않은 계정에 중요한 파일이 노출될 수 있습니다. jo는 더 안전하도록 제한할 수도 있지만 이는 임의적입니다. 시스템 관리자가 시스템의 모든 단일 파일에 대해 이를 시행할 방법이 없습니다.

다른 경우를 고려하십시오. Linux 프로세스가 실행될 때 루트 사용자 또는 수퍼유저 권한이 있는 다른 계정으로 실행될 수 있습니다. 즉, 블랙햇 해커가 애플리케이션을 제어하면 해당 애플리케이션을 사용하여 사용자 계정이 액세스할 수 있는 모든 리소스에 액세스할 수 있습니다. 루트 사용자로 실행되는 프로세스의 경우 기본적으로 이는 Linux 서버의 모든 것을 의미합니다.

사용자가 홈 디렉토리에서 쉘 스크립트를 실행하지 못하도록 제한하려는 시나리오를 생각해 보십시오. 이는 프로덕션 시스템에서 작업하는 개발자가 있을 때 발생할 수 있습니다. 그들이 로그 파일을 보기를 원하지만 그들이 su 또는 sudo 명령을 사용하는 것을 원하지 않으며 그들이 자신의 스크립트를 실행하는 것을 원하지 않습니다. 홈 디렉토리. 어떻게 합니까?

SELinux는 이러한 액세스 제어 요구 사항을 미세 조정하는 방법입니다. SELinux를 사용하면 사용자 또는 프로세스가 수행할 수 있는 작업을 정의할 수 있습니다. 모든 프로세스를 자체 도메인으로 제한하므로 프로세스는 특정 유형의 파일 및 허용된 도메인의 다른 프로세스와만 상호 작용할 수 있습니다. 이렇게 하면 해커가 시스템 전체 액세스 권한을 얻기 위해 프로세스를 가로채는 것을 방지할 수 있습니다.

테스트 시스템 설정

개념 학습을 돕기 위해 웹과 SFTP 서버를 모두 실행하는 테스트 서버를 구축합니다. 최소 패키지가 설치된 CentOS 7의 기본 설치로 시작하여 해당 서버에 Apache 및 vsftp 데몬을 설치합니다. 그러나 이러한 응용 프로그램은 구성하지 않습니다.

또한 클라우드 서버에 몇 가지 테스트 사용자 계정을 생성합니다. 수업 전반에 걸쳐 여러 위치에서 이 계정을 사용할 것입니다.

마지막으로 필요한 SELinux 관련 패키지를 설치합니다. 이는 최신 SELinux 명령으로 작업할 수 있도록 하기 위한 것입니다.

Apache 및 SFTP 서비스 설치

먼저 루트 사용자로 서버에 로그인하고 다음 명령을 실행하여 Apache를 설치합니다.

yum install httpd

출력에는 다운로드 중인 패키지가 표시되고 설치 권한을 요청합니다.

Loaded plugins: fastestmirror, langpacks
...
...
================================================================================
 Package       Arch           Version                     Repository       Size
================================================================================
Installing:
 httpd         x86_64         2.4.6-18.el7.centos         updates         2.7 M

Transaction Summary
================================================================================
Install  1 Package

Total download size: 2.7 M
Installed size: 9.3 M
Is this ok [y/d/N]:

y를 누르면 Apache 웹 서버 데몬이 설치됩니다.

Downloading packages:
httpd-2.4.6-18.el7.centos.x86_64.rpm                       | 2.7 MB   00:01
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : httpd-2.4.6-18.el7.centos.x86_64                             1/1
  Verifying  : httpd-2.4.6-18.el7.centos.x86_64                             1/1

Installed:
  httpd.x86_64 0:2.4.6-18.el7.centos

Complete!

데몬을 수동으로 시작합니다.

service httpd start

service httpd status 명령을 실행하면 서비스가 현재 실행 중인 것으로 표시됩니다.

Redirecting to /bin/systemctl status  httpd.service
httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled)
   Active: active (running) since Tue 2014-08-19 13:39:48 EST; 1min 40s ago
 Main PID: 339 (httpd)
...
...

다음으로 vsftp를 설치합니다.

yum install vsftpd

출력은 다음과 유사해야 합니다.

Loaded plugins: fastestmirror, langpacks
...
...
==============================================================================================================
 Package                  Arch                     Version                       Repository              Size
==============================================================================================================
Installing:
 vsftpd                   x86_64                   3.0.2-9.el7                   base                   165 k

Transaction Summary
==============================================================================================================
Install  1 Package

Total download size: 165 k
Installed size: 343 k
Is this ok [y/d/N]:

y를 눌러 패키지를 설치합니다.

다음으로 service vsftpd start 명령을 사용하여 vsftpd 데몬을 시작합니다. 출력은 다음과 같이 표시되어야 합니다.

Redirecting to /bin/systemctl status  vsftpd.service
vsftpd.service - Vsftpd ftp daemon
   Loaded: loaded (/usr/lib/systemd/system/vsftpd.service; disabled)
   Active: active (running) since Tue 2014-08-19 13:48:57 EST; 4s ago
  Process: 599 ExecStart=/usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf (code=exited, status=0/SUCCESS)
 Main PID: 600 (vsftpd)
...
...

SELinux 패키지 설치

SELinux에는 여러 패키지가 사용됩니다. 일부는 기본적으로 설치됩니다. 다음은 Red Hat 기반 배포 목록입니다.

  • policycoreutils(SELinux 관리를 위한 유틸리티 제공)
  • policycoreutils-python(SELinux 관리를 위한 유틸리티 제공)
  • selinux-policy(SELinux 참조 정책 제공)
  • selinux-policy-targeted(SELinux 대상 정책 제공)
  • libselinux-utils(SELinux 관리를 위한 일부 도구 제공)
  • setroubleshoot-server(감사 로그 메시지 해독을 위한 도구 제공)
  • setools(감사 로그 모니터링, 쿼리 정책 및 파일 컨텍스트 관리를 위한 도구 제공)
  • setools-console(감사 로그 모니터링, 쿼리 정책 및 파일 컨텍스트 관리를 위한 도구 제공)
  • mcstrans(다양한 수준을 이해하기 쉬운 형식으로 변환하는 도구)

이 중 일부는 이미 설치되어 있습니다. CentOS 7 시스템에 설치된 SELinux 패키지를 확인하려면 루트 사용자로 아래와 같은 몇 가지 명령을 실행할 수 있습니다(grep 다음에 다른 검색어 사용).

rpm -qa | grep selinux

출력은 다음과 같아야 합니다.

libselinux-utils-2.2.2-6.el7.x86_64
libselinux-2.2.2-6.el7.x86_64
selinux-policy-targeted-3.12.1-153.el7.noarch
selinux-policy-3.12.1-153.el7.noarch
libselinux-python-2.2.2-6.el7.x86_64

계속해서 아래 명령을 사용하여 모든 패키지를 설치하거나(yum은 이미 가지고 있는 패키지만 업데이트함) 시스템에서 누락된 패키지만 설치할 수 있습니다.

yum install policycoreutils policycoreutils-python selinux-policy selinux-policy-targeted libselinux-utils setroubleshoot-server setools setools-console mcstrans

이제 모든 SELinux 패키지가 로드된 시스템이 있어야 합니다. 또한 기본 구성으로 실행되는 Apache 및 SFTP 서버가 있습니다. 또한 루트 계정 외에 4개의 일반 사용자 계정을 테스트할 준비가 되어 있습니다.

SELinux 모드

이제 SELinux를 사용해 볼 시간이므로 SELinux 모드부터 시작하겠습니다. 언제든지 SELinux는 세 가지 가능한 모드 중 하나일 수 있습니다.

  • 강제
  • 허용
  • 비활성화됨

시행 모드에서 SELinux는 Linux 시스템에서 정책을 시행하고 사용자 및 프로세스의 무단 액세스 시도가 거부되도록 합니다. 액세스 거부는 관련 로그 파일에도 기록됩니다. 나중에 SELinux 정책과 감사 로그에 대해 이야기하겠습니다.

허용 모드는 반 활성화 상태와 같습니다. SELinux는 허용 모드에서 정책을 적용하지 않으므로 액세스가 거부되지 않습니다. 그러나 모든 정책 위반은 여전히 감사 로그에 기록됩니다. 적용하기 전에 SELinux를 테스트하는 좋은 방법입니다.

비활성화 모드는 자명합니다. 시스템이 향상된 보안으로 실행되지 않습니다.

SELinux 모드 및 상태 확인

getenforce 명령을 실행하여 현재 SELinux 모드를 확인할 수 있습니다.

getenforce

SELinux는 현재 비활성화되어 있으므로 출력은 다음과 같습니다.

Disabled

sestatus 명령을 실행할 수도 있습니다.

sestatus

SELinux가 비활성화되면 출력에 다음이 표시됩니다.

SELinux status:        disabled

SELinux 구성 파일

SELinux의 기본 구성 파일은 /etc/selinux/config입니다. 다음 명령을 실행하여 내용을 볼 수 있습니다.

cat /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
# SELINUXTYPE= can take one of these two values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected. 
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted

이 파일에는 두 가지 지시문이 있습니다. SELINUX 지시문은 SELinux 모드를 지시하며 이전에 논의한 것처럼 세 가지 가능한 값을 가질 수 있습니다.

SELINUXTYPE 지시문은 사용될 정책을 결정합니다. 기본값은 대상입니다. 대상 정책을 통해 SELinux를 사용하면 액세스 제어 권한을 사용자 지정하고 미세 조정할 수 있습니다. 다른 가능한 값은 고급 보호 모드인 "MLS\(다단계 보안)입니다. 또한 MLS를 사용하려면 추가 패키지를 설치해야 합니다.

SELinux 활성화 및 비활성화

SELinux를 활성화하는 것은 매우 간단합니다. 비활성화하는 것과는 달리 2단계 프로세스로 수행해야 합니다. SELinux가 현재 비활성화되어 있고 이전 섹션의 모든 SELinux 패키지를 설치했다고 가정합니다.

첫 번째 단계로 /etc/selinux/config 파일을 편집하여 SELINUX 지시문을 허용 모드로 변경해야 합니다.

vi /etc/sysconfig/selinux
...
SELINUX=permissive
...

SELinux를 적용하려면 먼저 시스템의 모든 파일에 해당 컨텍스트 레이블이 지정되어야 하므로 상태를 허용으로 설정해야 합니다. 모든 파일에 적절하게 레이블이 지정되지 않으면 제한된 도메인에서 실행되는 프로세스가 올바른 컨텍스트로 파일에 액세스할 수 없기 때문에 실패할 수 있습니다. 이로 인해 부팅 프로세스가 실패하거나 오류와 함께 시작할 수 있습니다. 튜토리얼 뒷부분에서 컨텍스트도메인을 소개합니다.

이제 시스템 재부팅을 실행하십시오.

reboot

재부팅 프로세스는 SELinux 컨텍스트로 레이블이 지정된 서버의 모든 파일을 볼 수 있습니다. 시스템이 허용 모드에서 실행 중이므로 SELinux 오류 및 액세스 거부가 보고되지만 아무 것도 중지하지 않습니다.

루트로 서버에 다시 로그인하십시오. 다음으로 /var/log/messages 파일의 내용에서 "SELinux is prevent\ 문자열을 검색합니다.

cat /var/log/messages | grep "SELinux is preventing"

보고된 오류가 없으면 다음 단계로 안전하게 이동할 수 있습니다. 그러나 /var/log/messages 파일에서 "SELinux\가 포함된 텍스트를 검색하는 것은 여전히 좋은 생각입니다. 시스템에서 다음 명령을 실행했습니다.

cat /var/log/messages | grep "SELinux"

실행 중인 그놈 데스크탑과 관련된 일부 오류 메시지가 표시되었습니다. 이것은 SELInux가 비활성화되었거나 허용 모드일 때 발생했습니다.

Aug 20 11:31:14 localhost kernel: SELinux:  Initializing.
Aug 20 11:31:16 localhost kernel: SELinux:  Disabled at runtime.
Aug 20 11:31:21 localhost journal: Unable to lookup SELinux process context: Invalid argument
Aug 20 11:33:20 localhost gnome-session: SELinux Troubleshooter: Applet requires SELinux be enabled to run.

Aug 20 11:37:15 localhost kernel: SELinux:  Initializing.
Aug 20 11:37:17 localhost kernel: SELinux:  Disabled at runtime.
Aug 20 11:37:23 localhost journal: Unable to lookup SELinux process context: Invalid argument
Aug 20 11:37:44 localhost gnome-session: SELinux Troubleshooter: Applet requires SELinux be enabled to run.

Aug 20 11:39:42 localhost kernel: SELinux:  Initializing.
Aug 20 11:39:44 localhost kernel: SELinux:  Disabled at runtime.
Aug 20 11:39:50 localhost journal: Unable to lookup SELinux process context: Invalid argument

이러한 유형의 오류는 괜찮습니다.

두 번째 단계에서는 구성 파일을 편집하여 /etc/sysconfig/selinux 파일에서 SELINUX 지시문을 허용에서 강제로 변경해야 합니다.

...
SELINUX=enforcing
...

그런 다음 서버를 다시 재부팅하십시오.

reboot

서버가 다시 온라인 상태가 되면 sestatus 명령을 실행하여 SELinux 상태를 확인할 수 있습니다. 이제 서버에 대한 자세한 정보가 표시됩니다.

SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   permissive
Mode from config file:          error (Success)
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Max kernel policy version:      28

/var/log/messages 파일을 확인합니다.

cat /var/log/messages | grep "SELinux"

오류가 없어야 합니다. 출력은 다음과 같아야 합니다.

Aug 20 11:42:06 localhost kernel: SELinux:  Initializing.
Aug 20 11:42:09 localhost systemd[1]: Successfully loaded SELinux policy in 183.302ms.

Aug 20 11:44:25 localhost kernel: SELinux:  Initializing.
Aug 20 11:44:28 localhost systemd[1]: Successfully loaded SELinux policy in 169.039ms.

SELinux 모드 및 상태 확인(다시)

getenforce 명령을 실행하여 현재 SELinux 모드를 확인할 수 있습니다.

getenforce

시스템이 시행 모드에서 실행 중인 경우 출력은 다음과 같습니다.

Enforcing

SELinux가 비활성화된 경우 출력이 달라집니다.

Disabled

더 나은 그림을 얻기 위해 sestatus 명령을 실행할 수도 있습니다.

sestatus

SELinux가 비활성화되어 있지 않으면 출력에 현재 상태, 현재 모드, 구성 파일에 정의된 모드 및 정책 유형이 표시됩니다.

SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   enforcing
Mode from config file:          enforcing
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Max kernel policy version:      28

SELinux가 비활성화되면 출력에 다음이 표시됩니다.

SELinux status:        disabled

setenforce 명령을 사용하여 시행 모드와 허용 모드 사이를 임시로 전환할 수도 있습니다. (SELinux가 비활성화되면 setenforce를 실행할 수 없습니다.)

먼저 CentOS 7 시스템에서 SELinux 모드를 강제에서 허용으로 변경합니다.

setenforce permissive

이제 sestatus 명령을 실행하면 현재 모드가 구성 파일에 정의된 모드와 다른 것으로 표시됩니다.

SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   permissive
Mode from config file:          enforcing
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Max kernel policy version:      28

시행으로 다시 전환:

setenforce enforcing

SELinux 정책

SELinux 보안 엔진의 핵심은 정책입니다. 정책은 이름에서 알 수 있듯이 시스템의 모든 항목에 대한 보안 및 액세스 권한을 정의하는 일련의 규칙입니다. 모든 것은 사용자, 역할, 프로세스 및 파일을 의미합니다. 정책은 이러한 각 엔터티가 서로 관련되는 방식을 정의합니다.

일부 기본 용어

정책을 이해하려면 몇 가지 기본 용어를 배워야 합니다. 자세한 내용은 나중에 다루겠지만 간략한 소개만 하겠습니다. SELinux 정책은 역할에 대한 사용자 액세스, 도메인에 대한 역할 액세스 및 유형에 대한 도메인 액세스를 정의합니다.

사용자

SELinux에는 사전 구축된 사용자 집합이 있습니다. 모든 일반 Linux 사용자 계정은 하나 이상의 SELinux 사용자에게 매핑됩니다.

Linux에서 사용자는 프로세스를 실행합니다. 이는 vi 편집기에서 문서를 여는 사용자 jo(vi 프로세스를 실행하는 jo의 계정) 또는 httpd 데몬을 실행하는 서비스 계정만큼 간단할 수 있습니다. SELinux 세계에서 프로세스(데몬 또는 실행 중인 프로그램)를 주제라고 합니다.

역할

역할은 사용자와 프로세스 사이에 있는 게이트웨이와 같습니다. 역할은 해당 프로세스에 액세스할 수 있는 사용자를 정의합니다. 역할은 그룹이 아니라 필터와 비슷합니다. 역할이 부여하는 한 사용자는 언제든지 역할에 들어가거나 역할을 맡을 수 있습니다. SELinux 정책의 역할 정의는 해당 역할에 액세스할 수 있는 사용자를 정의합니다. 또한 역할 자체가 액세스할 수 있는 프로세스 도메인을 정의합니다. SELinux의 일부가 RBAC(역할 기반 액세스 제어)로 알려진 기능을 구현하기 때문에 역할이 작동합니다.

주체와 객체

주제는 프로세스이며 잠재적으로 개체에 영향을 미칠 수 있습니다.

SELinux의 객체는 조치를 취할 수 있는 모든 것입니다. 이것은 파일, 디렉토리, 포트, tcp 소켓, 커서 또는 아마도 X 서버일 수 있습니다. 주체가 개체에 대해 수행할 수 있는 작업은 주체의 권한입니다.

도메인은 주제를 위한 것입니다.

도메인은 SELinux 주제(프로세스)가 실행될 수 있는 컨텍스트입니다. 그 맥락은 주제를 둘러싼 래퍼와 같습니다. 프로세스가 할 수 있는 것과 할 수 없는 것을 알려줍니다. 예를 들어 도메인은 주체가 액세스할 수 있는 파일, 디렉터리, 링크, 장치 또는 포트를 정의합니다.

유형은 객체용입니다.

유형은 파일의 목적을 규정하는 파일 컨텍스트의 컨텍스트입니다. 예를 들어 파일의 컨텍스트는 파일이 웹 페이지이거나 파일이 /etc 디렉토리에 속하거나 파일 소유자가 특정 SELinux 사용자임을 지시할 수 있습니다. 파일의 컨텍스트는 SELinux 용어에서 유형이라고 합니다.

그렇다면 SELinux 정책은 무엇입니까?

SELinux 정책은 역할에 대한 사용자 액세스, 도메인에 대한 역할 액세스 및 유형에 대한 도메인 액세스를 정의합니다. 먼저 사용자에게 역할을 입력할 수 있는 권한이 부여된 다음 역할이 도메인에 액세스할 수 있는 권한이 부여되어야 합니다. 그러면 도메인은 특정 유형의 파일에만 액세스하도록 제한됩니다.

정책 자체는 아무개 사용자가 아무개 역할만 맡을 수 있고 해당 역할은 아무개 도메인에만 액세스할 수 있는 권한이 부여된다는 규칙의 묶음입니다. 그러면 도메인은 그저 그런 파일 형식에만 액세스할 수 있습니다. 다음 이미지는 개념을 보여줍니다.

용어 팁: 특정 도메인 내에서 실행되는 프로세스가 특정 유형의 개체에 대해 특정 작업만 수행할 수 있는 마지막 부분을 유형 적용(TE)이라고 합니다.

정책 주제로 돌아가서 SELinux 정책 구현은 일반적으로 기본적으로 대상이 지정됩니다. 이전에 본 SELinux 구성 파일을 기억한다면 SELINUXTYPE 지시문은 targeted로 설정됩니다. 이것이 의미하는 바는 기본적으로 SELinux가 시스템의 특정 프로세스만 제한한다는 것입니다(즉, 특정 프로세스만 대상이 됨). 대상이 아닌 것은 제한되지 않은 도메인에서 실행됩니다.

대안은 정책에서 승인하지 않는 한 모든 액세스가 거부되는 거부 기본 모델입니다. 이는 매우 안전한 구현이 될 것이지만 이는 또한 개발자가 모든 단일 프로세스가 모든 가능한 개체에 대해 필요할 수 있는 모든 가능한 권한을 예상해야 함을 의미합니다. 기본 동작은 특정 프로세스에만 관련된 SELinux를 봅니다.

SELinux 정책 동작

SELinux 정책은 기존의 DAC 보안을 대체하는 것이 아닙니다. DAC 규칙이 파일에 대한 사용자 액세스를 금지하는 경우 첫 번째 방어선이 이미 액세스를 차단했기 때문에 SELinux 정책 규칙이 평가되지 않습니다. SELinux 보안 결정은 DAC 보안이 평가된 후에 적용됩니다.

SELinux 지원 시스템이 시작되면 정책이 메모리에 로드됩니다. SELinux 정책은 부팅 시 로드되는 커널 모듈과 매우 유사한 모듈 형식으로 제공됩니다. 커널 모듈과 마찬가지로 런타임에 메모리에서 동적으로 추가 및 제거할 수 있습니다. SELinux에서 사용하는 정책 저장소는 로드된 모듈을 추적합니다. sestatus 명령은 정책 저장소 이름을 표시합니다. semodule -l 명령은 현재 메모리에 로드된 SELinux 정책 모듈을 나열합니다.

이에 대한 느낌을 얻기 위해 semodule 명령을 실행해 보겠습니다.

semodule -l | less

출력은 다음과 같습니다.

abrt    1.2.0
accountsd       1.0.6
acct    1.5.1
afs     1.8.2
aiccu   1.0.2
aide    1.6.1
ajaxterm        1.0.0
alsa    1.11.4
amanda  1.14.2
amtu    1.2.3
anaconda        1.6.1
antivirus       1.0.0
apache  2.4.0
...
...

semodule은 SELinux 정책 모듈 설치, 제거, 다시 로드, 업그레이드, 활성화 및 비활성화와 같은 여러 다른 작업에 사용할 수 있습니다.

지금쯤이면 모듈 파일이 어디에 있는지 알고 싶을 것입니다. 대부분의 최신 배포판에는 SELinux 패키지의 일부로 모듈의 바이너리 버전이 포함되어 있습니다. 정책 파일의 확장자는 .pp입니다. CentOS 7의 경우 다음 명령을 실행할 수 있습니다.

ls -l /etc/selinux/targeted/modules/active/modules/

목록에는 .pp 확장자를 가진 여러 파일이 표시됩니다. 자세히 살펴보면 서로 다른 응용 프로그램과 관련이 있습니다.

...
-rw-r--r--. 1 root root 10692 Aug 20 11:41 anaconda.pp
-rw-r--r--. 1 root root 11680 Aug 20 11:41 antivirus.pp
-rw-r--r--. 1 root root 24190 Aug 20 11:41 apache.pp
-rw-r--r--. 1 root root 11043 Aug 20 11:41 apcupsd.pp
...

.pp 파일은 사람이 읽을 수 없습니다.

SELinux 모듈화가 작동하는 방식은 시스템이 부팅될 때 정책 모듈이 활성 정책으로 알려진 것으로 결합된다는 것입니다. 그러면 이 정책이 메모리에 로드됩니다. 이 로드된 정책의 결합된 바이너리 버전은 /etc/selinux/targeted/policy 디렉토리에서 찾을 수 있습니다.

ls -l /etc/selinux/targeted/policy/

활성 정책이 표시됩니다.

total 3428
-rw-r--r--. 1 root root 3510001 Aug 20 11:41 policy.29

SELinux 부울 설정 변경

정책 모듈 파일을 읽을 수는 없지만 설정을 조정할 수 있는 간단한 방법이 있습니다. 이는 SELinux 부울을 통해 이루어집니다.

작동 방식을 확인하기 위해 semanage boolean -l 명령을 실행해 보겠습니다.

semanage boolean -l | less

여기에는 켜거나 끌 수 있는 다양한 스위치, 기능 및 현재 상태가 표시됩니다.

ftp_home_dir                   (off  ,  off)  Allow ftp to home dir
smartmon_3ware                 (off  ,  off)  Allow smartmon to 3ware
mpd_enable_homedirs            (off  ,  off)  Allow mpd to enable homedirs
xdm_sysadm_login               (off  ,  off)  Allow xdm to sysadm login
xen_use_nfs                    (off  ,  off)  Allow xen to use nfs
mozilla_read_content           (off  ,  off)  Allow mozilla to read content
ssh_chroot_rw_homedirs         (off  ,  off)  Allow ssh to chroot rw homedirs
mount_anyfile                  (on   ,   on)  Allow mount to anyfile
...
...   

첫 번째 옵션을 사용하면 FTP 데몬이 사용자의 홈 디렉토리에 액세스할 수 있습니다. 현재 설정이 꺼져 있습니다.

설정을 변경하려면 setsebool 명령을 사용할 수 있습니다. 예를 들어 익명 FTP 쓰기 액세스를 고려해 보겠습니다.

getsebool ftpd_anon_write

이것은 현재 스위치가 꺼져 있음을 보여줍니다.

ftpd_anon_write --> off

다음으로 활성화하도록 부울을 변경합니다.

setsebool ftpd_anon_write on

값을 다시 확인하면 변경 사항이 표시됩니다.

ftpd_anon_write --> on

변경된 부울은 영구적이지 않습니다. 재부팅 후 이전 값으로 돌아갑니다. 영구적으로 만들기 위해 setsebool 명령과 함께 -P 스위치를 사용할 수 있습니다.

결론

이 자습서의 첫 번째 부분에서는 SELinux에 대한 몇 가지 기본 개념을 이해하려고 노력했습니다. 우리는 SELinux가 시스템을 보호하는 방법, 이를 활성화하는 방법 및 실행 가능한 모드를 살펴보았습니다. 또한 SELinux 정책 주제에 대해서도 다루었습니다. 다음으로 SELinux를 사용하여 파일 및 프로세스에 대한 액세스를 제한하는 방법을 배웁니다.