SELinux 사용자 및 관리자 가이드


Red Hat Enterprise Linux 7

SELinux(Security-Enhanced Linux)의 기본 및 고급 구성

Mirek Jahoda

Red Hat Customer Content Services

Barbora Ančincová

Red Hat Customer Content Services

Ioanna Gkioka

Red Hat Customer Content Services

Tomáš Čapek

Red Hat Customer Content Services

초록

이 문서는 다음 두 부분으로 구성되어 있습니다. SELinuxConfined 서비스 관리 전자는 SELinux 기능을 사용하는 기본 원리와 원칙을 설명하고, 후자는 다양한 서비스를 설정하고 구성하는 실용적인 작업에 더욱 중점을 둡니다.

I 부. SELinux

이 문서에서는 SELinux(Security Enhanced Linux)가 작동하는 기본 및 원칙에 대해 설명합니다.

1장. 소개

SELinux(Security Enhanced Linux)는 추가 시스템 보안 계층을 제공합니다. SELinux는 기본적으로 질문에 대답합니다. "may <subject> do <action> to <object>"는 다음과 같습니다. "사용자의 홈 디렉토리에 있는 웹 서버 액세스 파일일 수 있습니까?".
DAC(Degretionary Access Control)라고 하는 사용자, 그룹 및 기타 권한을 기반으로 하는 표준 액세스 정책은 시스템 관리자가 로그 파일을 볼 수 있도록 특정 애플리케이션을 제한하는 것과 같은 포괄적이고 세분화된 보안 정책을 생성할 수 없습니다. 또한 다른 애플리케이션에서는 로그 파일에 새 데이터를 추가할 수 없습니다.
SELinux는 MAC(강제적 액세스 제어)를 구현합니다. 모든 프로세스 및 시스템 리소스에는 SELinux 컨텍스트 라는 특수 보안 레이블이 있습니다. SELinux 레이블이라고도 하는 SELinux 컨텍스트는 시스템 수준 세부 정보를 추상화하고 엔터티의 보안 속성에 중점을 두는 식별자입니다. 이렇게 하면 SELinux 정책에서 오브젝트를 참조하는 일관된 방법을 제공할 뿐만 아니라 다른 식별 방법에서 찾을 수 있는 모호성을 제거합니다. 예를 들어 파일은 바인드 마운트를 사용하는 시스템에서 여러 개의 유효한 경로 이름을 가질 수 있습니다.
SELinux 정책은 프로세스가 서로 상호 작용하는 방법과 다양한 시스템 리소스와 상호 작용하는 방법을 정의하는 일련의 규칙에서 이러한 컨텍스트를 사용합니다. 기본적으로 정책은 규칙에서 명시적으로 액세스 권한을 부여하지 않는 한 상호 작용을 허용하지 않습니다.
참고
DAC 규칙 다음에 SELinux 정책 규칙이 확인된다는 점을 기억하는 것이 중요합니다. DAC 규칙이 먼저 액세스를 거부하면 SELinux 정책 규칙이 사용되지 않습니다. 즉, 기존 DAC 규칙이 액세스를 차단하는 경우 SELinux 거부가 기록되지 않습니다.
SELinux 컨텍스트에는 사용자, 역할, 유형, 보안 수준 등 여러 필드가 있습니다. SELinux 유형 정보는 전체 SELinux 컨텍스트가 아니라 프로세스와 시스템 리소스 간에 허용되는 상호 작용을 정의하는 가장 일반적인 정책 규칙이므로 SELinux 정책과 관련하여 가장 중요한 정보일 수 있습니다. SELinux 유형은 일반적으로 _t 로 끝납니다. 예를 들어 웹 서버의 유형 이름은 httpd_t 입니다. /var/www/html/ 에 있는 파일 및 디렉토리의 유형 컨텍스트는 httpd_sys_content_t 입니다. /tmp 및 / var /tmp /에 있는 파일 및 디렉토리의 유형 컨텍스트는 tmp_t 입니다. 웹 서버 포트의 유형 컨텍스트는 http_port_t 입니다.
예를 들어 Apache( httpd_t로 실행되는 웹 서버 프로세스)가 /var/www/html/ 및 기타 웹 서버 디렉터리(httpd_sys_content_t)에서 일반적으로 발견된 컨텍스트를 사용하여 파일 및 디렉터리에 액세스할 수 있도록 허용하는 정책 규칙이 있습니다. /tmp/var/tmp/ 에서 일반적으로 발견되는 파일에 대한 정책에 허용 규칙이 없으므로 액세스가 허용되지 않습니다. SELinux를 사용하면 Apache가 손상되고 악성 스크립트가 액세스 권한을 얻을 수 있더라도 /tmp 디렉토리에 액세스할 수 없습니다.

그림 1.1. SELinux를 사용하면 httpd_t로 실행하는 Apache 프로세스가 /var/www/html/ 디렉터리에 액세스할 수 있으며 httpd_t 및 mysqld_db_t 유형 컨텍스트에 대한 허용 규칙이 없기 때문에 동일한 프로세스가 /data/mysql/ 디렉터리에 액세스할 수 있습니다. 반면 mysqld_t로 실행되는 MariaDB 프로세스는 /data/mysql/ 디렉터리에 액세스할 수 있으며 SELinux도 mysqld_t 유형의 프로세스를 올바르게 거부하여 httpd_sys_content_t로 레이블이 지정된 /var/www/html/ 디렉터리에 액세스합니다.

추가 리소스

자세한 내용은 다음 설명서를 참조하십시오.

1.1. SELinux 실행의 이점

SELinux는 다음과 같은 이점을 제공합니다.
  • 모든 프로세스와 파일에 레이블이 지정됩니다. SELinux 정책 규칙은 프로세스가 파일과 상호 작용하는 방법과 프로세스가 서로 상호 작용하는 방식을 정의합니다. 액세스는 특별히 허용하는 SELinux 정책 규칙이 있는 경우에만 허용됩니다.
  • 세부적인 액세스 제어. 사용자 재량에 Linux 사용자 및 그룹 ID에 따라 제어되는 기존 UNIX 권한을 벗어나 SELinux 액세스 결정은 SELinux 사용자, 역할, 유형 및 선택적으로 보안 수준과 같은 사용 가능한 모든 정보를 기반으로 합니다.
  • SELinux 정책은 관리 방식으로 정의되고 시스템 전체에 적용됩니다.
  • 권한 에스컬레이션 공격에 대한 완화 개선. 프로세스는 도메인에서 실행되므로 서로 분리됩니다. SELinux 정책 규칙은 프로세스가 파일 및 기타 프로세스에 액세스하는 방법을 정의합니다. 프로세스가 손상되면 공격자는 해당 프로세스의 일반 기능에만 액세스할 수 있으며 프로세스가 액세스하도록 구성된 파일에만 액세스할 수 있습니다. 예를 들어 Apache HTTP 서버가 손상되면 공격자는 특정 SELinux 정책 규칙을 추가하거나 이러한 액세스를 허용하도록 구성하지 않은 한 해당 프로세스를 사용하여 사용자 홈 디렉토리의 파일을 읽을 수 없습니다.
  • SELinux를 사용하여 데이터 기밀성 및 무결성을 적용하고 신뢰할 수 없는 입력에서 프로세스를 보호할 수 있습니다.
그러나 SELinux는 다음이 아닙니다.
  • 확대/축소 소프트웨어,
  • 암호, 방화벽 및 기타 보안 시스템 대신
  • 올인원 보안 솔루션.
SELinux는 기존 보안 솔루션을 개선하도록 설계되었으며 이를 대체하지 않습니다. SELinux를 실행하는 경우에도 분석하기 어려운 암호 또는 방화벽을 사용하여 소프트웨어를 최신 상태로 유지하는 등 모범적인 보안 사례를 계속 따르는 것이 중요합니다.

1.2. 예

다음 예제에서는 SELinux가 보안을 강화하는 방법을 보여줍니다.
  • 기본 작업은 deny입니다. 파일을 여는 프로세스와 같이 액세스를 허용하기 위한 SELinux 정책 규칙이 없으면 액세스가 거부됩니다.
  • SELinux는 Linux 사용자를 제한할 수 있습니다. SELinux 정책에는 많은 제한된 SELinux 사용자가 있습니다. 제한된 SELinux 사용자에게 Linux 사용자를 매핑하여 보안 규칙 및 메커니즘을 활용할 수 있습니다. 예를 들어 Linux 사용자를 SELinux user_u 사용자에게 매핑하면 (그렇지 않으면 구성되지 않은 경우) sudosu 와 같은 사용자 ID(setuid) 애플리케이션을 실행할 수 없는 Linux 사용자가 생성됩니다. 자세한 내용은 3.3절. “제한된 사용자 및 제한되지 않은 사용자”을 참조하십시오.
  • 프로세스 및 데이터 분리 증가. 프로세스는 자체 도메인에서 실행되므로 프로세스가 다른 프로세스에서 사용하는 파일에 액세스하지 못하도록 방지하고 프로세스가 다른 프로세스에 액세스하지 못하도록 합니다. 예를 들어, SELinux를 실행할 때 공격자는 Samba 서버를 손상시킬 수 없으며 MariaDB 데이터베이스와 같은 다른 프로세스에서 사용하는 파일을 읽고 쓸 수 있는 공격 벡터로 해당 Samba 서버를 사용할 수 없습니다.
  • SELinux를 사용하면 구성 실수로 인한 손상을 완화할 수 있습니다. DNS(Domain Name System) 서버는 종종 영역 전송이라고 하는 항목에서 서로 간에 정보를 복제합니다. 공격자는 영역 전송을 사용하여 false 정보로 DNS 서버를 업데이트할 수 있습니다. Red Hat Enterprise Linux에서 Berkeley Internet Name Domain(BIND)을 DNS 서버로 실행하는 경우 관리자가 영역 전송을 수행할 수 있는 서버를 제한하지 않아도 기본 SELinux 정책은 영역 파일을 금지합니다. [1] 영역 전송, BIND 이름 데몬 자체 및 기타 프로세스를 사용하여 업데이트할 수 있습니다.
  • NetworkWorld.com 문서, 서버 소프트웨어에 대한 이해력: SELinux로 실제 공격 차단[2], SELinux에 대한 배경 정보와 SELinux가 차단한 다양한 위협에 대한 정보.


[1] DNS 서버에서 사용하는 호스트 이름 및 IP 주소 매핑과 같은 정보를 포함하는 텍스트 파일.
[2] Marti, Don. "서버 소프트웨어에 대한 확신: SELinux는 실제 위협을 차단합니다.". 2008년 2월 24일 게시됨. 2009년 8월 27일 액세스: http://www.networkworld.com/article/2283723/lan-wan/a-seatbelt-for-server-software--selinux-blocks-real-world-exploits.html.

1.3. SELinux 아키텍처

SELinux는 Linux 커널에 빌드된 Linux 보안 모듈(LSM)입니다. 커널의 SELinux 하위 시스템은 관리자가 제어하고 부팅 시 로드하는 보안 정책에 의해 구동됩니다. 시스템의 모든 보안 관련 커널 수준 액세스 작업은 SELinux에서 가로채고 로드된 보안 정책 컨텍스트에서 검사합니다. 로드된 정책에서 작업을 허용하면 작업을 계속합니다. 그렇지 않으면 작업이 차단되고 프로세스가 오류를 수신합니다.
액세스 허용 또는 허용하지 않기와 같은 SELinux 결정은 캐시됩니다. 이 캐시를 AVC(액세스 벡터 캐시)라고 합니다. 이러한 캐시된 의사 결정을 사용할 때는 SELinux 정책 규칙을 보다 적게 확인하여 성능이 향상되어야 합니다. DAC 규칙이 먼저 액세스를 거부하면 SELinux 정책 규칙이 적용되지 않습니다.

1.4. SELinux 상태 및 모드

SELinux는 비활성화, 허용 또는 강제의 세 가지 모드 중 하나로 실행될 수 있습니다.
비활성화 모드는 강력하지 않습니다. 시스템이 SELinux 정책을 적용하지 않을 뿐만 아니라 파일과 같은 영구 오브젝트의 레이블을 방지하여 나중에 SELinux를 활성화하기가 어렵습니다.
허용 모드에서 시스템은 SELinux가 개체에 레이블을 지정하고 로그에서 액세스 거부 항목을 내보내는 등 로드된 보안 정책을 적용하는 것처럼 작동하지만 실제로는 작업을 거부하지 않습니다. 프로덕션 시스템에는 권장되지 않지만 허용 모드는 SELinux 정책 개발에 유용할 수 있습니다.
강제 모드는 기본 및 권장되는 작업 모드입니다. 강제 모드에서 SELinux는 정상적으로 작동하여 전체 시스템에서 로드된 보안 정책을 적용합니다.
setenforce 유틸리티를 사용하여 강제 모드와 허용 모드 간에 변경합니다. setenforce 를 통한 변경 사항은 재부팅해도 유지되지 않습니다. 강제 모드로 변경하려면 Linux root 사용자로 setenforce 1 명령을 입력합니다. 허용 모드로 변경하려면 setenforce 0 명령을 입력합니다. getenforce 유틸리티를 사용하여 현재 SELinux 모드를 확인합니다.
~]# getenforce
Enforcing
Copy to Clipboard Toggle word wrap
~]# setenforce 0
~]# getenforce
Permissive
Copy to Clipboard Toggle word wrap
~]# setenforce 1
~]# getenforce
Enforcing
Copy to Clipboard Toggle word wrap
Red Hat Enterprise Linux에서는 개별 도메인을 허용 모드로 설정할 수 있으며 강제 모드에서 시스템을 실행할 수 있습니다. 예를 들어 httpd_t 도메인을 허용하도록 설정하려면 다음을 수행합니다.
~]# semanage permissive -a httpd_t
Copy to Clipboard Toggle word wrap
자세한 내용은 11.3.4절. “허용 도메인”을 참조하십시오.
참고
영구 상태 및 모드 변경 사항은 4.4절. “SELinux 상태 및 모드의 영구 변경” 에서 다룹니다.

1.5. 추가 리소스

Red Hat IdM(Identity Management)은 SELinux 사용자 맵을 정의하는 중앙 집중식 솔루션을 제공합니다. 자세한 내용은 Linux 도메인 ID, 인증 및 정책 가이드에서 SELinux 사용자 맵 정의를 참조하십시오.

2장. SELinux 컨텍스트

프로세스 및 파일에는 SELinux 사용자, 역할, 유형, 수준(선택 사항)과 같은 추가 정보가 포함된 SELinux 컨텍스트로 레이블이 지정됩니다. SELinux를 실행할 때 이 모든 정보를 사용하여 액세스 제어 결정을 내립니다. Red Hat Enterprise Linux에서 SELinux는 역할 기반 액세스 제어(RBAC),TE(유형 강제), 선택적으로 XML(Multi-Level Security)의 조합을 제공합니다.
다음은 SELinux 컨텍스트를 보여주는 예입니다. SELinux 컨텍스트는 SELinux를 실행하는 Linux 운영 체제의 프로세스, Linux 사용자 및 파일에서 사용됩니다. 다음 명령을 사용하여 파일 및 디렉터리의 SELinux 컨텍스트를 확인합니다.
~]$ ls -Z file1
-rwxrw-r--  user1 group1 unconfined_u:object_r:user_home_t:s0      file1
Copy to Clipboard Toggle word wrap
SELinux 컨텍스트는 SELinux 사용자:role:type:level 구문을 따릅니다. 필드는 다음과 같습니다.
SELinux 사용자
SELinux 사용자 ID는 특정 역할 집합과 특정 MLS/MCS 범위에 대해 인증된 정책에 알려진 ID입니다. 각 Linux 사용자는 SELinux 정책을 사용하여 SELinux 사용자에게 매핑됩니다. 이를 통해 Linux 사용자는 SELinux 사용자에게 지정된 제한 사항을 상속할 수 있습니다. 매핑된 SELinux 사용자 ID는 입력할 수 있는 역할과 수준을 정의하기 위해 해당 세션의 프로세스에 대해 SELinux 컨텍스트에서 사용됩니다. SELinux 및 Linux 사용자 계정 간 매핑 목록을 보려면 root로 다음 명령을 입력합니다( policycoreutils-python 패키지가 설치되어 있어야 함).
~]# semanage login -l
Login Name           SELinux User         MLS/MCS Range        Service

__default__          unconfined_u         s0-s0:c0.c1023       *
root                 unconfined_u         s0-s0:c0.c1023       *
system_u             system_u             s0-s0:c0.c1023       *
Copy to Clipboard Toggle word wrap
출력은 시스템마다 약간 다를 수 있습니다.
  • 로그인 이름 열에는 Linux 사용자가 나열됩니다.
  • SELinux User 열에는 Linux 사용자가 매핑되는 SELinux 사용자가 나열됩니다. 프로세스의 경우 SELinux 사용자는 액세스할 수 있는 역할과 수준을 제한합니다.
  • MLS/MCS Range 열은 MLS(Multi-Level Security) 및 MCS(Multi-Category Security)에서 사용하는 수준입니다.
  • 서비스 열에는 Linux 사용자를 시스템에 로그인해야 하는 올바른 SELinux 컨텍스트가 결정됩니다. 기본적으로 별표(*) 문자는 모든 서비스를 나타냅니다.
역할
SELinux의 일부는 역할 기반 액세스 제어(RBAC) 보안 모델입니다. 역할은 RBAC의 속성입니다. SELinux 사용자에게는 역할에 대한 권한이 부여되며, 도메인에 대한 역할이 인증됩니다. 역할은 도메인과 SELinux 사용자 간의 중간 역할을 합니다. 입력할 수 있는 역할은 입력할 수 있는 도메인을 결정합니다. 궁극적으로 액세스할 수 있는 오브젝트 유형을 제어합니다. 이를 통해 권한 상승 공격의 취약점을 줄일 수 있습니다.
type
유형은 Type Enforcement의 속성입니다. 유형은 프로세스의 도메인 및 파일의 유형을 정의합니다. SELinux 정책 규칙은 유형에 액세스하는 도메인이든 다른 도메인에 액세스하는 도메인이든 관계없이 유형이 서로 액세스할 수 있는 방법을 정의합니다. 액세스는 허용하는 특정 SELinux 정책 규칙이 있는 경우에만 허용됩니다.
level
수준은 MLS 및 MCS의 속성입니다. MLS 범위는 수준이 다른 경우 하위 수준으로 작성되거나 수준이 동일한 경우 하위 수준 (s0-s0s0과 동일)으로 작성된 수준의 쌍입니다. 각 수준은 민감도 범주가 선택 사항인 민감도 범주 쌍입니다. 범주가 있는 경우 수준은 민감도:category-set 로 작성됩니다. 범주가 없으면 민감도 로 작성됩니다.
범주 세트가 연속된 시리즈인 경우 약어로 표시할 수 있습니다. 예를 들어 c0.c3c0,c1,c2,c3 과 동일합니다. /etc/selinux/targeted/setrans.conf 파일은 수준(s0:c0)을 사람이 읽을 수 있는 양식(즉 CompanyConfidential)으로 매핑합니다. Red Hat Enterprise Linux의 대상 정책은 MCS를 적용하고 MCS에서는 하나의 민감도 s0 에서만 적용됩니다. Red Hat Enterprise Linux의 MCS는 1024개의 카테고리를 지원합니다. c0 ~ c1023.s0-s0:c0.c1023 은 민감도 s0 이며 모든 카테고리에 대해 권한이 부여됩니다.
MLS는 LSPP(Labeled Security Protection Profile) 환경에서 사용됩니다. MLS 제한을 사용하려면 selinux-policy-mls 패키지를 설치하고 MLS를 기본 SELinux 정책으로 구성합니다. Red Hat Enterprise Linux와 함께 제공되는 MLS 정책은 평가된 구성에 포함되지 않은 많은 프로그램 도메인을 생략하므로 데스크탑 워크스테이션에서 MLS를 사용할 수 없습니다(X Window System에 대한 지원 없음). 그러나 모든 프로그램 도메인을 포함하는 업스트림 SELinux 참조 정책의 MLS 정책을 구축할 수 있습니다. MLS 구성에 대한 자세한 내용은 4.13절. “다단계 보안(MLS)” 을 참조하십시오.

2.1. 도메인 전환

한 도메인의 프로세스는 새 도메인의 진입점 유형이 있는 애플리케이션을 실행하여 다른 도메인으로 전환됩니다. 진입점 권한은 SELinux 정책에서 사용되며 도메인을 입력하는 데 사용할 수 있는 애플리케이션을 제어합니다. 다음 예제에서는 도메인 전환을 보여줍니다.

절차 2.1. 도메인 전환의 예

  1. 사용자가 암호를 변경하려고 합니다. 이를 위해 passwd 유틸리티를 실행합니다. /usr/bin/passwd 실행 파일은 passwd_exec_t 유형으로 레이블이 지정됩니다.
    ~]$ ls -Z /usr/bin/passwd
    -rwsr-xr-x  root root system_u:object_r:passwd_exec_t:s0 /usr/bin/passwd
    
    Copy to Clipboard Toggle word wrap
    passwd 유틸리티는 shadow_t 유형으로 레이블이 지정된 /etc/shadow 에 액세스합니다.
    ~]$ ls -Z /etc/shadow
    -r--------. root root system_u:object_r:shadow_t:s0    /etc/shadow
    
    Copy to Clipboard Toggle word wrap
  2. SELinux 정책 규칙은 passwd_t 도메인에서 실행되는 프로세스가 shadow_t 유형으로 레이블이 지정된 파일을 읽고 쓸 수 있음을 나타냅니다. shadow_t 유형은 암호 변경에 필요한 파일에만 적용됩니다. 여기에는 /etc/gshadow,/etc/shadow 및 해당 백업 파일이 포함됩니다.
  3. SELinux 정책 규칙은 passwd_t 도메인에 passwd_exec_t 유형으로 설정된 entrypoint 권한이 있음을 나타냅니다.
  4. 사용자가 passwd 유틸리티를 실행하면 사용자의 쉘 프로세스가 passwd_t 도메인으로 전환됩니다. SELinux에서는 기본 작업이 거부되며 passwd_t 도메인에서 실행 중인 애플리케이션이 shadow_t 유형으로 레이블이 지정된 파일에 액세스할 수 있도록 허용하는 규칙이 존재하므로 passwd 애플리케이션은 /etc/shadow 에 액세스하고 사용자 암호를 업데이트할 수 있습니다.
이 예제는 전체가 아니며 도메인 전환을 설명하는 데 기본 예제로 사용됩니다. passwd_t 도메인에서 실행 중인 주체가 shadow_t 파일 유형으로 레이블이 지정된 개체에 액세스할 수 있도록 하는 실제 규칙이 있지만 제목을 새 도메인으로 전환하려면 다른 SELinux 정책 규칙을 충족해야 합니다. 이 예제에서는 적용 유형으로 다음을 보장합니다.
  • passwd_t 도메인은 passwd_exec_t 유형으로 레이블이 지정된 애플리케이션을 실행하여만 입력할 수 있습니다. lib_t 유형과 같은 인증된 공유 라이브러리에서만 실행할 수 있으며 다른 애플리케이션을 실행할 수 없습니다.
  • passwd_t 와 같은 인증된 도메인만 shadow_t 유형으로 레이블이 지정된 파일에 쓸 수 있습니다. 다른 프로세스가 슈퍼유저 권한으로 실행 중인 경우에도 해당 프로세스는 passwd_t 도메인에서 실행되지 않으므로 shadow_t 유형으로 레이블이 지정된 파일에 쓸 수 없습니다.
  • 인증된 도메인만 passwd_t 도메인으로 전환할 수 있습니다. 예를 들어 sendmail _t 도메인에서 실행 중인 sendmail 프로세스에 passwd를 실행할 정당한 이유가 없으므로 passwd _t 도메인으로 전환할 수 없습니다.
  • passwd_t 도메인에서 실행되는 프로세스는 etc_t 또는 shadow_t 유형으로 레이블이 지정된 파일과 같이 권한 있는 유형만 읽고 쓸 수 있습니다. 이렇게 하면 passwd 애플리케이션이 임의의 파일을 읽거나 작성하지 못하도록 합니다.

2.2. 프로세스의 SELinux 컨텍스트

ps -eZ 명령을 사용하여 프로세스의 SELinux 컨텍스트를 확인합니다. 예를 들어 다음과 같습니다.

절차 2.2. passwd 유틸리티의 SELinux 컨텍스트 보기

  1. ApplicationsSystem ToolsTerminal 과 같은 터미널을 엽니다.
  2. passwd 유틸리티를 실행합니다. 새 암호를 입력하지 마십시오.
    ~]$ passwd
    Changing password for user user_name.
    Changing password for user_name.
    (current) UNIX password:
    
    Copy to Clipboard Toggle word wrap
  3. 새 탭 또는 다른 터미널을 열고 다음 명령을 입력합니다. 출력은 다음과 유사합니다.
    ~]$ ps -eZ | grep passwd
    unconfined_u:unconfined_r:passwd_t:s0-s0:c0.c1023 13212 pts/1 00:00:00 passwd
    
    Copy to Clipboard Toggle word wrap
  4. 첫 번째 탭/terminal에서 Ctrl+C 를 눌러 passwd 유틸리티를 취소합니다.
이 예에서 passwd 유틸리티( passwd_exec_t 유형으로 레이블이 지정됨)가 실행되면 사용자의 쉘 프로세스가 passwd_t 도메인으로 전환됩니다. 유형은 프로세스의 도메인 및 파일의 유형을 정의합니다.
실행 중인 모든 프로세스에 대한 SELinux 컨텍스트를 보려면 ps 유틸리티를 다시 실행합니다. 아래에 출력이 잘린 예가 있으며 시스템에 따라 다를 수 있습니다.
]$ ps -eZ 
system_u:system_r:dhcpc_t:s0             1869 ?  00:00:00 dhclient
system_u:system_r:sshd_t:s0-s0:c0.c1023  1882 ?  00:00:00 sshd
system_u:system_r:gpm_t:s0               1964 ?  00:00:00 gpm
system_u:system_r:crond_t:s0-s0:c0.c1023 1973 ?  00:00:00 crond
system_u:system_r:kerneloops_t:s0        1983 ?  00:00:05 kerneloops
system_u:system_r:crond_t:s0-s0:c0.c1023 1991 ?  00:00:00 atd
Copy to Clipboard Toggle word wrap
system_r 역할은 데몬과 같은 시스템 프로세스에 사용됩니다. Enforcement(강제)를 입력하고 각 도메인을 분리합니다.

2.3. 사용자의 SELinux 컨텍스트

다음 명령을 사용하여 Linux 사용자와 연결된 SELinux 컨텍스트를 확인합니다.
~]$ id -Z
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
Copy to Clipboard Toggle word wrap
Red Hat Enterprise Linux에서 Linux 사용자는 기본적으로 제한 없이 실행됩니다. 이 SELinux 컨텍스트는 Linux 사용자가 unconfined_r 역할로 실행되는 SELinux unconfined_u 사용자에게 매핑되고 있으며 unconfined_t 도메인에서 실행 중입니다. s0-s0 은 MLS 범위이며, 이 경우 s0 과 동일합니다. 사용자가 액세스할 수 있는 범주는 c0.c1023 에 의해 정의되며, 이는 모든 카테고리(c0 에서 c1023까지)로 정의됩니다.

3장. 대상 지정 정책

대상 지정 정책은 Red Hat Enterprise Linux에서 사용되는 기본 SELinux 정책입니다. 타겟 정책을 사용하는 경우 대상이 되는 프로세스는 제한된 도메인에서 실행되며, 타겟이 지정되지 않은 프로세스는 제한되지 않은 도메인에서 실행됩니다. 예를 들어 기본적으로 로그인된 사용자는 unconfined_t 도메인에서 실행되고, init run에 의해 시작된 시스템 프로세스는 unconfined_service_t 도메인에서 실행됩니다. 두 도메인 모두 제한되지 않습니다.
실행 가능 및 쓰기 가능한 메모리 검사는 제한된 도메인과 제한되지 않은 도메인 모두에 적용될 수 있습니다. 그러나 기본적으로 제한되지 않은 도메인에서 실행 중인 주체는 쓰기 가능한 메모리를 할당하고 실행할 수 있습니다. 이러한 메모리 검사는 런타임 시 SELinux 정책을 수정할 수 있는 부울을 설정하여 활성화할 수 있습니다. 부울 구성은 나중에 설명합니다.

3.1. 제한된 프로세스

sshd 또는 httpd 와 같은 네트워크에서 수신 대기하는 거의 모든 서비스는 Red Hat Enterprise Linux에서 제한됩니다. 또한 root 사용자로 실행하고 passwd 유틸리티와 같은 사용자에 대한 작업을 수행하는 대부분의 프로세스는 제한됩니다. 프로세스가 제한되면 httpd_t 도메인에서 실행되는 httpd 프로세스와 같이 자체 도메인에서 실행됩니다. SELinux 정책 구성에 따라 공격자가 제한된 프로세스가 손상되면 공격자가 리소스에 대한 액세스와 가능한 손상을 제한합니다.
SELinux가 활성화되어 시스템이 다음 예제를 수행할 준비가 되었는지 확인하려면 다음 절차를 완료합니다.

절차 3.1. SELinux 상태를 확인하는 방법

  1. SELinux가 활성화되어 있고 강제 모드로 실행 중이며 타겟 정책이 사용 중인지 확인합니다. 올바른 출력은 아래 출력과 유사해야 합니다.
    ~]$ sestatus
    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:      30
    Copy to Clipboard Toggle word wrap
    SELinux 모드 변경에 대한 자세한 내용은 4.4절. “SELinux 상태 및 모드의 영구 변경” 을 참조하십시오.
  2. root 로서 /var/www/html/ 디렉터리에 파일을 생성합니다.
    ~]# touch /var/www/html/testfile
    Copy to Clipboard Toggle word wrap
  3. 새로 생성된 파일의 SELinux 컨텍스트를 보려면 다음 명령을 입력합니다.
    ~]$ ls -Z /var/www/html/testfile
    -rw-r--r--  root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/testfile
    
    Copy to Clipboard Toggle word wrap
    기본적으로 Linux 사용자는 Red Hat Enterprise Linux에서 제한되지 않습니다. 따라서 testfile 파일은 SELinux unconfined_u 사용자로 레이블이 지정됩니다. RBAC는 파일이 아닌 프로세스에 사용됩니다. 역할에는 파일에 대한 의미가 없습니다. object_r 역할은 파일(영구 스토리지 및 네트워크 파일 시스템에서)에 사용되는 일반 역할입니다. /proc 디렉터리에서 프로세스와 관련된 파일은 system_r 역할을 사용할 수 있습니다. httpd_sys_content_t 유형을 사용하면 httpd 프로세스가 이 파일에 액세스할 수 있습니다.
다음 예제에서는 SELinux가 Apache HTTP Server(httpd)가 Samba에서 사용하기 위한 파일과 같이 올바르게 레이블이 지정되지 않은 파일을 읽지 못하도록 하는 방법을 보여줍니다. 이는 예제이며 프로덕션에서 사용해서는 안 됩니다. httpdwget 패키지가 설치되어 있고, SELinux 대상 지정 정책이 사용되며 SELinux가 강제 모드로 실행 중이라고 가정합니다.

절차 3.2. 제한된 프로세스의 예

  1. root 로 httpd 데몬을 시작합니다.
    ~]# systemctl start httpd.service
    Copy to Clipboard Toggle word wrap
    서비스가 실행 중인지 확인합니다. 출력에는 아래 정보가 포함되어야 합니다(시간 스탬프만 다릅니다).
    ~]$ systemctl status httpd.service
    httpd.service - The Apache HTTP Server
    	  Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled)
    	  Active: active (running) since Mon 2013-08-05 14:00:55 CEST; 8s ago
    
    Copy to Clipboard Toggle word wrap
  2. Linux 사용자가 에 대한 쓰기 액세스 권한이 있는 디렉터리로 변경하고 다음 명령을 입력합니다. 기본 구성을 변경하지 않는 한 이 명령은 성공합니다.
    ~]$ wget http://localhost/testfile
    --2009-11-06 17:43:01--  http://localhost/testfile
    Resolving localhost... 127.0.0.1
    Connecting to localhost|127.0.0.1|:80... connected.
    HTTP request sent, awaiting response... 200 OK
    Length: 0 [text/plain]
    Saving to: `testfile'
    
    [ <=>                              ] 0     --.-K/s   in 0s
    
    2009-11-06 17:43:01 (0.00 B/s) - `testfile' saved [0/0]
    
    Copy to Clipboard Toggle word wrap
  3. chcon 명령은 파일의 레이블을 다시 지정하지만 파일 시스템의 레이블을 다시 지정할 때 이러한 레이블 변경 사항은 유지되지 않습니다. 파일 시스템 재레이블 후에도 유지되는 영구 변경 사항은 나중에 설명하는 semanage 유틸리티를 사용합니다. root로 다음 명령을 입력하여 유형을 Samba에서 사용하는 유형으로 변경합니다.
    ~]# chcon -t samba_share_t /var/www/html/testfile
    Copy to Clipboard Toggle word wrap
    변경 사항을 보려면 다음 명령을 입력합니다.
    ~]$ ls -Z /var/www/html/testfile
    -rw-r--r--  root root unconfined_u:object_r:samba_share_t:s0 /var/www/html/testfile
    
    Copy to Clipboard Toggle word wrap
  4. 현재 DAC 권한을 사용하면 httpd 프로세스에서 testfile 에 액세스할 수 있습니다. 사용자가 쓰기 액세스 권한이 있는 디렉터리로 변경하고 다음 명령을 입력합니다. 기본 구성을 변경하지 않는 한 이 명령은 실패합니다.
    ~]$ wget http://localhost/testfile
    --2009-11-06 14:11:23--  http://localhost/testfile
    Resolving localhost... 127.0.0.1
    Connecting to localhost|127.0.0.1|:80... connected.
    HTTP request sent, awaiting response... 403 Forbidden
    2009-11-06 14:11:23 ERROR 403: Forbidden.
    
    Copy to Clipboard Toggle word wrap
  5. root 로서 testfile 제거 :
    ~]# rm -i /var/www/html/testfile
    Copy to Clipboard Toggle word wrap
  6. httpd 를 실행할 필요가 없는 경우 root로 다음 명령을 입력하여 중지합니다.
    ~]# systemctl stop httpd.service
    Copy to Clipboard Toggle word wrap
이 예에서는 SELinux에서 추가된 추가 보안을 보여줍니다. DAC 규칙에 따라 2단계에서 testfile 에 대한 액세스를 처리할 수 있지만 파일이 httpd 프로세스에 액세스할 수 없는 유형으로 레이블이 지정되었기 때문에 SELinux는 액세스를 거부했습니다.
auditd 데몬이 실행 중인 경우 다음과 유사한 오류가 /var/log/audit/audit.log:에 기록됩니다.
type=AVC msg=audit(1220706212.937:70): avc:  denied  { getattr } for  pid=1904 comm="httpd" path="/var/www/html/testfile" dev=sda5 ino=247576 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:samba_share_t:s0  tclass=file

type=SYSCALL msg=audit(1220706212.937:70): arch=40000003 syscall=196 success=no exit=-13 a0=b9e21da0 a1=bf9581dc a2=555ff4 a3=2008171 items=0 ppid=1902 pid=1904 auid=500 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=1 comm="httpd" exe="/usr/sbin/httpd" subj=unconfined_u:system_r:httpd_t:s0 key=(null)
Copy to Clipboard Toggle word wrap
또한 다음과 유사한 오류는 /var/log/httpd/error_log 에 기록됩니다.
[Wed May 06 23:00:54 2009] [error] [client 127.0.0.1] (13)Permission denied: access to /testfile denied
Copy to Clipboard Toggle word wrap

3.2. 제한되지 않은 프로세스

제한되지 않은 프로세스는 제한되지 않은 도메인에서 실행됩니다(예: init 에 의해 실행되는 제한되지 않은 서비스) unconfined_service_t 도메인, 커널에서 실행한 unconfined 서비스는 결국 kernel_t 도메인에서 실행되며, unconfined Linux 사용자가 실행한 unconfined_t 도메인은 결국 unconfined_t 도메인에서 실행됩니다. 제한되지 않은 프로세스의 경우 SELinux 정책 규칙이 적용되지만 제한되지 않은 도메인에서 실행되는 프로세스가 거의 모든 액세스를 허용하는 정책 규칙이 있습니다. 제한되지 않은 도메인에서 실행되는 프로세스는 DAC 규칙을 독점적으로 사용하는 것으로 대체됩니다. 제한되지 않은 프로세스가 손상되면 SELinux를 통해 공격자가 시스템 리소스 및 데이터에 대한 액세스 권한을 얻지 못하지만 물론 DAC 규칙이 계속 사용됩니다. SELinux는 DAC 규칙의 보안 개선 사항이므로 대체되지 않습니다.
SELinux가 활성화되고 시스템이 다음 예제를 수행할 준비가 되었는지 확인하려면 3.1절. “제한된 프로세스” 에 설명된 절차 3.1. “SELinux 상태를 확인하는 방법” 을(를) 완료합니다.
다음 예제에서는 제한되지 않은 를 실행할 때 Apache HTTP Server(httpd)가 Samba에서 사용하기 위한 데이터에 액세스하는 방법을 보여줍니다. Red Hat Enterprise Linux에서 httpd 프로세스는 기본적으로 제한된 httpd_t 도메인에서 실행됩니다. 이는 예제이며 프로덕션에서 사용해서는 안 됩니다. httpd,wget,dbusaudit 패키지가 설치되어 있고, SELinux 대상 지정 정책이 사용되며 SELinux가 강제 모드로 실행 중이라고 가정합니다.

절차 3.3. 제한되지 않은 프로세스의 예

  1. chcon 명령은 파일의 레이블을 다시 지정하지만 파일 시스템의 레이블을 다시 지정할 때 이러한 레이블 변경 사항은 유지되지 않습니다. 파일 시스템 재레이블 후에도 유지되는 영구 변경 사항은 나중에 설명하는 semanage 유틸리티를 사용합니다. root 사용자로 다음 명령을 입력하여 유형을 Samba에서 사용하는 유형으로 변경합니다.
    ~]# chcon -t samba_share_t /var/www/html/testfile
    Copy to Clipboard Toggle word wrap
    변경 사항을 확인합니다.
    ~]$ ls -Z /var/www/html/testfile
    -rw-r--r--  root root unconfined_u:object_r:samba_share_t:s0 /var/www/html/testfile
    Copy to Clipboard Toggle word wrap
  2. 다음 명령을 입력하여 httpd 프로세스가 실행 중이 아닌지 확인합니다.
    ~]$ systemctl status httpd.service
    httpd.service - The Apache HTTP Server
       Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled)
       Active: inactive (dead)
    Copy to Clipboard Toggle word wrap
    출력이 다른 경우 root로 다음 명령을 입력하여 httpd 프로세스를 중지합니다.
    ~]# systemctl stop httpd.service
    Copy to Clipboard Toggle word wrap
  3. httpd 프로세스가 unconfined를 실행하도록 하려면 root로 다음 명령을 입력하여 /usr/sbin/httpd 파일의 유형을 제한된 도메인으로 전환하지 않는 유형으로 변경합니다.
    ~]# chcon -t bin_t /usr/sbin/httpd
    Copy to Clipboard Toggle word wrap
  4. /usr/sbin/httpdbin_t 유형으로 레이블이 지정되어 있는지 확인합니다.
    ~]$ ls -Z /usr/sbin/httpd
    -rwxr-xr-x. root root system_u:object_r:bin_t:s0       /usr/sbin/httpd
    
    Copy to Clipboard Toggle word wrap
  5. root 로 httpd 프로세스를 시작하고 성공적으로 시작되었는지 확인합니다.
    ~]# systemctl start httpd.service
    Copy to Clipboard Toggle word wrap
    ~]# systemctl status httpd.service
    httpd.service - The Apache HTTP Server
       Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled)
       Active: active (running) since Thu 2013-08-15 11:17:01 CEST; 5s ago
    
    Copy to Clipboard Toggle word wrap
  6. 다음 명령을 입력하여 unconfined_service_t 도메인에서 실행 중인 httpd 를 확인합니다.
    ~]$ ps -eZ | grep httpd
    system_u:system_r:unconfined_service_t:s0 11884 ? 00:00:00 httpd
    system_u:system_r:unconfined_service_t:s0 11885 ? 00:00:00 httpd
    system_u:system_r:unconfined_service_t:s0 11886 ? 00:00:00 httpd
    system_u:system_r:unconfined_service_t:s0 11887 ? 00:00:00 httpd
    system_u:system_r:unconfined_service_t:s0 11888 ? 00:00:00 httpd
    system_u:system_r:unconfined_service_t:s0 11889 ? 00:00:00 httpd
    
    Copy to Clipboard Toggle word wrap
  7. Linux 사용자가 에 대한 쓰기 액세스 권한이 있는 디렉터리로 변경하고 다음 명령을 입력합니다. 기본 구성을 변경하지 않는 한 이 명령은 성공합니다.
    ~]$ wget http://localhost/testfile
    --2009-05-07 01:41:10--  http://localhost/testfile
    Resolving localhost... 127.0.0.1
    Connecting to localhost|127.0.0.1|:80... connected.
    HTTP request sent, awaiting response... 200 OK
    Length: 0 [text/plain]
    Saving to: `testfile'
    
    [ <=>                            ]--.-K/s   in 0s
    
    2009-05-07 01:41:10 (0.00 B/s) - `testfile' saved [0/0]
    Copy to Clipboard Toggle word wrap
    httpd 프로세스는 samba_share_t 유형으로 레이블이 지정된 파일에 액세스할 수 없지만 httpd 는 제한되지 않은 unconfined_service_t 도메인에서 실행 중이며 DAC 규칙을 사용하므로 wget 명령이 성공합니다. 제한된 httpd _t 도메인에서 httpd가 실행 중이었으므로 wget 명령이 실패했습니다.
  8. restorecon 유틸리티는 파일의 기본 SELinux 컨텍스트를 복원합니다. root 로서 다음 명령을 입력하여 /usr/sbin/httpd:의 기본 SELinux 컨텍스트를 복원합니다.
    ~]# restorecon -v /usr/sbin/httpd
    restorecon reset /usr/sbin/httpd context system_u:object_r:unconfined_exec_t:s0->system_u:object_r:httpd_exec_t:s0
    
    Copy to Clipboard Toggle word wrap
    /usr/sbin/httpdhttpd_exec_t 유형으로 레이블이 지정되어 있는지 확인합니다.
    ~]$ ls -Z /usr/sbin/httpd
    -rwxr-xr-x  root root system_u:object_r:httpd_exec_t:s0 /usr/sbin/httpd
    Copy to Clipboard Toggle word wrap
  9. root 로 다음 명령을 입력하여 httpd 를 다시 시작합니다. 다시 시작한 후 httpd 가 제한된 httpd_t 도메인에서 실행 중인지 확인합니다.
    ~]# systemctl restart httpd.service
    Copy to Clipboard Toggle word wrap
    ~]$ ps -eZ | grep httpd
    system_u:system_r:httpd_t:s0    8883 ?        00:00:00 httpd
    system_u:system_r:httpd_t:s0    8884 ?        00:00:00 httpd
    system_u:system_r:httpd_t:s0    8885 ?        00:00:00 httpd
    system_u:system_r:httpd_t:s0    8886 ?        00:00:00 httpd
    system_u:system_r:httpd_t:s0    8887 ?        00:00:00 httpd
    system_u:system_r:httpd_t:s0    8888 ?        00:00:00 httpd
    system_u:system_r:httpd_t:s0    8889 ?        00:00:00 httpd
    
    Copy to Clipboard Toggle word wrap
  10. root 로서 testfile 제거 :
    ~]# rm -i /var/www/html/testfile
    rm: remove regular empty file `/var/www/html/testfile'? y
    
    Copy to Clipboard Toggle word wrap
  11. httpd 를 실행할 필요가 없는 경우 root로 다음 명령을 입력하여 httpd 를 중지합니다.
    ~]# systemctl stop httpd.service
    Copy to Clipboard Toggle word wrap
이 섹션의 예제에서는 손상된 제한된 프로세스(SELinux로 보호)로부터 데이터를 보호할 수 있는 방법과 공격자가 손상된 제한 프로세스(SELinux에 의해 보호되지 않음)로부터 데이터를 더 효과적으로 액세스할 수 있는 방법을 보여줍니다.

3.3. 제한된 사용자 및 제한되지 않은 사용자

각 Linux 사용자는 SELinux 정책을 사용하여 SELinux 사용자에게 매핑됩니다. 이를 통해 Linux 사용자는 SELinux 사용자에 대한 제한을 상속할 수 있습니다. 이 Linux 사용자 매핑은 semanage login -l 명령을 root로 실행하면 표시됩니다.
~]# semanage login -l

Login Name           SELinux User         MLS/MCS Range        Service

__default__          unconfined_u         s0-s0:c0.c1023       *
root                 unconfined_u         s0-s0:c0.c1023       *
system_u             system_u             s0-s0:c0.c1023       *
Copy to Clipboard Toggle word wrap
Red Hat Enterprise Linux에서 Linux 사용자는 기본적으로 SELinux __default__ 로그인에 매핑되며 SELinux unconfined_u 사용자에게 매핑됩니다. 다음 행은 기본 매핑을 정의합니다.
__default__               unconfined_u              s0-s0:c0.c1023
Copy to Clipboard Toggle word wrap
다음 절차에서는 시스템에 새 Linux 사용자를 추가하는 방법과 해당 사용자를 SELinux unconfined_u 사용자에게 매핑하는 방법을 보여줍니다. root 사용자가 Red Hat Enterprise Linux에서 기본적으로 수행되므로 제한되지 않은 것으로 가정합니다.

절차 3.4. 새 Linux 사용자를 SELinux unconfined_u 사용자에게 매핑

  1. root 로서 다음 명령을 입력하여 newuser:이라는 새 Linux 사용자를 생성합니다.
    ~]# useradd newuser
    Copy to Clipboard Toggle word wrap
  2. Linux newuser 사용자에게 암호를 할당하려면 다음을 수행합니다. root로 다음 명령을 입력합니다.
    ~]# passwd newuser
    Changing password for user newuser.
    New UNIX password: Enter a password
    Retype new UNIX password: Enter the same password again
    passwd: all authentication tokens updated successfully.
    
    Copy to Clipboard Toggle word wrap
  3. 현재 세션에서 로그아웃한 후 Linux newuser 사용자로 로그인합니다. 로그인할 때 pam_selinux PAM 모듈은 Linux 사용자를 SELinux 사용자(이 경우 unconfined_u)에 자동으로 매핑하고 결과 SELinux 컨텍스트를 설정합니다. 그런 다음 Linux 사용자의 쉘이 이 컨텍스트를 사용하여 시작됩니다. 다음 명령을 입력하여 Linux 사용자의 컨텍스트를 확인합니다.
    [newuser@localhost ~]$ id -Z
    unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
    
    Copy to Clipboard Toggle word wrap
    참고
    시스템에서 newuser 사용자가 더 이상 필요하지 않은 경우 Linux newuser 's 세션에서 로그아웃하고 계정으로 로그인하여 root로 userdel -r newuser 명령을 실행합니다. newuser 는 홈 디렉토리와 함께 제거됩니다.
제한된 Linux 사용자 및 제한되지 않은 Linux 사용자는 실행 가능하고 쓰기 가능한 메모리 검사의 영향을 받으며 MCS 또는 MLS에도 제한됩니다.
사용 가능한 SELinux 사용자를 나열하려면 다음 명령을 입력합니다.
~]$seinfo -u
Users: 8
   sysadm_u
   system_u
   xguest_u
   root
   guest_u
   staff_u
   user_u
   unconfined_u
Copy to Clipboard Toggle word wrap
seinfo 명령은 기본적으로 설치되지 않는 setools-console 패키지에서 제공합니다.
제한되지 않은 Linux 사용자가 SELinux 정책이 unconfined_t 도메인에서 자체 제한된 도메인으로 전환할 수 있는 애플리케이션으로 정의되는 애플리케이션을 실행하는 경우 제한되지 않은 Linux 사용자에게는 여전히 해당 제한된 도메인의 제한 사항이 적용됩니다. 이 경우의 보안 이점은 Linux 사용자가 제한되지 않고 있는 경우에도 애플리케이션이 제한되어 있다는 것입니다. 따라서 애플리케이션에서 결함을 악용하는 것은 정책에 의해 제한될 수 있습니다.
마찬가지로 제한된 사용자에게 이러한 검사를 적용할 수 있습니다. 제한된 각 Linux 사용자는 제한된 사용자 도메인에 의해 제한됩니다. SELinux 정책은 제한된 사용자 도메인에서 대상 제한 도메인으로의 전환을 정의할 수도 있습니다. 이러한 경우 제한된 Linux 사용자에게는 해당 대상 제한된 도메인의 제한 사항이 적용됩니다. 주요 점은 특별 권한이 역할에 따라 제한된 사용자와 연결되어 있다는 것입니다. 아래 표에서는 Red Hat Enterprise Linux의 Linux 사용자를 위한 기본 제한된 도메인의 예를 확인할 수 있습니다.
Expand
표 3.1. SELinux 사용자 기능
사용자 Role 도메인 X 윈도우 시스템 su 또는 sudo 홈 디렉토리 및 /tmp에서 실행 (기본값) 네트워킹
sysadm_u sysadm_r sysadm_t 제공됨 Su sudo 제공됨 제공됨
staff_u staff_r staff_t 제공됨 sudo 제공됨 제공됨
user_u user_r user_t 제공됨 제공되지 않음 제공됨 제공됨
guest_u guest_r guest_t 제공되지 않음 제공되지 않음 제공됨 제공되지 않음
xguest_u xguest_r xguest_t 제공됨 제공되지 않음 제공됨 Firefox만
  • SELinux 정책에서 허용하는 경우 user_t,guest_t, xguest_t 도메인의 Linux 사용자는 설정된 사용자 ID(setuid) 애플리케이션만 실행할 수 있습니다(예: passwd). 이러한 사용자는 susudo setuid 애플리케이션을 실행할 수 없으므로 이러한 애플리케이션을 사용하여 root가 될 수 없습니다.
  • EgressIP_t ,staff _t ,user_t, xguest_t 도메인의 Linux 사용자는 X Window System 및 터미널을 사용하여 로그인할 수 있습니다.
  • 기본적으로 staff_t,user_t, guest_t , xguest_t 도메인의 Linux 사용자는 홈 디렉터리 및 /tmp 에서 애플리케이션을 실행할 수 있습니다. 사용자의 권한을 상속하는 애플리케이션이 실행되지 않도록 하려면 쓰기 액세스 권한이 있는 디렉터리에서 guest_exec_content 및 x guest_exec_content 부울을 off 로 설정합니다. 이를 통해 결함이 있는 애플리케이션 또는 악성 애플리케이션이 사용자의 파일을 수정하지 못하도록 방지할 수 있습니다.
    사용자가 홈 디렉터리 및 /tmp 에서 애플리케이션을 실행하지 못하도록 허용 및 방지하는 방법에 대한 자세한 내용은 6.6절. “사용자 애플리케이션 실행 부울” 을 참조하십시오.
  • xguest_t 도메인에 있는 유일한 네트워크 액세스 Linux 사용자는 Firefox 가 웹 페이지에 연결하는 것입니다.
system_u 는 시스템 프로세스 및 오브젝트의 특수 사용자 ID입니다. Linux 사용자와 연결하면 안 됩니다. 또한 unconfined_uroot 는 제한되지 않은 사용자입니다. 이러한 이유로 앞서 언급한 SELinux 사용자 기능 테이블에 포함되지 않습니다.
이미 언급한 SELinux 사용자와 함께 해당 사용자에게 매핑할 수 있는 특별한 역할이 있습니다. 이러한 역할은 SELinux에서 사용자가 수행할 수 있는 작업을 결정합니다.
  • webadm_r 는 Apache HTTP 서버와 관련된 SELinux 유형만 관리할 수 있습니다. 자세한 내용은 13.2절. “유형” 을 참조하십시오.
  • dbadm_r 는 MariaDB 데이터베이스 및 PostgreSQL 데이터베이스 관리 시스템과 관련된 SELinux 유형만 관리할 수 있습니다. 자세한 내용은 20.2절. “유형”21.2절. “유형” 을 참조하십시오.
  • logadm_rsyslogauditlog 프로세스와 관련된 SELinux 유형만 관리할 수 있습니다.
  • secadm_r 은 SELinux만 관리할 수 있습니다.
  • audit adm_r 은 감사 하위 시스템과 관련된 프로세스만 관리할 수 있습니다.
사용 가능한 역할을 모두 나열하려면 다음 명령을 입력합니다.
~]$ seinfo -r
Copy to Clipboard Toggle word wrap
앞에서 언급했듯이 seinfo 명령은 기본적으로 설치되지 않은 setools-console 패키지에서 제공합니다.

3.3.1. sudo 전환 및 SELinux 역할

경우에 따라 제한된 사용자는 root 권한이 필요한 관리 작업을 수행해야 합니다. 이렇게 하려면 제한된 사용자가 sudo 명령을 사용하여 제한된 관리자 SELinux 역할을 받아야 합니다. sudo 명령은 신뢰할 수 있는 사용자에게 관리 액세스 권한을 제공하는 데 사용됩니다. 사용자가 sudo 를 사용하여 관리 명령에 우선하면 고유한 암호를 입력하라는 메시지가 표시됩니다. 그런 다음, 인증되고 명령이 허용되었다고 가정하면 root 사용자인 것처럼 관리 명령이 실행됩니다.
표 3.1. “SELinux 사용자 기능” 에 표시된 대로 staff_usysadm_u SELinux 제한 사용자만 기본적으로 sudo 를 사용할 수 있습니다. 이러한 사용자가 sudo 로 명령을 실행하는 경우 /etc/sudoers 구성 파일에 지정된 규칙 또는 이러한 파일이 있는 경우 /etc/ sudoers.d/ 디렉터리의 해당 파일에 따라 해당 역할을 변경할 수 있습니다.

절차 3.5. sudo 전환 구성

다음 절차에서는 default_role_r 에서 administrator_r 관리자 역할로 새로 생성된 SELinux_user_u 제한된 사용자를 전환하도록 sudo 를 설정하는 방법을 보여줍니다.
참고
기존 SELinux 사용자에 대해 제한된 관리자 역할을 구성하려면 처음 두 단계를 건너뜁니다.
  1. 새 SELinux 사용자를 생성하고 이 사용자에 대한 기본 SELinux 역할 및 제한된 관리자 역할을 지정합니다.
    ~]# semanage user -a -r s0-s0:c0.c1023 -R "default_role_r administrator_r" SELinux_user_u
    Copy to Clipboard Toggle word wrap
  2. 기본 SElinux 정책 컨텍스트 파일을 설정합니다. 예를 들어 staff_u SELinux 사용자와 동일한 SELinux 규칙을 사용하려면 staff_u 컨텍스트 파일을 복사합니다.
    ~]# cp /etc/selinux/targeted/contexts/users/staff_u /etc/selinux/targeted/contexts/users/SELinux_user_u
    Copy to Clipboard Toggle word wrap
  3. 새로 생성된 SELinux 사용자를 기존 Linux 사용자에게 매핑합니다.
    semanage login -a -s SELinux_user_u -rs0:c0.c1023 linux_user
    Copy to Clipboard Toggle word wrap
  4. /etc/sudoers.d/ 디렉터리에 Linux 사용자와 동일한 이름으로 새 구성 파일을 생성하고 여기에 다음 문자열을 추가합니다.
    ~]# echo "linux_user ALL=(ALL) TYPE=administrator_t ROLE=administrator_r /bin/bash " > /etc/sudoers.d/linux_user
    Copy to Clipboard Toggle word wrap
  5. restorecon 유틸리티를 사용하여 linux_user 홈 디렉터리의 레이블을 다시 지정합니다.
    ~]# restorecon -FR -v /home/linux_user
    Copy to Clipboard Toggle word wrap
  6. 새로 생성된 Linux 사용자로 시스템에 로그인하고 사용자가 기본 SELinux 역할로 레이블이 지정되어 있는지 확인합니다.
    ~]$ id -Z
    SELinux_user_u:default_role_r:SELinux_user_t:s0:c0.c1023
    Copy to Clipboard Toggle word wrap
  7. sudo 를 실행하여 사용자의 SELinux 컨텍스트를 /etc/sudoers.d/linux_user 에 지정된 대로 보조 SELinux 역할로 변경합니다. sudo 와 함께 사용되는 -i 옵션은 대화형 쉘이 실행되도록 합니다.
    ~]$ sudo -i
    ~]# id -Z
    SELinux_user_u:administrator_r:administrator_t:s0:c0.c1023
    Copy to Clipboard Toggle word wrap
default_role_r 또는 administrator_r 와 같은 자리 표시자를 더 잘 이해하려면 다음 예제를 참조하십시오.

예 3.1. sudo 전환 구성

이 예제에서는 기본 역할 staff _r 이 할당된 새 SELinux 사용자 restricted_u 를 생성하고 sudo 를 사용하여 limited _u의 역할을 staff_ r 에서 webadm_r 로 변경하도록 구성됩니다.
  • sysadm_r 또는 unconfined_r 역할의 root 사용자로 다음 명령을 모두 입력합니다.
    ~]# semanage user -a -r s0-s0:c0.c1023 -R "staff_r webadm_r" confined_u
    ~]# cp /etc/selinux/targeted/contexts/users/staff_u /etc/selinux/targeted/contexts/users/confined_u
    ~]# semanage login -a -s confined_u -rs0:c0.c1023 linux_user
    ~]# restorecon -FR -v /home/linux_user
    ~]# echo "linux_user ALL=(ALL) ROLE=webadm_r TYPE=webadm_t /bin/bash " > /etc/sudoers.d/linux_user
    Copy to Clipboard Toggle word wrap
  • 새로 생성된 Linux 사용자로 시스템에 로그인하고 사용자가 기본 SELinux 역할로 레이블이 지정되어 있는지 확인합니다.
    ~]$ id -Z
    confined_u:staff_r:staff_t:s0:c0.c1023
    ~]$ sudo -i
    ~]# id -Z
    confined_u:webadm_r:webadm_t:s0:c0.c1023
    
    Copy to Clipboard Toggle word wrap

4장. SELinux 작업

다음 섹션에서는 Red Hat Enterprise Linux의 기본 SELinux 패키지 설치 및 업데이트, 패키지 설치 및 업데이트, 기본 SELinux 구성 파일, SELinux 모드 활성화 및 비활성화, 부울 모드, 파일 및 디렉터리 레이블을 일시적으로 변경, 마운트 명령으로 파일 시스템 레이블 덮어쓰기, NFS 볼륨 마운트, 파일 및 디렉토리를 보존할 때 SELinux 컨텍스트를 보존하는 방법을 간략하게 설명합니다.

4.1. SELinux 패키지

Red Hat Enterprise Linux 전체 설치에서 SELinux 패키지는 설치 중에 수동으로 제외되지 않는 한 기본적으로 설치됩니다. 텍스트 모드에서 최소 설치를 수행하는 경우 policycoreutils-pythonpolicycoreutils-gui 패키지가 기본적으로 설치되지 않습니다. 또한 기본적으로 SELinux는 강제 모드로 실행되며 SELinux 대상 지정 정책이 사용됩니다. 기본적으로 다음 SELinux 패키지가 시스템에 설치되어 있습니다.
  • policycoreutils 는 SELinux 운영 및 관리를 위해 restorecon,secon,setfiles,semodule,load_policy, setsebool 과 같은 유틸리티를 제공합니다.
  • selinux-policy 는 에 기본 디렉터리 구조, selinux-policy.conf 파일 및 RPM 매크로를 제공합니다.
  • selinux-policy-targeted 는 SELinux 대상 정책을 제공합니다.
  • libselinux - SELinux 애플리케이션을 위한 API를 제공합니다.
  • libselinux-utilsavcstat,getenforce,getsebool,matchpathcon,selinuxconlist,selinuxdefcon,selinuxenabled, setenforce 유틸리티를 제공합니다.
  • libselinux-python 은 SELinux 애플리케이션을 개발하기 위한 Python 바인딩을 제공합니다.
다음 패키지는 기본적으로 설치되지 않지만 yum install < package-name> 명령을 실행하여 선택적으로 설치할 수 있습니다.
  • selinux-policy-devel 은 사용자 지정 SELinux 정책 및 정책 모듈을 생성하는 유틸리티를 제공합니다.
  • selinux-policy-doc 는 SELinux를 다양한 서비스와 함께 구성하는 방법을 설명하는 도움말 페이지를 제공합니다.
  • selinux-policy-✓s 는 MLS(Multi-Level Security) SELinux 정책을 제공합니다.
  • setroubleshoot-server 는 SELinux에서 액세스를 거부할 때 생성되는 거부 메시지를 이 패키지에 제공된 sealert 유틸리티를 사용하여 볼 수 있는 자세한 설명으로 변환합니다.
  • setools-console 은 Tresys Technology SETools 배포, 정책 분석 및 쿼리, 로그 모니터링 및 보고, 파일 컨텍스트 관리를 위한 많은 유틸리티 및 라이브러리를 제공합니다. setools 패키지는 SETools의 메타 패키지입니다. setools-gui 패키지는 apolseaudit 유틸리티를 제공합니다. setools-console 패키지는 sechecker,sediff,seinfo,sesearchfindcon 명령줄 유틸리티를 제공합니다. setoolssetools-gui 패키지는 Red Hat Network Optional 채널이 활성화된 경우에만 사용할 수 있습니다. 자세한 내용은 지원 범위 세부 정보를 참조하십시오.
  • mcstranss0-s0:c0.c1023 과 같은 수준을 SystemLow-SystemHigh 와 같이 더 읽기 쉬운 형식으로 변환합니다.
  • policycoreutils-python 은 SELinux 운영 및 관리를 위해 semanage,audit2allow,audit2why, chcat 과 같은 유틸리티를 제공합니다.
  • policycoreutils-gui 는 SELinux를 관리하기 위한 그래픽 유틸리티인 system-config-selinux 를 제공합니다.

4.2. 사용된 로그 파일은 무엇입니까?

Red Hat Enterprise Linux에서는 기본 패키지 선택에서 제거되지 않는 한 dbusaudit 패키지가 기본적으로 설치됩니다. setroubleshoot-server 는 Yum을 사용하여 설치해야 합니다( yum install setroubleshoot-server 명령 사용).
auditd 데몬이 실행 중인 경우 다음과 같은 SELinux 거부 메시지가 기본적으로 /var/log/audit/audit.log 에 기록됩니다.
type=AVC msg=audit(1223024155.684:49): avc:  denied  { getattr } for  pid=2000 comm="httpd" path="/var/www/html/file1" dev=dm-0 ino=399185 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=system_u:object_r:samba_share_t:s0 tclass=file
Copy to Clipboard Toggle word wrap
또한 다음과 유사한 메시지는 /var/log/message 파일에 기록됩니다.
May 7 18:55:56 localhost setroubleshoot: SELinux is preventing httpd (httpd_t) "getattr" to /var/www/html/file1 (samba_share_t). For complete SELinux messages. run sealert -l de7e30d6-5488-466d-a606-92c9f40d316d
Copy to Clipboard Toggle word wrap
Red Hat Enterprise Linux 7에서 setroubleshootd 는 더 이상 지속적으로 서비스로 실행되지 않습니다. 그러나 여전히 AVC 메시지를 분석하는 데 사용됩니다. 필요한 경우 두 개의 새 프로그램이 setroubleshoot 을 시작하는 방법으로 작동합니다.
  • sedispatch 유틸리티는 감사 하위 시스템의 일부로 실행됩니다. AVC 거부 메시지가 반환되면 sedispatchdbus 를 사용하여 메시지를 보냅니다. 이러한 메시지는 이미 실행 중인 경우 setroubleshootd 로 바로 이동합니다. 실행 중이 아니면 sedispatch 가 자동으로 시작됩니다.
  • seapplet 유틸리티는 시스템 도구 모음에서 실행되며 setroubleshootd 의 dbus 메시지를 기다립니다. 알림 도구가 시작되어 사용자가 AVC 메시지를 검토할 수 있습니다.

절차 4.1. 자동으로 데몬 시작

  1. 부팅 시 자동으로 시작되도록 auditdrsyslog 데몬을 구성하려면 root 사용자로 다음 명령을 입력합니다.
    ~]# systemctl enable auditd.service
    Copy to Clipboard Toggle word wrap
    ~]# systemctl enable rsyslog.service
    Copy to Clipboard Toggle word wrap
  2. 데몬이 활성화되었는지 확인하려면 쉘 프롬프트에 다음 명령을 입력합니다.
    ~]$ systemctl is-enabled auditd
    enabled
    
    Copy to Clipboard Toggle word wrap
    ~]$ systemctl is-enabled rsyslog
    enabled
    
    Copy to Clipboard Toggle word wrap
    또는 systemctl status service-name.service 명령을 사용하고 명령 출력에서 활성화된 키워드를 검색합니다. 예를 들면 다음과 같습니다.
    ~]$ systemctl status auditd.service | grep enabled
    auditd.service - Security Auditing Service
       Loaded: loaded (/usr/lib/systemd/system/auditd.service; enabled)
    
    Copy to Clipboard Toggle word wrap
systemd 데몬이 시스템 서비스를 관리하는 방법에 대한 자세한 내용은 시스템 관리자 가이드의 시스템 서비스 관리 장을 참조하십시오.

4.3. 기본 설정 파일

/etc/selinux/config 파일은 기본 SELinux 구성 파일입니다. SELinux가 활성화되었는지 또는 비활성화되었는지 여부와 사용되는 SELinux 모드 및 SELinux 정책을 제어합니다.
# 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=enforcing
# SELINUXTYPE= can take one of these two values:
#       targeted - Targeted processes are protected,
#       mls - Multi Level Security protection.
SELINUXTYPE=targeted
Copy to Clipboard Toggle word wrap
SELINUX=
SELINUX 옵션은 SELinux가 비활성화되었는지 여부와 강제 또는 허용 모드(강제 또는 허용)로 설정합니다.
  • SELINUX=enforcing 을 사용하면 SELinux 정책이 적용되고 SELinux는 SELinux 정책 규칙을 기반으로 액세스를 거부합니다. 거부 메시지가 기록됩니다.
  • SELINUX=permissive 를 사용하면 SELinux 정책이 적용되지 않습니다. SELinux는 액세스를 거부하지 않지만 강제 모드에서 SELinux를 실행하는 경우 거부된 작업에 대해 거부된 작업에 로깅됩니다.
  • SELINUX=disabled 를 사용하면 SELinux가 비활성화되고, SELinux 모듈이 Linux 커널에 등록되지 않으며 DAC 규칙만 사용됩니다.
SELINUXTYPE=
SELINUXTYPE 옵션은 사용할 SELinux 정책을 설정합니다. 타겟 정책은 기본 정책입니다. MLS 정책을 사용하려면 이 옵션만 변경하십시오. MLS 정책을 활성화하는 방법에 대한 자세한 내용은 4.13.2절. “SELinux에서 MLS 활성화” 을 참조하십시오.

4.4. SELinux 상태 및 모드의 영구 변경

1.4절. “SELinux 상태 및 모드” 에서 설명한 대로 SELinux를 활성화하거나 비활성화할 수 있습니다. 활성화되는 경우 SELinux에는 강제 및 허용 모드의 두 가지 모드가 있습니다.
getenforce 또는 sestatus 명령을 사용하여 SELinux가 실행 중인 모드를 확인합니다. getenforce 명령은 Enforcing,Permissive 또는 Disabled 를 반환합니다.
sestatus 명령은 SELinux 상태 및 사용 중인 SELinux 정책을 반환합니다.
~]$ sestatus
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:      30
Copy to Clipboard Toggle word wrap
참고
시스템이 허용 모드에서 SELinux를 실행하는 경우 사용자는 파일에 잘못 레이블을 지정할 수 있습니다. SELinux가 비활성화된 상태에서 생성된 파일에는 레이블이 전혀 지정되지 않습니다. 이 동작은 파일에 잘못 레이블되거나 레이블이 전혀 레이블되지 않았으므로 강제 모드로 변경할 때 문제가 발생합니다. 레이블이 잘못 지정되고 레이블이 지정되지 않은 파일의 문제가 발생하지 않도록 하려면 비활성화 상태에서 허용 또는 강제 모드로 변경할 때 파일 시스템에 자동으로 레이블이 다시 지정됩니다.

4.4.1. SELinux 활성화

활성화되면 SELinux를 강제 또는 허용 모드의 두 가지 모드 중 하나로 실행할 수 있습니다. 다음 섹션에서는 이러한 모드로 영구적으로 변경하는 방법을 보여줍니다.
이전에 비활성화한 시스템에서 SELinux를 활성화하는 동안 시스템 부팅 또는 프로세스 실패와 같은 문제를 방지하려면 다음 절차를 따르는 것이 좋습니다.
  1. 허용 모드에서 SELinux를 활성화합니다. 자세한 내용은 4.4.1.1절. “허용 모드” 의 내용을 참조하십시오.
  2. 시스템을 재부팅합니다.
  3. SELinux 거부 메시지가 있는지 확인합니다. 자세한 내용은 11.3.5절. “거부 검색 및 보기” 의 내용을 참조하십시오.
  4. 거부가 없는 경우 강제 모드로 전환합니다. 자세한 내용은 4.4.1.2절. “강제 모드” 의 내용을 참조하십시오.
SELinux를 강제 모드로 사용자 지정 애플리케이션을 실행하려면 다음 시나리오 중 하나를 선택하십시오.
4.4.1.1. 허용 모드
SELinux가 허용 모드로 실행 중이면 SELinux 정책이 적용되지 않습니다. 시스템이 작동 상태로 남아 있으며 SELinux는 작업을 거부하지 않고 AVC 메시지만 기록합니다. 그러면 문제 해결, 디버깅 및 SELinux 정책 개선에 사용할 수 있습니다. 각 AVC는 이 경우 한 번만 로깅됩니다.
모드를 허용으로 영구적으로 변경하려면 다음 절차를 따르십시오.

절차 4.2. 허용 모드로 변경

  1. /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=permissive
    # SELINUXTYPE= can take one of these two values:
    #       targeted - Targeted processes are protected,
    #       mls - Multi Level Security protection.
    SELINUXTYPE=targeted
    Copy to Clipboard Toggle word wrap
  2. 시스템을 재부팅합니다.
    ~]# reboot
    Copy to Clipboard Toggle word wrap
4.4.1.2. 강제 모드
SELinux가 강제 모드에서 실행 중인 경우 SELinux 정책을 적용하고 SELinux 정책 규칙에 따라 액세스를 거부합니다. Red Hat Enterprise Linux에서는 SELinux를 사용하여 처음 시스템을 설치할 때 강제 모드가 기본적으로 활성화됩니다.
SELinux가 비활성화된 경우 아래 절차에 따라 모드를 강제 모드로 다시 변경합니다.

절차 4.3. 강제 모드로 변경

이 절차에서는 selinux-policy-targeted,selinux- policy,libselinux,libselinux -python,libselinux-utils,policycoreutilspolicycoreutils-python 패키지가 설치되어 있다고 가정합니다. 패키지가 설치되었는지 확인하려면 다음 명령을 사용합니다.
rpm -q package_name
Copy to Clipboard Toggle word wrap
  1. /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=enforcing
    # SELINUXTYPE= can take one of these two values:
    #       targeted - Targeted processes are protected,
    #       mls - Multi Level Security protection.
    SELINUXTYPE=targeted
    Copy to Clipboard Toggle word wrap
  2. 시스템을 재부팅합니다.
    ~]# reboot
    Copy to Clipboard Toggle word wrap
    다음 부팅 시 SELinux는 시스템 내의 모든 파일과 디렉터리의 레이블을 다시 지정하고 SELinux가 비활성화될 때 생성된 파일과 디렉토리에 대해 SELinux 컨텍스트를 추가합니다.
참고
강제 모드로 변경한 후 SELinux는 올바르지 않거나 누락된 SELinux 정책 규칙으로 인해 일부 작업을 거부할 수 있습니다. SELinux 거부 작업을 보려면 root로 다음 명령을 입력합니다.
~]# ausearch -m AVC,USER_AVC,SELINUX_ERR -ts today
Copy to Clipboard Toggle word wrap
또는 setroubleshoot-server 패키지가 설치된 상태에서 root로 다음 명령을 입력합니다.
~]# grep "SELinux is preventing" /var/log/messages
Copy to Clipboard Toggle word wrap
SELinux에서 일부 작업을 거부하는 경우 문제 해결에 대한 정보는 11장. 문제 해결 을 참조하십시오.
모드의 일시적인 변경 사항은 1.4절. “SELinux 상태 및 모드” 에서 다룹니다.

4.4.2. SELinux 비활성화

SELinux가 비활성화되면 SELinux 정책이 전혀 로드되지 않습니다. 강제 적용되지 않으며 AVC 메시지가 기록되지 않습니다. 따라서 1.1절. “SELinux 실행의 이점” 에 나열된 SELinux를 실행하는 모든 이점이 손실됩니다.
중요
Red Hat은 SELinux를 영구적으로 비활성화하는 대신 허용 모드를 사용하도록 권장합니다. 허용 모드에 대한 자세한 내용은 4.4.1.1절. “허용 모드” 을 참조하십시오.
SELinux를 영구적으로 비활성화하려면 다음 절차를 따르십시오.

절차 4.4. SELinux 비활성화

  1. /etc/selinux/config 파일에서 SELINUX=disabled 를 구성합니다.
    # 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,
    #       mls - Multi Level Security protection.
    SELINUXTYPE=targeted
    Copy to Clipboard Toggle word wrap
  2. 시스템을 재부팅합니다. 재부팅 후 getenforce 명령이 Disabled 를 반환하는지 확인합니다.
    ~]$ getenforce
    Disabled
    Copy to Clipboard Toggle word wrap

4.5. 부팅 시 SELinux 모드 변경

부팅 시 SELinux 실행 방식을 변경하기 위해 여러 커널 매개변수를 설정할 수 있습니다.
enforcing=0
이 매개 변수를 설정하면 시스템이 허용 모드로 시작되므로 문제를 해결할 때 유용합니다. 파일 시스템이 너무 손상된 경우 허용 모드를 사용하는 것이 문제를 감지하는 유일한 옵션일 수 있습니다. 또한 허용 모드에서 시스템은 라벨을 올바르게 만듭니다. 이 모드에서 생성되는 AVC 메시지는 강제 모드에서와 다를 수 있습니다.
허용 모드에서는 일련의 동일한 거부 중 첫 번째 거부만 보고됩니다. 그러나 강제 모드에서는 디렉터리 읽기와 관련된 거부가 발생할 수 있으며 애플리케이션이 중지될 수 있습니다. 허용 모드에서는 동일한 AVC 메시지가 표시되지만 애플리케이션은 디렉토리에 있는 파일을 계속 읽고 각 거부에 대해 AVC도 받습니다.
selinux=0
이 매개 변수를 사용하면 커널이 SELinux 인프라의 일부를 로드하지 않습니다. init 스크립트는 시스템이 selinux=0 매개변수로 부팅되었으며 /.autorelabel 파일을 표시합니다. 이로 인해 SELinux를 활성화한 다음 부팅할 때 시스템이 자동으로 레이블을 다시 지정합니다.
중요
Red Hat은 selinux=0 매개 변수를 사용하지 않는 것이 좋습니다. 시스템을 디버깅하려면 허용 모드를 사용하는 것이 좋습니다.
autorelabel=1
이 매개변수는 시스템에서 다음 명령과 유사하게 레이블을 다시 지정하도록 강제 적용합니다.
~]# touch /.autorelabel
~]# reboot
Copy to Clipboard Toggle word wrap
시스템 레이블링에 많은 양의 오류가 포함된 경우 자동 레이블에 성공하기 위해 허용 모드로 부팅해야 할 수 있습니다.
checkreqprot 와 같은 추가 SELinux 관련 커널 부팅 매개변수는 /usr/share/doc/kernel-doc- <KERNEL_VER> /Documentation/kernel-parameters.txt 파일을 참조하십시오. 이 문서는 kernel-doc 패키지와 함께 설치됩니다. <KERNEL_VER> 문자열을 설치된 커널의 버전 번호로 바꿉니다. 예를 들면 다음과 같습니다.
~]# yum install kernel-doc
~]$ less /usr/share/doc/kernel-doc-3.10.0/Documentation/kernel-parameters.txt
Copy to Clipboard Toggle word wrap

4.6. 부울

부울을 사용하면 SELinux 정책 작성에 대한 지식 없이 런타임 시 SELinux 정책 부분을 변경할 수 있습니다. 이렇게 하면 SELinux 정책을 다시 로드하거나 다시 컴파일하지 않고도 NFS 볼륨에 서비스 액세스 허용 등의 변경 사항을 허용합니다.

4.6.1. 부울 나열

부울 목록, 각 항목이 무엇인지, 실행 중인지에 대한 설명은 Linux root 사용자로 semanage boolean -l 명령을 실행합니다. 다음 예제는 모든 부울을 나열하지 않으며 출력은 간결성을 위해 단축됩니다.
~]# semanage boolean -l
SELinux boolean                State  Default Description


smartmon_3ware                 (off  ,  off)  Determine whether smartmon can...
mpd_enable_homedirs            (off  ,  off)  Determine whether mpd can traverse...
Copy to Clipboard Toggle word wrap
참고
자세한 설명을 보려면 selinux-policy-devel 패키지를 설치합니다.
SELinux 부울 열에는 부울 이름이 나열됩니다. Description 열에는 부울이 on 또는 off인지 여부와 수행할 작업이 나열됩니다.
getsebool -a 명령은 켜거나 꺼져 있는지 여부에 관계없이 부울을 나열하지만 각 옵션에 대한 설명은 표시하지 않습니다. 다음 예제는 모든 부울을 나열하지 않습니다.
~]$ getsebool -a
cvs_read_shadow --> off
daemons_dump_core --> on
Copy to Clipboard Toggle word wrap
getsebool boolean-name 명령을 실행하여 부울 이름 부울의 상태만 나열합니다.
~]$ getsebool cvs_read_shadow
cvs_read_shadow --> off
Copy to Clipboard Toggle word wrap
공백으로 구분된 목록을 사용하여 여러 부울을 나열합니다.
~]$ getsebool cvs_read_shadow daemons_dump_core
cvs_read_shadow --> off
daemons_dump_core --> on
Copy to Clipboard Toggle word wrap

4.6.2. 부울 구성

setsebool boolean_name on/off 양식에서 setsebool 유틸리티를 실행하여 부울을 활성화하거나 비활성화합니다.
다음 예제에서는 httpd_can_network_connect_db 부울을 구성하는 방법을 보여줍니다.

절차 4.5. 부울 구성

  1. 기본적으로 httpd_can_network_connect_db 부울이 꺼져 Apache HTTP Server 스크립트 및 모듈이 데이터베이스 서버에 연결되지 않습니다.
    ~]$ getsebool httpd_can_network_connect_db
    httpd_can_network_connect_db --> off
    
    Copy to Clipboard Toggle word wrap
  2. Apache HTTP Server 스크립트 및 모듈을 일시적으로 활성화하여 데이터베이스 서버에 연결하려면 root로 다음 명령을 입력합니다.
    ~]# setsebool httpd_can_network_connect_db on
    Copy to Clipboard Toggle word wrap
  3. getsebool 유틸리티를 사용하여 부울이 활성화되었는지 확인합니다.
    ~]$ getsebool httpd_can_network_connect_db
    httpd_can_network_connect_db --> on
    
    Copy to Clipboard Toggle word wrap
    이렇게 하면 Apache HTTP Server 스크립트 및 모듈이 데이터베이스 서버에 연결할 수 있습니다.
  4. 이 변경 사항은 재부팅 시 유지되지 않습니다. 재부팅 시 영구적으로 변경하려면 명령에 root로 setsebool -P boolean-name 을 실행합니다.[3]
    ~]# setsebool -P httpd_can_network_connect_db on
    Copy to Clipboard Toggle word wrap

4.6.3. 쉘 자동 완성

getsebool,setseboolsemanage 유틸리티와 함께 쉘 자동 완성을 사용할 수 있습니다. getseboolsetsebool 과 함께 자동 완성을 사용하여 명령줄 매개 변수와 부울을 모두 완료합니다. 명령줄 매개변수만 나열하려면 명령 이름 뒤에 하이픈 문자("-")를 추가하고 Tab 키를 누릅니다.
~]# setsebool -[Tab]
-P
Copy to Clipboard Toggle word wrap
부울을 완료하려면 부울 이름 쓰기를 시작한 다음 Tab:을 누릅니다.
~]$ getsebool samba_[Tab]
samba_create_home_dirs   samba_export_all_ro      samba_run_unconfined
samba_domain_controller  samba_export_all_rw      samba_share_fusefs
samba_enable_home_dirs   samba_portmapper         samba_share_nfs
Copy to Clipboard Toggle word wrap
~]# setsebool -P virt_use_[Tab]
virt_use_comm     virt_use_nfs      virt_use_sanlock
virt_use_execmem  virt_use_rawip    virt_use_usb
virt_use_fusefs   virt_use_samba    virt_use_xserver
Copy to Clipboard Toggle word wrap
semanage 유틸리티는 하나씩 완료된 여러 명령줄 인수와 함께 사용됩니다. semanage 명령의 첫 번째 인수는 SELinux 정책의 일부를 지정하는 옵션입니다.
~]# semanage [Tab]
boolean     export      import      login       node        port
dontaudit   fcontext    interface   module      permissive  user
Copy to Clipboard Toggle word wrap
그런 다음 하나 이상의 명령줄 매개변수는 다음과 같습니다.
~]# semanage fcontext -[Tab]
-a           -D           --equal      --help       -m           -o
--add        --delete     -f           -l           --modify     -S
-C           --deleteall  --ftype      --list       -n           -t
-d           -e           -h           --locallist  --noheading  --type
Copy to Clipboard Toggle word wrap
마지막으로 부울, SELinux 사용자, 도메인 또는 기타와 같은 특정 SELinux 항목의 이름을 완료합니다. 항목 입력을 시작하고 Tab 을 누릅니다.
~]# semanage fcontext -a -t samba<tab>
samba_etc_t                     samba_secrets_t
sambagui_exec_t                 samba_share_t
samba_initrc_exec_t             samba_unconfined_script_exec_t
samba_log_t                     samba_unit_file_t
samba_net_exec_t
Copy to Clipboard Toggle word wrap
명령줄 매개 변수는 명령으로 연결할 수 있습니다.
~]# semanage port -a -t http_port_t -p tcp 81
Copy to Clipboard Toggle word wrap


[3] 기본 동작으로 임시로 되돌리려면 Linux root 사용자로 setsebool httpd_can_network_connect_db off 명령을 실행합니다. 재부팅 시 유지되는 변경 사항의 경우 setsebool -P httpd_can_network_connect_db off 명령을 실행합니다.

4.7. SELinux 컨텍스트 - 파일 레이블 지정

SELinux를 실행하는 시스템에서는 보안 관련 정보를 나타내는 방식으로 모든 프로세스와 파일에 레이블이 지정됩니다. 이 정보를 SELinux 컨텍스트라고 합니다. 파일의 경우 ls -Z 명령을 사용하여 확인할 수 있습니다.
~]$ ls -Z file1
-rw-rw-r--  user1 group1 unconfined_u:object_r:user_home_t:s0 file1
Copy to Clipboard Toggle word wrap
이 예에서 SELinux는 사용자(unconfined_u), 역할(object_r), 유형(user_home_t) 및 수준(s0)을 제공합니다. 이 정보는 액세스 제어 결정을 내리는 데 사용됩니다. DAC 시스템에서는 Linux 사용자 및 그룹 ID를 기반으로 액세스가 제어됩니다. SELinux 정책 규칙은 DAC 규칙 후에 확인됩니다. DAC 규칙이 먼저 액세스를 거부하면 SELinux 정책 규칙이 사용되지 않습니다.
참고
기본적으로 새로 생성된 파일과 디렉터리는 상위 디렉터리의 SELinux 유형을 상속합니다. 예를 들어 /etc 디렉토리에 etc_t 유형으로 레이블이 지정된 새 파일을 생성할 때 새 파일은 동일한 유형을 상속합니다.
~]$ ls -dZ - /etc
drwxr-xr-x. root root system_u:object_r:etc_t:s0       /etc
Copy to Clipboard Toggle word wrap
~]# touch /etc/file1
Copy to Clipboard Toggle word wrap
~]# ls -lZ /etc/file1
-rw-r--r--. root root unconfined_u:object_r:etc_t:s0   /etc/file1
Copy to Clipboard Toggle word wrap
SELinux는 chcon,semanage fcontext,restorecon, matchpathcon 과 같은 파일 시스템 레이블링을 관리하기 위한 여러 명령을 제공합니다.

4.7.1. 임시 변경 사항: chcon

chcon 명령은 파일의 SELinux 컨텍스트를 변경합니다. 그러나 chcon 명령을 사용하여 변경한 내용은 파일 시스템 재레이블 또는 restorecon 명령 실행 시 지속되지 않습니다. SELinux 정책은 사용자가 지정된 파일에 대한 SELinux 컨텍스트를 수정할 수 있는지 여부를 제어합니다. chcon 을 사용하는 경우 사용자는 SELinux 컨텍스트의 전부 또는 일부를 제공하여 변경합니다. 잘못된 파일 유형은 액세스를 거부하는 SELinux의 일반적인 원인입니다.

참고 자료

  • chcon -t 유형 file-name 명령을 실행하여 파일 유형을 변경합니다. 여기서 type 은 SELinux 유형(예: httpd_sys_content_t )이며 file-name 은 파일 또는 디렉터리 이름입니다.
    ~]$ chcon -t httpd_sys_content_t file-name
    Copy to Clipboard Toggle word wrap
  • chcon -R -t 유형 directory-name 명령을 실행하여 디렉터리 및 해당 콘텐츠의 유형을 변경합니다. 여기서 type 은 SELinux 유형(예: httpd_sys_content_t )이고 directory-name 은 디렉터리 이름입니다.
    ~]$ chcon -R -t httpd_sys_content_t directory-name
    Copy to Clipboard Toggle word wrap

절차 4.6. 파일 또는 디렉토리 유형 변경

다음 절차에서는 유형 및 SELinux 컨텍스트의 다른 특성을 변경하는 방법을 보여줍니다. 이 섹션의 예제는 디렉터리(예: file1 이 디렉터리인 경우)에 대해 동일하게 작동합니다.
  1. 홈 디렉터리로 변경합니다.
  2. 새 파일을 생성하고 SELinux 컨텍스트를 봅니다.
    ~]$ touch file1
    Copy to Clipboard Toggle word wrap
    ~]$ ls -Z file1
    -rw-rw-r--  user1 group1 unconfined_u:object_r:user_home_t:s0 file1
    
    Copy to Clipboard Toggle word wrap
    이 예에서 file1 에 대한 SELinux 컨텍스트에는 SELinux unconfined_u 사용자, object_r 역할, user_home_t 유형 및 s0 수준이 포함됩니다. SELinux 컨텍스트의 각 부분에 대한 설명은 2장. SELinux 컨텍스트 의 내용을 참조하십시오.
  3. 다음 명령을 입력하여 유형을 samba_share_t 로 변경합니다. t 옵션은 유형만 변경합니다. 그런 다음 변경 사항을 확인합니다.
    ~]$ chcon -t samba_share_t file1
    Copy to Clipboard Toggle word wrap
    ~]$ ls -Z file1 
    -rw-rw-r--  user1 group1 unconfined_u:object_r:samba_share_t:s0 file1
    
    Copy to Clipboard Toggle word wrap
  4. 다음 명령을 사용하여 file1 파일의 SELinux 컨텍스트를 복원합니다. v 옵션을 사용하여 변경 사항을 확인하십시오.
    ~]$ restorecon -v file1
    restorecon reset file1 context unconfined_u:object_r:samba_share_t:s0->system_u:object_r:user_home_t:s0
    
    Copy to Clipboard Toggle word wrap
    이 예에서 이전 유형 samba_share_t 는 올바른 user_home_t 유형으로 복원됩니다. 대상 정책(Red Hat Enterprise Linux의 기본 SELinux 정책)을 사용하는 경우 restorecon 명령은 /etc/selinux/targeted/contexts/files/ 디렉터리에 있는 파일을 읽고 어떤 SELinux 컨텍스트 파일이 있어야 하는지 확인합니다.

절차 4.7. 디렉토리 및 콘텐츠 유형 변경

다음 예제에서는 새 디렉터리를 만들고 디렉터리의 파일 유형을 Apache HTTP 서버에서 사용하는 유형으로 변경하는 방법을 보여줍니다. 이 예제의 구성은 Apache HTTP Server에서 다른 문서 루트( /var/www/html/대신)를 사용하도록 하는 경우 사용됩니다.
  1. root 사용자로 이 디렉터리에 새 web/ 디렉토리를 만들고 3개의 빈 파일(file1,file2file3)을 만듭니다. 이 디렉터리의 web/ 디렉터리 및 파일은 default_t 유형으로 레이블이 지정됩니다.
    ~]# mkdir /web
    Copy to Clipboard Toggle word wrap
    ~]# touch /web/file{1,2,3}
    Copy to Clipboard Toggle word wrap
    ~]# ls -dZ /web
    drwxr-xr-x  root root unconfined_u:object_r:default_t:s0 /web
    
    Copy to Clipboard Toggle word wrap
    ~]# ls -lZ /web
    -rw-r--r--  root root unconfined_u:object_r:default_t:s0 file1
    -rw-r--r--  root root unconfined_u:object_r:default_t:s0 file2
    -rw-r--r--  root root unconfined_u:object_r:default_t:s0 file3
    
    Copy to Clipboard Toggle word wrap
  2. root 로서 다음 명령을 입력하여 웹/ 디렉터리(및 해당 콘텐츠)의 유형을 httpd_sys_content_t 로 변경합니다.
    ~]# chcon -R -t httpd_sys_content_t /web/
    Copy to Clipboard Toggle word wrap
    ~]# ls -dZ /web/
    drwxr-xr-x  root root unconfined_u:object_r:httpd_sys_content_t:s0 /web/
    
    Copy to Clipboard Toggle word wrap
    ~]# ls -lZ /web/
    -rw-r--r--  root root unconfined_u:object_r:httpd_sys_content_t:s0 file1
    -rw-r--r--  root root unconfined_u:object_r:httpd_sys_content_t:s0 file2
    -rw-r--r--  root root unconfined_u:object_r:httpd_sys_content_t:s0 file3
    
    Copy to Clipboard Toggle word wrap
  3. 기본 SELinux 컨텍스트를 복원하려면 restorecon 유틸리티를 root로 사용합니다.
    ~]# restorecon -R -v /web/
    restorecon reset /web context unconfined_u:object_r:httpd_sys_content_t:s0->system_u:object_r:default_t:s0
    restorecon reset /web/file2 context unconfined_u:object_r:httpd_sys_content_t:s0->system_u:object_r:default_t:s0
    restorecon reset /web/file3 context unconfined_u:object_r:httpd_sys_content_t:s0->system_u:object_r:default_t:s0
    restorecon reset /web/file1 context unconfined_u:object_r:httpd_sys_content_t:s0->system_u:object_r:default_t:s0
    
    Copy to Clipboard Toggle word wrap
chcon 에 대한 자세한 내용은 chcon(1) 도움말 페이지를 참조하십시오.
참고
유형 적용은 SELinux 대상 정책에 사용되는 기본 권한 제어입니다. 대부분의 경우 SELinux 사용자 및 역할은 무시할 수 있습니다.

4.7.2. 영구적인 변경 사항: semanage fcontext

semanage fcontext 명령은 파일의 SELinux 컨텍스트를 변경하는 데 사용됩니다. 새로 생성된 파일 및 디렉터리에 대한 컨텍스트를 표시하려면 root로 다음 명령을 입력합니다.
~]# semanage fcontext -C -l
Copy to Clipboard Toggle word wrap
semanage fcontext 의 변경 사항은 다음 유틸리티에서 사용합니다. setfiles 유틸리티는 파일 시스템의 레이블을 다시 지정하고 restorecon 유틸리티가 기본 SELinux 컨텍스트를 복원할 때 사용됩니다. 즉, 파일 시스템의 레이블을 다시 지정하는 경우에도 semanage fcontext 로 변경한 사항이 지속됩니다. SELinux 정책은 사용자가 지정된 파일에 대한 SELinux 컨텍스트를 수정할 수 있는지 여부를 제어합니다.

참고 자료

파일 시스템 레이블 변경 후에도 유지되는 SELinux 컨텍스트 변경을 수행하려면 다음을 수행합니다.
  1. 파일 또는 디렉토리의 전체 경로를 사용하도록 다음 명령을 입력합니다.
    ~]# semanage fcontext -a options file-name|directory-name
    Copy to Clipboard Toggle word wrap
  2. restorecon 유틸리티를 사용하여 컨텍스트 변경 사항을 적용합니다.
    ~]# restorecon -v file-name|directory-name
    Copy to Clipboard Toggle word wrap
semanage fcontext와 함께 정규 표현식 사용
semanage fcontext 명령이 올바르게 작동하려면 정규화된 경로 또는 PCRE( Perl 호환 정규식) 를 사용할 수 있습니다. 사용 중인 유일한 PCRE 플래그는 PCRE2_DOTALL 이므로 와일드카드가 새 행을 포함하여 모든 항목과 일치합니다 . 경로를 나타내는 문자열은 바이트로 처리됩니다. 즉 ASCII가 아닌 문자는 단일 와일드카드와 일치하지 않습니다.
semanage fcontext 를 사용하여 지정된 파일 컨텍스트 정의는 정의 방법에 대한 역순으로 평가됩니다. 최신 항목은 제로 길이에 관계없이 먼저 평가됩니다. file_contexts.local 에 저장된 로컬 파일 컨텍스트 수정은 정책 모듈에 지정된 것보다 우선 순위가 높습니다. 즉, file_contexts.local 에서 지정된 파일 경로에 대한 일치가 발견될 때마다 다른 파일 컨텍스트 정의는 고려되지 않습니다.
중요
semanage fcontext 명령을 사용하여 지정된 파일 컨텍스트 정의는 다른 모든 file-context 정의를 효과적으로 재정의합니다. 따라서 모든 정규 표현식은 의도치 않게 파일 시스템의 다른 부분에 영향을 주지 않도록 가능한 한 구체적이어야 합니다.
file-context 정의 및 적용되는 플래그에 사용되는 정규식 유형에 대한 자세한 내용은 semanage-fcontext(8) 도움말 페이지를 참조하십시오.

절차 4.8. 파일 또는 디렉토리 유형 변경

다음 예제에서는 파일 유형 및 SELinux 컨텍스트의 다른 특성을 변경하는 방법을 보여줍니다. 이 예제는 디렉터리(예: file1 이 디렉터리인 경우)에 대해 동일하게 작동합니다.
  1. root 사용자로 /etc 디렉토리에 새 파일을 만듭니다. 기본적으로 /etc 에서 새로 생성된 파일은 etc_t 유형으로 레이블이 지정됩니다.
    ~]# touch /etc/file1
    Copy to Clipboard Toggle word wrap
    ~]$ ls -Z /etc/file1
    -rw-r--r--  root root unconfined_u:object_r:etc_t:s0       /etc/file1
    
    Copy to Clipboard Toggle word wrap
    디렉터리에 대한 정보를 나열하려면 다음 명령을 사용합니다.
    ~]$ ls -dZ directory_name
    Copy to Clipboard Toggle word wrap
  2. root 로 다음 명령을 입력하여 file1 유형을 samba_share_t 로 변경합니다. a 옵션은 새 레코드를 추가하고 -t 옵션은 유형(samba_share_t)을 정의합니다. 이 명령을 실행하면 유형이 직접 변경되지 않습니다. file1 은 여전히 etc_t 유형으로 레이블이 지정됩니다.
    ~]# semanage fcontext -a -t samba_share_t /etc/file1
    Copy to Clipboard Toggle word wrap
    ~]# ls -Z /etc/file1
    -rw-r--r--  root root unconfined_u:object_r:etc_t:s0       /etc/file1
    
    Copy to Clipboard Toggle word wrap
    ~]$ semanage fcontext -C -l
    /etc/file1    unconfined_u:object_r:samba_share_t:s0
    
    Copy to Clipboard Toggle word wrap
  3. root 로서 restorecon 유틸리티를 사용하여 유형을 변경합니다. semanage/etc/file1file_contexts.local 에 항목을 추가했기 때문에restorecon 은 유형을 samba_share_t:로 변경합니다.
    ~]# restorecon -v /etc/file1
    restorecon reset /etc/file1 context unconfined_u:object_r:etc_t:s0->system_u:object_r:samba_share_t:s0
    
    Copy to Clipboard Toggle word wrap

절차 4.9. 디렉토리 및 콘텐츠 유형 변경

다음 예제에서는 새 디렉터리를 만들고 디렉터리의 파일 유형을 해당 내용과 함께 Apache HTTP 서버에서 사용하는 유형으로 변경하는 방법을 보여줍니다. 이 예제의 구성은 Apache HTTP Server에서 /var/www/html/: 대신 다른 문서 루트를 사용하도록 하려는 경우 사용됩니다.
  1. root 사용자로 이 디렉터리에 새 web/ 디렉토리를 만들고 3개의 빈 파일(file1,file2file3)을 만듭니다. 이 디렉터리의 web/ 디렉터리 및 파일은 default_t 유형으로 레이블이 지정됩니다.
    ~]# mkdir /web
    Copy to Clipboard Toggle word wrap
    ~]# touch /web/file{1,2,3}
    Copy to Clipboard Toggle word wrap
    ~]# ls -dZ /web
    drwxr-xr-x  root root unconfined_u:object_r:default_t:s0 /web
    
    Copy to Clipboard Toggle word wrap
    ~]# ls -lZ /web
    -rw-r--r--  root root unconfined_u:object_r:default_t:s0 file1
    -rw-r--r--  root root unconfined_u:object_r:default_t:s0 file2
    -rw-r--r--  root root unconfined_u:object_r:default_t:s0 file3
    
    Copy to Clipboard Toggle word wrap
  2. root 로서 다음 명령을 입력하여 웹/ 디렉터리의 유형과 해당 디렉터리의 파일을 httpd_sys_content_t 로 변경합니다. a 옵션은 새 레코드를 추가하고 -t 옵션은 유형(httpd_sys_content_t)을 정의합니다. "/web(/.*)?" 정규식으로 인해 semanage웹/ 에도 변경 사항을 적용하고 해당 파일에 변경 사항을 적용합니다. 이 명령을 실행하면 유형이 직접 변경되지 않습니다. 그 안에 있는 web/ 및 파일은 여전히 default_t 유형으로 레이블이 지정됩니다.
    ~]# semanage fcontext -a -t httpd_sys_content_t "/web(/.*)?"
    Copy to Clipboard Toggle word wrap
    ~]$ ls -dZ /web
    drwxr-xr-x  root root unconfined_u:object_r:default_t:s0 /web
    
    Copy to Clipboard Toggle word wrap
    ~]$ ls -lZ /web
    -rw-r--r--  root root unconfined_u:object_r:default_t:s0 file1
    -rw-r--r--  root root unconfined_u:object_r:default_t:s0 file2
    -rw-r--r--  root root unconfined_u:object_r:default_t:s0 file3
    
    Copy to Clipboard Toggle word wrap
    semanage fcontext -a -t httpd_sys_content_t "/web(/.*)?" 명령은 /etc/selinux/targeted/contexts/files/file_contexts.local 에 다음 항목을 추가합니다.
    /web(/.*)?    system_u:object_r:httpd_sys_content_t:s0
    
    Copy to Clipboard Toggle word wrap
  3. root 로서 restorecon 유틸리티를 사용하여 web/ 의 유형 및 해당 파일의 모든 파일을 변경합니다. R 은 재귀를 위한 것입니다. 즉, web/ 아래의 모든 파일과 디렉터리가 httpd_sys_content_t 유형으로 레이블이 지정됩니다. semanage/web(/.*)의 file.contexts.local 에 항목을 추가했기 때문에 restorecon 은 유형을 httpd_sys_content_t 로 변경합니다.
    ~]# restorecon -R -v /web
    restorecon reset /web context unconfined_u:object_r:default_t:s0->system_u:object_r:httpd_sys_content_t:s0
    restorecon reset /web/file2 context unconfined_u:object_r:default_t:s0->system_u:object_r:httpd_sys_content_t:s0
    restorecon reset /web/file3 context unconfined_u:object_r:default_t:s0->system_u:object_r:httpd_sys_content_t:s0
    restorecon reset /web/file1 context unconfined_u:object_r:default_t:s0->system_u:object_r:httpd_sys_content_t:s0
    
    Copy to Clipboard Toggle word wrap
    기본적으로 새로 생성된 파일과 디렉터리는 상위 디렉터리의 SELinux 유형을 상속받습니다.

절차 4.10. 추가된 컨텍스트 삭제

다음 예제에서는 SELinux 컨텍스트 추가 및 제거를 보여줍니다. 컨텍스트가 정규식의 일부인 경우 /web(/.*)?? 에서는 정규식 주위에 따옴표를 사용합니다.
~]# semanage fcontext -d "/web(/.*)?"
Copy to Clipboard Toggle word wrap
  1. 컨텍스트를 제거하려면 root로 다음 명령을 입력합니다. 여기서 file-name|directory-namefile_contexts.local 의 첫 번째 부분입니다.
    ~]# semanage fcontext -d file-name|directory-name
    Copy to Clipboard Toggle word wrap
    다음은 file_contexts.local 의 컨텍스트의 예입니다.
    /test    system_u:object_r:httpd_sys_content_t:s0
    
    Copy to Clipboard Toggle word wrap
    첫 번째 부분은 시험 입니다. restorecon 을 실행한 후 또는 파일 시스템 재레이블 후 test/ 디렉터리의 레이블이 httpd_sys_content_t 로 레이블이 지정되지 않도록 하려면 root로 다음 명령을 입력하여 file_contexts.local 에서 컨텍스트를 삭제합니다.
    ~]# semanage fcontext -d /test
    Copy to Clipboard Toggle word wrap
  2. root 로 restorecon 유틸리티를 사용하여 기본 SELinux 컨텍스트를 복원합니다.
semanage 에 대한 자세한 내용은 semanage(8)semanage-fcontext(8) 매뉴얼 페이지를 참조하십시오.
중요
semanage fcontext -a 로 SELinux 컨텍스트를 변경할 때 파일 또는 디렉토리의 전체 경로를 사용하여 파일 시스템 재레이블 후 또는 restorecon 명령을 실행한 후 파일의 레이블을 잘못 지정하지 않도록 합니다.

4.7.3. 파일 문맥을 확인하는 방법

파일 컨텍스트 확인은 시스템 보안 정책( .fc 파일)에 지정된 파일 컨텍스트 정의를 기반으로 합니다. 시스템 정책에 따라 semanagefile_contexts.homedirsfile_contexts 파일을 생성합니다.
시스템 관리자는 semanage fcontext 명령을 사용하여 파일 컨텍스트 정의를 사용자 지정할 수 있습니다. 이러한 사용자 지정은 file_contexts.local 파일에 저장됩니다.
matchpathcon 또는 restorecon 과 같은 레이블링 유틸리티에서 지정된 경로에 대한 적절한 레이블을 결정하는 경우 먼저 로컬 변경 사항(file_contexts.local)을 검색합니다. 유틸리티에서 일치하는 패턴을 찾지 못하면 file_contexts.homedirs 파일과 file_contexts 파일을 검색합니다. 그러나 지정된 파일 경로와 일치하는 항목이 있을 때마다 검색이 종료되고 유틸리티는 추가 파일 컨텍스트 정의를 찾습니다. 즉, 홈 디렉터리 관련 파일 컨텍스트가 나머지보다 우선 순위가 높으며 로컬 사용자 지정은 시스템 정책을 재정의합니다.
시스템 정책 ( file_contexts.homedirsfile_contexts 파일의 콘텐츠)에 의해 지정된 파일 컨텍스트 정의는 평가 전의 줄임표(모든 와일드카드 이전 경로) 길이로 정렬됩니다. 이는 가장 구체적인 경로가 선택됨을 의미합니다. 그러나 semanage fcontext 를 사용하여 지정된 파일 컨텍스트 정의는 정의 방법에 대한 역순으로 평가됩니다. 최신 항목은 영 길이에 관계없이 먼저 평가됩니다.
자세한 내용은 다음을 참조하십시오.

4.8. file_t 및 default_t 유형

확장된 속성(EA)을 지원하는 파일 시스템을 사용하는 경우 file_t 유형은 아직 EA 값이 할당되지 않은 파일의 기본 유형입니다. 이 유형은 이 목적으로만 사용되며 SELinux를 실행하는 시스템의 모든 파일에 적절한 SELinux 컨텍스트가 있어야 하고 file_t 유형은 file-context 구성에 사용되지 않기 때문에 올바르게 레이블이 지정된 파일 시스템에는 존재하지 않습니다.[4].
default_t 유형은 file-context 구성의 패턴과 일치하지 않는 파일에 사용되어 이러한 파일을 디스크에 컨텍스트가 없는 파일과 구분할 수 있으며 일반적으로 제한된 도메인에 액세스할 수 없습니다. 예를 들어, mydirectory/ 와 같은 새 최상위 디렉토리를 생성하는 경우 이 디렉토리에 default_t 유형으로 레이블이 지정될 수 있습니다. 서비스에서 이 디렉토리에 액세스해야 하는 경우 이 위치에 대한 file-contexts 구성을 업데이트해야 합니다. 파일 컨텍스트 구성에 컨텍스트를 추가하는 방법에 대한 자세한 내용은 4.7.2절. “영구적인 변경 사항: semanage fcontext” 을 참조하십시오.


[4] /etc/selinux/targeted/contexts/files/ 디렉터리의 파일은 파일 및 디렉터리에 대한 컨텍스트를 정의합니다. 이 디렉터리의 파일은 restoreconsetfiles 유틸리티에서 읽고 파일과 디렉터리를 기본 컨텍스트로 복원합니다.

4.9. 파일 시스템 마운트

기본적으로 확장 속성을 지원하는 파일 시스템이 마운트되면 각 파일의 보안 컨텍스트는 파일의 security.selinux 확장 특성에서 가져옵니다. 확장 특성을 지원하지 않는 파일 시스템의 파일에는 파일 시스템 유형에 따라 정책 구성에서 하나의 기본 보안 컨텍스트가 할당됩니다.
mount -o context 명령을 사용하여 기존 확장 속성을 재정의하거나 확장 속성을 지원하지 않는 파일 시스템에 대해 다른 기본 컨텍스트를 지정합니다. 이 기능은 여러 시스템에서 사용되는 이동식 미디어와 같이 올바른 속성을 제공하기 위해 파일 시스템을 신뢰하지 않는 경우에 유용합니다. mount -o context 명령을 사용하여 파일 할당 테이블(FAT) 또는 NFS 볼륨과 같은 확장된 속성을 지원하지 않는 파일 시스템의 레이블을 지원할 수도 있습니다. 컨텍스트 옵션으로 지정된 컨텍스트 는 디스크에 작성되지 않습니다. 원래 컨텍스트가 유지되며, 파일 시스템에 첫 번째 위치에서 확장된 속성이 있는 경우 컨텍스트 없이 마운트할 때 표시됩니다.
파일 시스템 레이블 지정에 대한 자세한 내용은 James Morris의 "SELinux의 파일 시스템 레이블 지정" 문서를 참조하십시오 http://www.linuxjournal.com/article/7426.

4.9.1. 컨텍스트 마운트

지정된 컨텍스트를 사용하여 파일 시스템을 마운트하려면 기존 컨텍스트를 덮어쓰거나 확장 속성을 지원하지 않는 파일 시스템의 다른 기본 컨텍스트를 지정하려면 root 사용자로 필요한 파일 시스템을 마운트할 때 mount -o context=SELinux_user:type:level 명령을 사용합니다. 컨텍스트 변경 사항은 디스크에 기록되지 않습니다. 기본적으로 클라이언트쪽의 NFS 마운트는 NFS 볼륨의 정책에서 정의한 기본 컨텍스트로 레이블이 지정됩니다. 일반적인 정책에서 이 기본 컨텍스트는 nfs_t 유형을 사용합니다. 추가 마운트 옵션이 없으면 Apache HTTP 서버와 같은 다른 서비스를 사용하여 NFS 볼륨을 공유하지 못하게 할 수 있습니다. 다음 예제에서는 Apache HTTP 서버를 사용하여 공유할 수 있도록 NFS 볼륨을 마운트합니다.
~]# mount server:/export /local/mount/point -o \ context="system_u:object_r:httpd_sys_content_t:s0"
Copy to Clipboard Toggle word wrap
이 파일 시스템에서 새로 생성된 파일과 디렉터리에 -o 컨텍스트로 지정된 SELinux 컨텍스트가 있는 것처럼 나타납니다. 그러나 이러한 변경 사항은 디스크에 작성되지 않으므로 이 옵션과 함께 지정된 컨텍스트는 마운트 간에 유지되지 않습니다. 따라서 필요한 컨텍스트를 유지하려면 마운트할 때마다 이 옵션을 동일한 컨텍스트와 함께 사용해야 합니다. 컨텍스트 마운트를 영구적으로 만드는 방법에 대한 자세한 내용은 4.9.5절. “컨텍스트 마운트 영구 설정” 을 참조하십시오.
유형 적용은 SELinux 대상 정책에 사용되는 기본 권한 제어입니다. 대부분의 경우 SELinux 사용자와 역할을 무시할 수 있으므로 -o 컨텍스트를 사용하여 SELinux 컨텍스트를 재정의하고 SELinux system_u user 및 object_r 역할을 사용하고 유형에 중점을 둘 수 있습니다. MLS 정책 또는 다중 범주 보안을 사용하지 않는 경우 s0 수준을 사용합니다.
참고
파일 시스템을 컨텍스트 옵션으로 마운트하면 사용자와 프로세스의 컨텍스트 변경이 금지됩니다. 예를 들어 컨텍스트 옵션으로 마운트된 파일 시스템에서 chcon 명령을 실행하면 Operation not supported 오류가 발생합니다.

4.9.2. 기본 문맥 변경

4.8절. “file_t 및 default_t 유형” 에서 언급했듯이 확장 속성을 지원하는 파일 시스템에서는 디스크의 SELinux 컨텍스트가 없는 파일에 액세스하면 SELinux 정책에 정의된 기본 컨텍스트가 있는 것처럼 처리됩니다. 일반적인 정책에서 이 기본 컨텍스트는 file_t 유형을 사용합니다. 다른 기본 컨텍스트를 사용하려면 defcontext 옵션을 사용하여 파일 시스템을 마운트합니다.
다음 예제에서는 새로 생성된 test/ 디렉터리에 새로 생성된 파일 시스템을 /dev/sda2 에 마운트합니다. /etc/selinux/targeted/contexts/files/test/ 디렉터리에 대한 컨텍스트를 정의하는 규칙이 없는 것으로 가정합니다.
~]# mount /dev/sda2 /test/ -o defcontext="system_u:object_r:samba_share_t:s0"
Copy to Clipboard Toggle word wrap
이 예에서는 다음을 수행합니다.
  • defcontext 옵션은 system_u:object_r:samba_share_t:s0 이 "지정되지 않은 파일의 기본 보안 컨텍스트"임을 정의합니다.[5].
  • 마운트 시 파일 시스템의 루트 디렉터리(test/)는 defcontext 에서 지정한 컨텍스트로 레이블이 지정된 것처럼 처리됩니다(이 레이블은 디스크에 저장되지 않음). test/: 새 파일은 samba_share_t 유형을 상속하며 이러한 레이블은 디스크에 저장됩니다.
  • 파일 시스템이 defcontext 옵션으로 마운트되는 동안 test/ 에서 생성된 파일은 레이블을 유지합니다.

4.9.3. NFS 볼륨 마운트

기본적으로 클라이언트쪽의 NFS 마운트는 NFS 볼륨의 정책에서 정의한 기본 컨텍스트로 레이블이 지정됩니다. 일반적인 정책에서 이 기본 컨텍스트는 nfs_t 유형을 사용합니다. 정책 구성에 따라 Apache HTTP Server 및 MariaDB와 같은 서비스는 nfs_t 유형으로 레이블이 지정된 파일을 읽지 못할 수 있습니다. 이렇게 하면 이 유형으로 레이블이 지정된 파일 시스템이 마운트되지 않은 다음 다른 서비스에서 읽거나 내보내지 못하게 할 수 있습니다.
NFS 볼륨을 마운트하고 다른 서비스로 해당 파일 시스템을 읽거나 내보내려면 마운트 시 nfs_t 유형을 재정의할 때 컨텍스트 옵션을 사용합니다. 다음 컨텍스트 옵션을 사용하여 Apache HTTP 서버를 사용하여 공유할 수 있도록 NFS 볼륨을 마운트합니다.
~]# mount server:/export /local/mount/point -o context="system_u:object_r:httpd_sys_content_t:s0"
Copy to Clipboard Toggle word wrap
이러한 변경 사항은 디스크에 작성되지 않으므로 이 옵션과 함께 지정된 컨텍스트는 마운트 간에 유지되지 않습니다. 따라서 필요한 컨텍스트를 유지하려면 마운트할 때마다 이 옵션을 동일한 컨텍스트와 함께 사용해야 합니다. 컨텍스트 마운트를 영구적으로 만드는 방법에 대한 자세한 내용은 4.9.5절. “컨텍스트 마운트 영구 설정” 을 참조하십시오.
컨텍스트 옵션을 사용하여 파일 시스템을 마운트하는 대신 부울을 활성화하여 nfs_t 유형으로 레이블이 지정된 파일 시스템에 대한 서비스 액세스를 허용할 수 있습니다. nfs_t 유형에 대한 서비스 액세스를 허용하도록 부울 구성 방법에 대한 지침은 II 부. 제한된 서비스 관리 를 참조하십시오.

4.9.4. 여러 NFS 마운트

동일한 NFS 내보내기에서 여러 마운트를 마운트할 때 각 마운트의 SELinux 컨텍스트를 다른 컨텍스트로 재정의하려고 하면 후속 마운트 명령이 실패합니다. 다음 예에서 NFS 서버에는 두 개의 하위 디렉터리 web/database/ 가 있는 단일 내보내기인 export/ 가 있습니다. 다음 명령은 단일 NFS 내보내기에서 두 개의 마운트를 시도하고 각각에 대한 컨텍스트를 재정의합니다.
~]# mount server:/export/web /local/web -o context="system_u:object_r:httpd_sys_content_t:s0"
Copy to Clipboard Toggle word wrap
~]# mount server:/export/database /local/database -o context="system_u:object_r:mysqld_db_t:s0"
Copy to Clipboard Toggle word wrap
두 번째 mount 명령이 실패하고 다음 명령은 /var/log/messages:에 기록됩니다.
kernel: SELinux: mount invalid.  Same superblock, different security settings for (dev 0:15, type nfs)
Copy to Clipboard Toggle word wrap
마운트마다 다른 컨텍스트가 있는 단일 NFS 내보내기에서 여러 마운트를 마운트하려면 -o nosharecache,context 옵션을 사용합니다. 다음 예제에서는 마운트마다 다른 컨텍스트를 사용하여 단일 NFS 내보내기에서 여러 마운트를 마운트합니다(각 각각에 단일 서비스 액세스 허용).
~]# mount server:/export/web /local/web -o nosharecache,context="system_u:object_r:httpd_sys_content_t:s0"
Copy to Clipboard Toggle word wrap
~]# mount server:/export/database /local/database -o \ nosharecache,context="system_u:object_r:mysqld_db_t:s0"
Copy to Clipboard Toggle word wrap
이 예에서 server:/export/webhttpd_sys_content_t 유형으로 레이블이 지정된 모든 파일과 함께 /local/web/ 디렉터리에 로컬로 마운트되어 Apache HTTP Server 액세스를 허용합니다. server:/export /database mysqld_db_t 유형으로 레이블이 지정된 모든 파일과 함께 로컬로 마운트됩니다. 이러한 유형 변경 사항은 디스크에 기록되지 않습니다.
중요
nosharecache 옵션을 사용하면 다른 컨텍스트(예: /export/web/ 마운트)를 여러 번 사용하여 내보내기의 동일한 하위 디렉터리를 여러 번 마운트할 수 있습니다. 다른 컨텍스트에서 파일에 액세스할 수 있는 중복 마운트를 생성하므로 내보내기에서 동일한 하위 디렉터리를 여러 번 마운트하지 마십시오.

4.9.5. 컨텍스트 마운트 영구 설정

다시 마운트 및 재부팅할 때마다 컨텍스트를 영구적으로 마운트하려면 /etc/fstab 파일 또는 Cryostat 맵의 파일 시스템에 대한 항목을 추가하고 필요한 컨텍스트를 마운트 옵션으로 사용합니다. 다음 예제에서는 NFS 컨텍스트 마운트의 경우 /etc/fstab 에 항목을 추가합니다.
server:/export /local/mount/ nfs context="system_u:object_r:httpd_sys_content_t:s0" 0 0
Copy to Clipboard Toggle word wrap


[5] Morris, James. "SELinux에서 파일 시스템 레이블 지정". 2004년 10월 1일 게시됨. 2008년 10월 14일 확인됨: http://www.linuxjournal.com/article/7426.

4.10. SELinux 레이블 유지 관리

이 섹션에서는 파일 및 디렉터리를 복사, 이동 및 보관할 때 SELinux 컨텍스트에 발생하는 사항에 대해 설명합니다. 또한 복사 및 보관 시 컨텍스트를 보존하는 방법을 설명합니다.

4.10.1. 파일 및 디렉토리 복사

파일 또는 디렉터리가 복사되면 새 파일 또는 디렉터리가 없는 경우 새로 생성됩니다. 새 파일 또는 디렉터리의 컨텍스트는 원래 컨텍스트를 유지하는 데 옵션을 사용하지 않는 한 원본 파일이나 디렉터리의 컨텍스트가 아닌 기본 레이블 규칙을 기반으로 합니다. 예를 들어 사용자 홈 디렉터리에 생성된 파일은 user_home_t 유형으로 레이블이 지정됩니다.
~]$ touch file1
Copy to Clipboard Toggle word wrap
~]$ ls -Z file1
-rw-rw-r--  user1 group1 unconfined_u:object_r:user_home_t:s0 file1
Copy to Clipboard Toggle word wrap
이러한 파일이 /etc 와 같은 다른 디렉터리에 복사되는 경우 새 파일이 /etc 의 기본 레이블 지정 규칙에 따라 생성됩니다. 추가 옵션 없이 파일을 복사하면 원래 컨텍스트가 유지되지 않을 수 있습니다.
~]$ ls -Z file1
-rw-rw-r--  user1 group1 unconfined_u:object_r:user_home_t:s0 file1
Copy to Clipboard Toggle word wrap
~]# cp file1 /etc/
Copy to Clipboard Toggle word wrap
~]$ ls -Z /etc/file1
-rw-r--r--  root root unconfined_u:object_r:etc_t:s0   /etc/file1
Copy to Clipboard Toggle word wrap
file1/etc 에 복사되면 /etc/file1 이 없으면 /etc/file1 이 새 파일로 생성됩니다. 위의 예에 표시된 대로 /etc/file1 은 default-labeling 규칙에 따라 etc_t 유형으로 레이블이 지정됩니다.
사용자가 원래 파일의 컨텍스트(예: --preserve=context )를 유지하지 않는 한 기존 파일의 컨텍스트를 기존 파일의 컨텍스트를 복사하면 기존 파일의 컨텍스트가 유지됩니다. SELinux 정책은 복사 중에 컨텍스트가 유지되지 않도록 할 수 있습니다.

절차 4.11. SELinux 컨텍스트를 보존하지 않고 복사

이 절차에서는 cp 명령으로 파일을 복사할 때 옵션이 제공되지 않으면 유형이 대상 상위 디렉터리에서 상속됨을 보여줍니다.
  1. 사용자의 홈 디렉터리에서 파일을 만듭니다. 파일에는 user_home_t 유형으로 레이블이 지정됩니다.
    ~]$ touch file1
    Copy to Clipboard Toggle word wrap
    ~]$ ls -Z file1
    -rw-rw-r--  user1 group1 unconfined_u:object_r:user_home_t:s0 file1
    
    Copy to Clipboard Toggle word wrap
  2. /var/www/html/ 디렉터리는 다음 명령과 같이 httpd_sys_content_t 유형으로 레이블이 지정됩니다.
    ~]$ ls -dZ /var/www/html/
    drwxr-xr-x  root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html/
    
    Copy to Clipboard Toggle word wrap
  3. file1/var/www/html/ 에 복사되면 httpd_sys_content_t 유형을 상속합니다.
    ~]# cp file1 /var/www/html/
    Copy to Clipboard Toggle word wrap
    ~]$ ls -Z /var/www/html/file1
    -rw-r--r--  root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/file1
    
    Copy to Clipboard Toggle word wrap

절차 4.12. 복사 시 SELinux 컨텍스트 보존

다음 절차에서는 복사 시 컨텍스트를 보존하기 위해 --preserve=context 옵션을 사용하는 방법을 보여줍니다.
  1. 사용자의 홈 디렉터리에서 파일을 만듭니다. 파일에는 user_home_t 유형으로 레이블이 지정됩니다.
    ~]$ touch file1
    Copy to Clipboard Toggle word wrap
    ~]$ ls -Z file1
    -rw-rw-r--  user1 group1 unconfined_u:object_r:user_home_t:s0 file1
    
    Copy to Clipboard Toggle word wrap
  2. /var/www/html/ 디렉터리는 다음 명령과 같이 httpd_sys_content_t 유형으로 레이블이 지정됩니다.
    ~]$ ls -dZ /var/www/html/
    drwxr-xr-x  root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html/
    
    Copy to Clipboard Toggle word wrap
  3. preserve =context 옵션을 사용하면 복사 작업 중에 SELinux 컨텍스트가 유지됩니다. 아래 표시된 대로 파일이 /var/www/html/:에 복사될 때 file1user_home_t 유형이 보존되었습니다.
    ~]# cp --preserve=context file1 /var/www/html/
    Copy to Clipboard Toggle word wrap
    ~]$ ls -Z /var/www/html/file1
    -rw-r--r--  root root unconfined_u:object_r:user_home_t:s0 /var/www/html/file1
    
    Copy to Clipboard Toggle word wrap

절차 4.13. 문맥 복사 및 변경

다음 절차에서는 --context 옵션을 사용하여 대상 복사의 컨텍스트를 변경하는 방법을 보여줍니다. 다음 예는 사용자의 홈 디렉터리에서 수행됩니다.
  1. 사용자의 홈 디렉터리에서 파일을 만듭니다. 파일에는 user_home_t 유형으로 레이블이 지정됩니다.
    ~]$ touch file1
    Copy to Clipboard Toggle word wrap
    ~]$ ls -Z file1
    -rw-rw-r--  user1 group1 unconfined_u:object_r:user_home_t:s0 file1
    
    Copy to Clipboard Toggle word wrap
  2. context 옵션을 사용하여 SELinux 컨텍스트를 정의합니다.
    ~]$ cp --context=system_u:object_r:samba_share_t:s0 file1 file2
    Copy to Clipboard Toggle word wrap
  3. --context 가 없으면file2unconfined_u:object_r:user_home_t 컨텍스트로 레이블이 지정됩니다.
    ~]$ ls -Z file1 file2
    -rw-rw-r--  user1 group1 unconfined_u:object_r:user_home_t:s0 file1
    -rw-rw-r--  user1 group1 system_u:object_r:samba_share_t:s0 file2
    
    Copy to Clipboard Toggle word wrap

절차 4.14. 기존 파일에서 파일 복사

이 절차에서는 컨텍스트를 보존하는 데 옵션을 사용하지 않는 한 기존 파일을 통해 파일을 복사할 때 기존 파일의 컨텍스트가 보존되는 것을 보여줍니다.
  1. root 로서 /etc 디렉토리에 새 파일 file1 을 만듭니다. 아래에 표시된 대로 파일에는 etc_t 유형으로 레이블이 지정됩니다.
    ~]# touch /etc/file1
    Copy to Clipboard Toggle word wrap
    ~]$ ls -Z /etc/file1
    -rw-r--r--  root root unconfined_u:object_r:etc_t:s0   /etc/file1
    
    Copy to Clipboard Toggle word wrap
  2. /tmp 디렉터리에 다른 file2 파일을 생성합니다. 아래 표시된 대로 파일에는 user_tmp_t 유형으로 레이블이 지정됩니다.
    ~]$ touch /tmp/file2
    Copy to Clipboard Toggle word wrap
    ~$ ls -Z /tmp/file2
    -rw-r--r--  root root unconfined_u:object_r:user_tmp_t:s0 /tmp/file2
    
    Copy to Clipboard Toggle word wrap
  3. file2file1 을 덮어씁니다.
    ~]# cp /tmp/file2 /etc/file1
    Copy to Clipboard Toggle word wrap
  4. 복사 후 다음 명령은 /etc/ file1 을 대체하는 /tmp/file2user_tmp_t 유형이 아닌 etc_t 유형으로 레이블이 지정된 file1을 표시합니다.
    ~]$ ls -Z /etc/file1
    -rw-r--r--  root root unconfined_u:object_r:etc_t:s0   /etc/file1
    
    Copy to Clipboard Toggle word wrap
중요
파일 및 디렉터리를 이동하지 않고 복사합니다. 이렇게 하면 올바른 SELinux 컨텍스트로 레이블이 지정되도록 하는 데 도움이 됩니다. 잘못된 SELinux 컨텍스트는 프로세스가 해당 파일 및 디렉터리에 액세스하지 못하도록 할 수 있습니다.

4.10.2. 파일 및 디렉토리 이동

파일과 디렉토리는 이동 시 현재 SELinux 컨텍스트를 유지합니다. 대부분의 경우 이 동작은 이동 중인 위치에 대해 올바르지 않습니다. 다음 예제에서는 사용자의 홈 디렉터리에서 Apache HTTP Server에서 사용하는 /var/www/html/ 디렉터리로 파일을 이동하는 방법을 보여줍니다. 파일이 이동되었으므로 올바른 SELinux 컨텍스트를 상속하지 않습니다.

절차 4.15. 파일 및 디렉토리 이동

  1. 홈 디렉터리로 변경하고 파일을 만듭니다. 파일에는 user_home_t 유형으로 레이블이 지정됩니다.
    ~]$ touch file1
    Copy to Clipboard Toggle word wrap
    ~]$ ls -Z file1
    -rw-rw-r--  user1 group1 unconfined_u:object_r:user_home_t:s0 file1
    
    Copy to Clipboard Toggle word wrap
  2. 다음 명령을 입력하여 /var/www/html/ 디렉터리의 SELinux 컨텍스트를 확인합니다.
    ~]$ ls -dZ /var/www/html/
    drwxr-xr-x  root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html/
    
    Copy to Clipboard Toggle word wrap
    기본적으로 /var/www/html/ 은/는 httpd_sys_content_t 유형으로 레이블이 지정됩니다. /var/www/html/ 에서 생성된 파일 및 디렉터리는 이 유형을 상속하므로 이 유형으로 레이블이 지정됩니다.
  3. root 로서 file1/var/www/html/ 로 이동합니다. 이 파일이 이동되므로 현재 user_home_t 유형이 유지됩니다.
    ~]# mv file1 /var/www/html/
    Copy to Clipboard Toggle word wrap
    ~]# ls -Z /var/www/html/file1
    -rw-rw-r--  user1 group1 unconfined_u:object_r:user_home_t:s0 /var/www/html/file1
    
    Copy to Clipboard Toggle word wrap
기본적으로 Apache HTTP 서버는 user_home_t 유형으로 레이블이 지정된 파일을 읽을 수 없습니다. 웹 페이지를 포함하는 모든 파일에 user_home_t 유형으로 레이블이 지정되거나 Apache HTTP Server에서 읽을 수 없는 다른 유형이 있는 경우 Mozilla Firefox 와 같은 웹 브라우저를 사용하여 액세스하려고 할 때 권한이 거부됩니다.
중요
mv 명령을 사용하여 파일과 디렉터리를 이동하면 잘못된 SELinux 컨텍스트가 발생하여 Apache HTTP Server 및 Samba와 같은 프로세스가 이러한 파일 및 디렉터리에 액세스하지 못할 수 있습니다.

4.10.3. 기본 SELinux 컨텍스트 확인

matchpathcon 유틸리티를 사용하여 파일과 디렉터리에 올바른 SELinux 컨텍스트가 있는지 확인합니다. 이 유틸리티는 시스템 정책을 쿼리한 다음 파일 경로와 연결된 기본 보안 컨텍스트를 제공합니다.[6] 다음 예제에서는 matchpathcon 을 사용하여 /var/www/html/ 디렉터리의 파일에 올바르게 레이블이 지정되어 있는지 확인하는 방법을 보여줍니다.

절차 4.16. matchpathcon으로 기본 SELinux Conxtext 확인

  1. root 사용자로 /var/www/html/ 디렉터리에 세 개의 파일(file1,file2, file3)을 만듭니다. 이러한 파일은 /var/www/html/:의 httpd_sys_content_t 유형을 상속합니다.
    ~]# touch /var/www/html/file{1,2,3}
    Copy to Clipboard Toggle word wrap
    ~]# ls -Z /var/www/html/
    -rw-r--r--  root root unconfined_u:object_r:httpd_sys_content_t:s0 file1
    -rw-r--r--  root root unconfined_u:object_r:httpd_sys_content_t:s0 file2
    -rw-r--r--  root root unconfined_u:object_r:httpd_sys_content_t:s0 file3
    
    Copy to Clipboard Toggle word wrap
  2. root 로서 file1 유형을 samba_share_t 로 변경합니다. Apache HTTP Server는 samba_share_t 유형으로 레이블이 지정된 파일 또는 디렉터리를 읽을 수 없습니다.
    ~]# chcon -t samba_share_t /var/www/html/file1
    Copy to Clipboard Toggle word wrap
  3. matchpathcon -V 옵션은 현재 SELinux 컨텍스트를 SELinux 정책의 올바른 기본 컨텍스트와 비교합니다. 다음 명령을 입력하여 /var/www/html/ 디렉터리의 모든 파일을 확인합니다.
    ~]$ matchpathcon -V /var/www/html/*
    /var/www/html/file1 has context unconfined_u:object_r:samba_share_t:s0, should be system_u:object_r:httpd_sys_content_t:s0
    /var/www/html/file2 verified.
    /var/www/html/file3 verified.
    
    Copy to Clipboard Toggle word wrap
matchpathcon 명령의 다음 출력에서는 file1samba_share_t 유형으로 레이블이 지정되었지만 httpd_sys_content_t 유형으로 레이블이 지정되어야 함을 설명합니다.
/var/www/html/file1 has context unconfined_u:object_r:samba_share_t:s0, should be system_u:object_r:httpd_sys_content_t:s0
Copy to Clipboard Toggle word wrap
레이블 문제를 해결하고 file1 에 대한 Apache HTTP Server 액세스를 허용하려면 root로 restorecon 유틸리티를 사용합니다.
~]# restorecon -v /var/www/html/file1
restorecon reset /var/www/html/file1 context unconfined_u:object_r:samba_share_t:s0->system_u:object_r:httpd_sys_content_t:s0
Copy to Clipboard Toggle word wrap

4.10.4. tar로 파일 아카이브

tar 유틸리티는 기본적으로 확장된 속성을 유지하지 않습니다. SELinux 컨텍스트는 확장된 특성에 저장되므로 파일을 보관할 때 컨텍스트가 손실될 수 있습니다. tar --selinux 명령을 사용하여 컨텍스트를 유지하고 아카이브에서 파일을 복원하는 아카이브를 생성합니다. tar 아카이브에 확장 속성이 없는 파일이 포함되어 있거나 확장된 속성이 시스템 기본값과 일치하도록 하려면 restorecon 유틸리티를 사용합니다.
~]$ tar -xvf archive.tar | restorecon -f -
Copy to Clipboard Toggle word wrap
디렉터리에 따라 restorecon 을 실행하려면 root 사용자여야 할 수 있습니다.
다음 예제에서는 SELinux 컨텍스트를 유지하는 tar 아카이브를 생성하는 방법을 보여줍니다.

절차 4.17. tar 아카이브 만들기

  1. /var/www/html/ 디렉터리로 변경하고 SELinux 컨텍스트를 확인합니다.
    ~]$ cd /var/www/html/
    Copy to Clipboard Toggle word wrap
    html]$ ls -dZ /var/www/html/
    drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 .
    Copy to Clipboard Toggle word wrap
  2. root 로서 /var/www/html/ 에 세 개의 파일(file1,file2, file3)을 만듭니다. 이러한 파일은 /var/www/html/:의 httpd_sys_content_t 유형을 상속합니다.
    html]# touch file{1,2,3}
    Copy to Clipboard Toggle word wrap
    html]$ ls -Z /var/www/html/
    -rw-r--r--  root root unconfined_u:object_r:httpd_sys_content_t:s0 file1
    -rw-r--r--  root root unconfined_u:object_r:httpd_sys_content_t:s0 file2
    -rw-r--r--  root root unconfined_u:object_r:httpd_sys_content_t:s0 file3
    
    Copy to Clipboard Toggle word wrap
  3. root 로 다음 명령을 입력하여 test. tar 이라는 tar 아카이브를 만듭니다. SELinux 컨텍스트를 유지하려면 --selinux 를 사용합니다.
    html]# tar --selinux -cf test.tar file{1,2,3}
    Copy to Clipboard Toggle word wrap
  4. root 로서 test/ 라는 새 디렉터리를 생성한 다음 모든 사용자가 모든 사용자가 액세스할 수 있도록 허용합니다.
    ~]# mkdir /test
    Copy to Clipboard Toggle word wrap
    ~]# chmod 777 /test/
    Copy to Clipboard Toggle word wrap
  5. test.tar 파일을 test/:에 복사합니다.
    ~]$ cp /var/www/html/test.tar /test/
    Copy to Clipboard Toggle word wrap
  6. test/ 디렉터리로 변경합니다. 이 디렉터리에 다음 명령을 입력하여 tar 아카이브를 추출합니다. --selinux 옵션을 다시 지정합니다. 그러지 않으면 SELinux 컨텍스트가 default_t 로 변경됩니다.
    ~]$ cd /test/
    Copy to Clipboard Toggle word wrap
    test]$ tar --selinux -xvf test.tar
    Copy to Clipboard Toggle word wrap
  7. SELinux 컨텍스트 보기. httpd_sys_content_t 유형은 default_t 로 변경되지 않고 --selinux 를 사용하지 않은 상태로 유지되었습니다.
    test]$ ls -lZ /test/
    -rw-r--r--  user1 group1 unconfined_u:object_r:httpd_sys_content_t:s0 file1
    -rw-r--r--  user1 group1 unconfined_u:object_r:httpd_sys_content_t:s0 file2
    -rw-r--r--  user1 group1 unconfined_u:object_r:httpd_sys_content_t:s0 file3
    -rw-r--r--  user1 group1 unconfined_u:object_r:default_t:s0 test.tar
    
    Copy to Clipboard Toggle word wrap
  8. test/ 디렉터리가 더 이상 필요하지 않은 경우 root로 다음 명령을 입력하여 제거하고 여기에 있는 모든 파일을 삭제합니다.
    ~]# rm -ri /test/
    Copy to Clipboard Toggle word wrap
모든 확장 속성을 유지하는 --xattrs 옵션과 같이 tar 에 대한 자세한 내용은 tar(1) 매뉴얼 페이지를 참조하십시오.

4.10.5. 별이있는 파일 아카이브

star 유틸리티는 기본적으로 확장 속성을 유지하지 않습니다. SELinux 컨텍스트는 확장된 특성에 저장되므로 파일을 보관할 때 컨텍스트가 손실될 수 있습니다. star -xattr -H=exustar 명령을 사용하여 컨텍스트를 유지하는 아카이브를 생성합니다. star 패키지는 기본적으로 설치되지 않습니다. 별표 를 설치하려면 root 사용자로 yum install star 명령을 실행합니다.
다음 예제에서는 SELinux 컨텍스트를 유지하는 아카이브를 생성하는 방법을 보여줍니다.

절차 4.18.  아카이브 생성

  1. root 로서 /var/www/html/ 에 세 개의 파일(file1,file2, file3)을 만듭니다. 이러한 파일은 /var/www/html/:의 httpd_sys_content_t 유형을 상속합니다.
    ~]# touch /var/www/html/file{1,2,3}
    Copy to Clipboard Toggle word wrap
    ~]# ls -Z /var/www/html/
    -rw-r--r--  root root unconfined_u:object_r:httpd_sys_content_t:s0 file1
    -rw-r--r--  root root unconfined_u:object_r:httpd_sys_content_t:s0 file2
    -rw-r--r--  root root unconfined_u:object_r:httpd_sys_content_t:s0 file3
    
    Copy to Clipboard Toggle word wrap
  2. /var/www/html/ 디렉터리로 변경합니다. 이 디렉터리에서 root로 다음 명령을 입력하여 test. star:이라는 별 아카이브를 생성합니다.
    ~]$ cd /var/www/html
    Copy to Clipboard Toggle word wrap
    html]# star -xattr -H=exustar -c -f=test.star file{1,2,3}
    star: 1 blocks + 0 bytes (total of 10240 bytes = 10.00k).
    
    Copy to Clipboard Toggle word wrap
  3. root 로서 test/ 라는 새 디렉터리를 생성한 다음 모든 사용자가 모든 사용자가 액세스할 수 있도록 허용합니다.
    ~]# mkdir /test
    Copy to Clipboard Toggle word wrap
    ~]# chmod 777 /test/
    Copy to Clipboard Toggle word wrap
  4. 다음 명령을 입력하여 test.star 파일을 test/:에 복사합니다.
    ~]$ cp /var/www/html/test.star /test/
    Copy to Clipboard Toggle word wrap
  5. test/ 로 변경합니다. 이 디렉터리에 다음 명령을 입력하여 star 아카이브를 추출합니다.
    ~]$ cd /test/
    Copy to Clipboard Toggle word wrap
    test]$ star -x -f=test.star 
    star: 1 blocks + 0 bytes (total of 10240 bytes = 10.00k).
    
    Copy to Clipboard Toggle word wrap
  6. SELinux 컨텍스트 보기. httpd_sys_content_t 유형이 default_t 로 변경되지 않고 유지되었습니다. 이 유형은 -xattr -H=exustar 옵션이 사용되지 않았습니다.
    ~]$ ls -lZ /test/
    -rw-r--r--  user1 group1 unconfined_u:object_r:httpd_sys_content_t:s0 file1
    -rw-r--r--  user1 group1 unconfined_u:object_r:httpd_sys_content_t:s0 file2
    -rw-r--r--  user1 group1 unconfined_u:object_r:httpd_sys_content_t:s0 file3
    -rw-r--r--  user1 group1 unconfined_u:object_r:default_t:s0 test.star
    
    Copy to Clipboard Toggle word wrap
  7. test/ 디렉터리가 더 이상 필요하지 않은 경우 root로 다음 명령을 입력하여 제거하고 여기에 있는 모든 파일을 삭제합니다.
    ~]# rm -ri /test/
    Copy to Clipboard Toggle word wrap
  8. 더 이상 별이 필요하지 않은 경우 root 로서 패키지를 제거합니다.
    ~]# yum remove star
    Copy to Clipboard Toggle word wrap
별에 대한 자세한 내용은 star(1) 도움말 페이지를 참조하십시오.


[6] matchpathcon 에 대한 자세한 내용은 matchpathcon(8) 도움말 페이지를 참조하십시오.

4.11. 정보 수집 도구

아래에 열거된 유틸리티는 액세스 벡터 캐시 통계 또는 클래스, 유형 또는 부울 수와 같이 잘 포맷된 정보를 제공하는 명령줄 도구입니다.

avcstat

이 명령은 부팅 이후 액세스 벡터 캐시 통계의 짧은 출력을 제공합니다. 시간 간격(초)을 지정하여 실시간으로 통계를 볼 수 있습니다. 이는 초기 출력 이후 업데이트된 통계를 제공합니다. 사용된 통계 파일은 /sys/fs/selinux/avc/cache_stats 이며 -f /path/to/file 옵션을 사용하여 다른 캐시 파일을 지정할 수 있습니다.
~]# avcstat 
   lookups       hits     misses     allocs   reclaims      frees
  47517410   47504630      12780      12780      12176      12275
Copy to Clipboard Toggle word wrap

seinfo

이 유틸리티는 클래스, 유형, 부울, 허용 규칙 등의 정책의 중단을 설명하는 데 유용합니다. seinfopolicy.conf 파일, 바이너리 정책 파일, 모듈식 정책 패키지 목록 또는 정책 목록 파일을 입력으로 사용하는 명령줄 유틸리티입니다. seinfo 유틸리티를 사용하려면 setools-console 패키지가 설치되어 있어야 합니다.
seinfo 의 출력은 바이너리 파일과 소스 파일마다 다릅니다. 예를 들어 정책 소스 파일은 { } 대괄호를 사용하여 여러 규칙 요소를 한 줄에 그룹화합니다. 단일 속성이 하나 또는 여러 유형으로 확장되는 속성과 유사한 효과가 발생합니다. 이러한 항목이 확장되어 바이너리 정책 파일에서 더 이상 관련이 없으므로 검색 결과에 반환 값이 0입니다. 그러나 대괄호를 사용하여 이전 한 줄 규칙 각각에 따라 룰 수가 크게 증가합니다. 이제 여러 개의 개별 행이 있습니다.
일부 항목은 바이너리 정책에 존재하지 않습니다. 예를 들어, neverallow 규칙은 런타임이 아닌 정책 컴파일 중에만 확인되며, 초기 보안 식별자(SID)는 부팅 중에 커널에서 로드하는 정책보다 먼저 필요하므로 바이너리 정책의 일부가 아닙니다.
~]# seinfo

Statistics for policy file: /sys/fs/selinux/policy
Policy Version & Type: v.28 (binary, mls)

   Classes:            77    Permissions:       229
   Sensitivities:       1    Categories:       1024
   Types:            3001    Attributes:        244
   Users:               9    Roles:              13
   Booleans:          158    Cond. Expr.:       193
   Allow:          262796    Neverallow:          0
   Auditallow:         44    Dontaudit:      156710
   Type_trans:      10760    Type_change:        38
   Type_member:        44    Role allow:         20
   Role_trans:        237    Range_trans:      2546
   Constraints:        62    Validatetrans:       0
   Initial SIDs:       27    Fs_use:             22
   Genfscon:           82    Portcon:           373
   Netifcon:            0    Nodecon:             0
   Permissives:        22    Polcap:              2
Copy to Clipboard Toggle word wrap
seinfo 유틸리티는 도메인 속성이 있는 유형 수를 나열하여 다른 제한된 프로세스의 수를 추정할 수도 있습니다.
~]# seinfo -adomain -x | wc -l
550
Copy to Clipboard Toggle word wrap
일부 도메인 유형이 제한된 것은 아닙니다. 제한되지 않은 도메인의 수를 보려면 unconfined_domain 특성을 사용합니다.
~]# seinfo -aunconfined_domain_type -x | wc -l
52
Copy to Clipboard Toggle word wrap
허용 도메인은 --permissive 옵션을 사용하여 계산할 수 있습니다.
~]# seinfo --permissive -x | wc -l
31
Copy to Clipboard Toggle word wrap
위의 명령에서 추가 | wc -l 명령을 제거하여 전체 목록을 확인합니다.

sesearch

sesearch 유틸리티를 사용하여 정책에서 특정 규칙을 검색할 수 있습니다. 정책 소스 파일 또는 바이너리 파일을 검색할 수 있습니다. 예를 들어 다음과 같습니다.
~]$ sesearch --role_allow -t httpd_sys_content_t
Found 20 role allow rules:
   allow system_r sysadm_r;
   allow sysadm_r system_r;
   allow sysadm_r staff_r;
   allow sysadm_r user_r;
   allow system_r git_shell_r;
   allow system_r guest_r;
   allow logadm_r system_r;
   allow system_r logadm_r;
   allow system_r nx_server_r;
   allow system_r staff_r;
   allow staff_r logadm_r;
   allow staff_r sysadm_r;
   allow staff_r unconfined_r;
   allow staff_r webadm_r;
   allow unconfined_r system_r;
   allow system_r unconfined_r;
   allow system_r user_r;
   allow webadm_r system_r;
   allow system_r webadm_r;
   allow system_r xguest_r;
Copy to Clipboard Toggle word wrap
sesearch 유틸리티는 허용 규칙 수를 제공할 수 있습니다.
~]# sesearch --allow | wc -l
262798
Copy to Clipboard Toggle word wrap
dontaudit 규칙 수입니다.
~]# sesearch --dontaudit | wc -l
156712
Copy to Clipboard Toggle word wrap

4.12. SELinux 정책 모듈 우선순위 및 비활성화

/etc/selinux/ 의 SELinux 모듈 스토리지를 사용하면 SELinux 모듈에서 우선 순위를 사용할 수 있습니다. 다음 명령을 root로 입력하여 다른 우선 순위의 두 모듈 디렉터리를 표시합니다.
~]# ls /etc/selinux/targeted/active/modules
100  400  disabled
Copy to Clipboard Toggle word wrap
semodule 유틸리티에서 사용하는 기본 우선순위는 400이지만 selinux-policy 패키지에 사용되는 우선 순위는 100이므로 우선 순위 100으로 설치된 대부분의 SELinux 모듈을 찾을 수 있습니다.
기존 모듈을 더 높은 우선 순위로 동일한 이름으로 수정된 모듈로 재정의할 수 있습니다. 동일한 이름과 다른 우선 순위가 있는 모듈이 더 많은 경우 정책이 구축될 때 우선 순위가 가장 높은 모듈만 사용됩니다.

예 4.1. SELinux 정책 모듈 우선 순위 사용

수정된 파일 컨텍스트를 사용하여 새 모듈을 준비합니다. semodule -i 명령을 사용하여 모듈을 설치하고 모듈의 우선 순위를 400으로 설정합니다. 다음 예제에서는 sandbox.pp 를 사용합니다.
~]# semodule -X 400 -i sandbox.pp
~]# semodule --list-modules=full | grep sandbox
400 sandbox           pp
100 sandbox           pp
Copy to Clipboard Toggle word wrap
기본 모듈로 돌아가려면 root로 semodule -r 명령을 입력합니다.
~]# semodule -X 400 -r sandbox
libsemanage.semanage_direct_remove_key: sandbox module at priority 100 is now active.
Copy to Clipboard Toggle word wrap

시스템 정책 모듈 비활성화

시스템 정책 모듈을 비활성화하려면 root로 다음 명령을 입력합니다.
semodule -d MODULE_NAME
Copy to Clipboard Toggle word wrap
주의
semodule -r 명령을 사용하여 시스템 정책 모듈을 제거하면 시스템 스토리지에서 삭제되고 다시 로드할 수 없습니다. 모든 시스템 정책 모듈을 복원하기 위해 selinux-policy-targeted 패키지를 불필요한 다시 설치하지 않으려면 대신 semodule -d 명령을 사용합니다.

4.13. 다단계 보안(MLS)

다단계 보안 기술은 La Padula 필수 액세스 모델을 적용하는 보안 체계를 의미합니다. MLS에서 사용자와 프로세스는 제목이라고 하며 시스템의 파일, 장치 및 기타 패시브 구성 요소라고 합니다. 제목과 객체 모두 보안 수준으로 레이블이 지정되며, 주제의 모음 또는 객체 분류가 필요합니다. 예를 들어 각 보안 수준은 민감도범주로 구성됩니다. 예를 들어 내부 릴리스 일정은 기밀 민감도로 내부 문서 범주에 기록됩니다.
그림 4.1. “마케도니아 레벨” 는 원래 미국 국방 커뮤니티에서 디자인한 것으로 나타났습니다. 위의 내부 일정 예와 관련하여 기밀 유지를 받은 사용자만 기밀 카테고리에서 문서를 볼 수 있습니다. 단, 기밀 자료만 가지고 있는 사용자는 더 높은 수준 또는 사진이 필요한 문서를 볼 수 없습니다. 낮은 수준의 문서에만 읽기 액세스 권한이 허용되며, 더 높은 수준의 문서를 사용할 수 있습니다.

그림 4.1. 마케도니아 레벨

그림 4.2. “MLS를 사용하여 허용된 데이터 흐름” 는 "Secret" 보안 수준에서 실행되는 주체와 다른 보안 수준의 다양한 개체 간에 허용되는 모든 데이터 흐름을 보여줍니다. 간단히 요약하면 읽기 가능하고 쓰기가 필요하지 않은 두 가지 속성을 적용할 수 있습니다.

그림 4.2. MLS를 사용하여 허용된 데이터 흐름

4.13.1. MLS 및 시스템 권한

MLS 액세스 규칙은 항상 기존 액세스 권한(파일 권한)과 결합됩니다. 예를 들어 "Secret"의 보안 수준이 있는 사용자가 DAC(Despretionary Access Control)를 사용하여 다른 사용자가 파일에 대한 액세스를 차단하는 경우 "최고의 비밀" 수준의 보안 수준이 있는 사용자의 액세스도 차단됩니다. DAC 규칙 다음에 SELinux MLS 정책 규칙이 확인된다는 점을 기억하는 것이 중요합니다. 보안 수준이 높은 경우 파일 시스템을 임의로 검색하는 권한을 자동으로 부여하지 않습니다.
최상위 레벨의 사용자는 다단계 시스템에 대한 관리 권한을 자동으로 획득하지 못합니다. 컴퓨터의 모든 정보에 액세스할 수 있지만 관리 권한을 갖는 것과는 다릅니다.

4.13.2. SELinux에서 MLS 활성화

참고
X Window 시스템을 실행 중인 시스템에서 MLS 정책을 사용하지 않는 것이 좋습니다.
다음 단계에 따라 시스템에서 SELinux MLS 정책을 활성화합니다.

절차 4.19. SELinux MLS 정책 활성화

  1. selinux-policy-✓s 패키지를 설치합니다.
    ~]# yum install selinux-policy-mls
    Copy to Clipboard Toggle word wrap
  2. MLS 정책을 활성화하기 전에 파일 시스템의 각 파일의 레이블을 MLS 레이블로 다시 지정해야 합니다. 파일 시스템의 레이블을 다시 지정하면 제한된 도메인이 액세스가 거부될 수 있으므로 시스템이 올바르게 부팅되지 않을 수 있습니다. 이러한 문제가 발생하지 않도록 /etc/selinux/config 파일에서 SELINUX=permissive 를 구성합니다. 또한 SELINUXTYPE=mls 를 구성하여 MLS 정책을 활성화합니다. 구성 파일은 다음과 같아야 합니다.
    # 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=permissive
    # SELINUXTYPE= can take one of these two values:
    #       targeted - Targeted processes are protected,
    #       mls - Multi Level Security protection.
    SELINUXTYPE=mls
    
    Copy to Clipboard Toggle word wrap
  3. SELinux가 허용 모드에서 실행 중인지 확인합니다.
    ~]# setenforce 0
    Copy to Clipboard Toggle word wrap
    ~]$ getenforce
    Permissive
    
    Copy to Clipboard Toggle word wrap
  4. 수정 파일 스크립트를 사용하여 다음 재부팅 시 파일의 레이블을 다시 지정하도록 -F 옵션이 포함된 /.autorelabel 파일을 만듭니다.
    ~]# fixfiles -F onboot
    Copy to Clipboard Toggle word wrap
  5. 시스템을 재부팅합니다. 다음 부팅 중에 모든 파일 시스템은 MLS 정책에 따라 레이블이 다시 지정됩니다. 레이블 프로세스는 적절한 SELinux 컨텍스트를 사용하여 모든 파일의 레이블을 지정합니다.
    *** Warning -- SELinux mls policy relabel is required.
    *** Relabeling could take a very long time, depending on file
    *** system size and speed of hard drives.
    ***********
    
    Copy to Clipboard Toggle word wrap
    맨 아래에 있는 각 * (별표) 문자는 레이블이 지정된 1000개의 파일을 나타냅니다. 위의 예에서 11자 * 문자는 레이블이 지정된 11000 파일을 나타냅니다. 모든 파일에 레이블을 지정하는 데 걸리는 시간은 시스템의 파일 수와 하드 디스크 드라이브의 속도에 따라 달라집니다. 최신 시스템에서 이 프로세스는 10분도 걸리지 않습니다. 레이블 지정 프로세스가 완료되면 시스템이 자동으로 재부팅됩니다.
  6. 허용 모드에서는 SELinux 정책이 적용되지 않지만 강제 모드에서 실행 중인 경우 거부된 작업에 여전히 기록됩니다. 강제 모드로 변경하기 전에 root로 다음 명령을 입력하여 마지막 부팅 중에 SELinux가 작업을 거부하지 않았는지 확인합니다. 마지막 부팅 중에 SELinux에서 작업을 거부하지 않은 경우 이 명령은 출력을 반환하지 않습니다. 부팅 중 SELinux가 액세스를 거부한 경우 문제 해결 정보는 11장. 문제 해결 을 참조하십시오.
    ~]# grep "SELinux is preventing" /var/log/messages
    Copy to Clipboard Toggle word wrap
  7. /var/log/messages 파일에 거부 메시지가 없거나 모든 기존 거부를 해결한 경우 /etc/selinux/config 파일에서 SELINUX=enforcing 을 구성합니다.
    # 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=enforcing
    # SELINUXTYPE= can take one of these two values:
    #       targeted - Targeted processes are protected,
    #       mls - Multi Level Security protection.
    SELINUXTYPE=mls
    
    Copy to Clipboard Toggle word wrap
  8. 시스템을 재부팅하고 SELinux가 강제 모드에서 실행 중인지 확인합니다.
    ~]$ getenforce
    Enforcing
    
    Copy to Clipboard Toggle word wrap
    MLS 정책이 활성화되어 있습니다.
    ~]# sestatus |grep mls
    Policy from config file:        mls
    
    Copy to Clipboard Toggle word wrap

4.13.3. 특정 MLS 범위를 사용하여 사용자 생성

특정 MLS 범위를 사용하여 새 Linux 사용자를 생성하려면 다음 단계를 따르십시오.

절차 4.20. 특정 MLS 범위를 사용하여 사용자 생성

  1. useradd 명령을 사용하여 새 Linux 사용자를 추가하고 새 Linux 사용자를 기존 SELinux 사용자(이 경우 staff_u)에 매핑합니다.
    ~]# useradd -Z staff_u john
    Copy to Clipboard Toggle word wrap
  2. 새로 생성된 Linux 사용자에게 암호를 할당합니다.
    prompt~]# passwd john
    Copy to Clipboard Toggle word wrap
  3. SELinux와 Linux 사용자 간의 매핑을 보려면 root로 다음 명령을 입력합니다. 출력은 다음과 같아야 합니다.
    ~]# semanage login -l
    Login Name           SELinux User         MLS/MCS Range        Service
    
    __default__          user_u               s0-s0                *
    john                 staff_u              s0-s15:c0.c1023      *
    root                 root                 s0-s15:c0.c1023      *
    staff                staff_u              s0-s15:c0.c1023      *
    sysadm               staff_u              s0-s15:c0.c1023      *
    system_u             system_u             s0-s15:c0.c1023      *
    Copy to Clipboard Toggle word wrap
  4. 사용자 john 에 대한 특정 범위를 정의합니다.
    ~]# semanage login --modify --range s2:c100 john
    Copy to Clipboard Toggle word wrap
  5. SELinux와 Linux 사용자 간의 매핑을 다시 봅니다. 사용자 john 에는 이제 특정 MLS 범위가 정의되어 있습니다.
    ~]# semanage login -l
    Login Name           SELinux User         MLS/MCS Range        Service
    
    __default__          user_u               s0-s0                *
    john                 staff_u              s2:c100              *
    root                 root                 s0-s15:c0.c1023      *
    staff                staff_u              s0-s15:c0.c1023      *
    sysadm               staff_u              s0-s15:c0.c1023      *
    system_u             system_u             s0-s15:c0.c1023      *
    Copy to Clipboard Toggle word wrap
  6. 필요한 경우 john의 홈 디렉터리에서 레이블을 수정하려면 다음 명령을 입력합니다.
    ~]# chcon -R -l s2:c100 /home/john
    Copy to Clipboard Toggle word wrap

4.13.4. Polyinstantiated 디렉토리 설정

/tmp/var/tmp/ 디렉터리는 일반적으로 모든 프로그램, 서비스 및 사용자의 임시 스토리지에 사용됩니다. 그러나 이러한 설정을 사용하면 이러한 디렉터리가 경쟁 조건 공격에 취약하거나 파일 이름에 따라 정보 누출이 발생할 수 있습니다. SELinux는 다중 인스턴스화된 디렉터리의 형태로 솔루션을 제공합니다. 이는 효과적으로 /tmp/var/tmp/ 가 인스턴스화되어 각 사용자에 대해 비공개로 표시되는 것을 의미합니다. 디렉토리 인스턴스화가 활성화되면 각 사용자의 /tmp/var/tmp/ 디렉토리가 /tmp-inst/var/tmp/tmp-inst 에 자동으로 마운트됩니다.
다음 단계에 따라 디렉터리의 다중화를 활성화합니다.

절차 4.21. Polyinstantiation 디렉터리 활성화

  1. /etc/security/namespace.conf 파일에서 마지막 세 줄의 주석을 제거하여 /tmp , /var /tmp /, 사용자의 홈 디렉터리의 인스턴스화를 활성화합니다.
    ~]$ tail -n 3 /etc/security/namespace.conf
    /tmp     /tmp-inst/            level      root,adm
    /var/tmp /var/tmp/tmp-inst/    level      root,adm
    $HOME    $HOME/$USER.inst/     level
    
    Copy to Clipboard Toggle word wrap
  2. /etc/pam.d/login 파일에서 pam_namespace.so 모듈이 세션에 대해 구성되었는지 확인합니다.
    ~]$ grep namespace /etc/pam.d/login
    session    required     pam_namespace.so
    
    Copy to Clipboard Toggle word wrap
  3. 시스템을 재부팅합니다.

4.14. 파일 이름 전환

파일 이름 전환 기능을 사용하면 정책 작성자가 정책 전환 규칙을 작성할 때 파일 이름을 지정할 수 있습니다. 다음을 나타내는 규칙을 작성할 수 있습니다. A_t 레이블이 지정된 프로세스가 B_t 레이블이 지정된 디렉터리에 지정된 오브젝트 클래스를 생성하고 지정된 오브젝트 클래스의 이름이 objectname 인 경우 C_t 레이블을 가져옵니다. 이 메커니즘은 시스템의 프로세스에 대해 보다 세밀한 제어를 제공합니다.
파일 이름 전환이 없으면 다음과 같은 세 가지 방법으로 개체에 레이블을 지정할 수 있습니다.
  • 기본적으로 오브젝트는 상위 디렉터리에서 레이블을 상속합니다. 예를 들어 사용자가 etc_t 레이블이 지정된 디렉터리에 파일을 생성하면 파일에 etc_t 레이블이 지정됩니다. 그러나 이 방법은 다른 레이블이 있는 디렉터리 내에 여러 파일이 있는 것이 바람직한 경우 사용되지 않습니다.
  • 정책 작성자는 다음을 명시하는 정책에 규칙을 작성할 수 있습니다. A_t 유형의 프로세스가 B_t 레이블이 지정된 디렉터리에 지정된 오브젝트 클래스를 생성하면 오브젝트에서 새 C_t 레이블을 가져옵니다. 단일 프로그램에서 각 오브젝트에 별도의 레이블이 필요한 동일한 디렉토리에 여러 오브젝트를 생성하는 경우 이 방법이 문제가 됩니다. 또한 생성된 오브젝트의 이름은 지정되지 않으므로 이러한 규칙은 부분적인 제어만 제공합니다.
  • 특정 애플리케이션에는 이러한 애플리케이션이 특정 경로의 레이블이 무엇인지 시스템에 질문할 수 있는 SELinux 인식 기능이 있습니다. 그런 다음 이러한 애플리케이션은 커널을 요청하여 필수 레이블이 있는 오브젝트를 생성합니다. SELinux 인식을 사용하는 애플리케이션의 예로는 rpm 패키지 관리자, restorecon 유틸리티 또는 udev 장치 관리자가 있습니다. 그러나 SELinux 인식을 통해 파일 또는 디렉토리를 생성하는 모든 애플리케이션에 지시할 수 없습니다. 종종 생성 후 올바른 레이블을 사용하여 오브젝트의 레이블을 다시 지정해야 합니다. 그렇지 않으면 제한된 도메인에서 오브젝트 사용을 시도하면 AVC 메시지가 반환됩니다.
파일 이름 전환 기능은 잘못된 레이블 지정과 관련된 문제를 줄이고 시스템의 보안을 강화합니다. 정책 작성자는 특정 애플리케이션에서 지정된 디렉터리에 지정된 이름으로 파일만 생성할 수 있도록 올바르게 표시될 수 있습니다. 규칙은 파일 경로가 아닌 파일 이름을 고려합니다. 파일 경로의 기본 이름입니다. 파일 이름 전환은 strcmp() 함수에서 수행한 정확한 일치를 사용합니다. 정규 표현식 또는 와일드카드 문자 사용은 고려되지 않습니다.
참고
파일 경로는 커널에서 다를 수 있으며 파일 이름 전환은 레이블을 결정하는 데 경로를 사용하지 않습니다. 결과적으로 이 기능은 초기 파일 생성에만 영향을 미치며 이미 생성된 오브젝트의 잘못된 레이블을 수정하지 않습니다.

예 4.2. 파일 이름 전환으로 작성된 정책 규칙의 예

아래 예제에서는 파일 이름 전환이 있는 정책 규칙을 보여줍니다.
filetrans_pattern(unconfined_t, admin_home_t, ssh_home_t, dir, ".ssh")
Copy to Clipboard Toggle word wrap
이 규칙은 unconfined_t 유형의 프로세스가 admin_home_t 레이블이 지정된 디렉터리에 ~/.ssh/ 디렉터리를 생성하면 ~/.ssh/ 디렉터리가 ssh_home_t 레이블을 가져옵니다.
파일 이름 전환으로 작성된 정책 규칙의 유사한 예는 다음과 같습니다.
filetrans_pattern(staff_t, user_home_dir_t, httpd_user_content_t, dir, "public_html")
filetrans_pattern(thumb_t, user_home_dir_t, thumb_home_t, file, "missfont.log")
filetrans_pattern(kernel_t, device_t, xserver_misc_device_t, chr_file, "nvidia0")
filetrans_pattern(puppet_t, etc_t, krb5_conf_t, file, "krb5.conf")
Copy to Clipboard Toggle word wrap
참고
파일 이름 전환 기능은 주로 정책 작성자에 영향을 미치지만, 사용자는 포함된 디렉터리의 기본 레이블로 거의 항상 파일 오브젝트가 생성되지 않고 정책에 지정된 것과 다른 레이블이 있는 것을 알 수 있습니다.

4.15. ptrace() 비활성화

ptrace() 시스템 호출을 사용하면 한 프로세스에서 다른 프로세스의 실행을 관찰 및 제어하고 메모리 및 레지스터를 변경할 수 있습니다. 이 호출은 디버깅 중에 개발자가 주로 사용합니다(예: strace 유틸리티를 사용할 때). ptrace() 가 필요하지 않은 경우 시스템 보안을 개선하기 위해 비활성화할 수 있습니다. 이는 다른 프로세스에서 ptrace() 를 사용할 수 없도록 unconfined_t 도메인에서 실행 중인 모든 프로세스를 거부하는 deny_ptrace 부울을 활성화하여 수행할 수 있습니다.
deny_ptrace 부울은 기본적으로 비활성화되어 있습니다. 이를 활성화하려면 root 사용자로 명령에서 setsebool -P deny_ptrace 를 실행합니다.
~]# setsebool -P deny_ptrace on
Copy to Clipboard Toggle word wrap
이 부울이 활성화되었는지 확인하려면 다음 명령을 사용합니다.
~]$ getsebool deny_ptrace
deny_ptrace --> on
Copy to Clipboard Toggle word wrap
이 부울을 비활성화하려면 setsebool -P deny_ptrace off 명령을 root로 실행합니다.
~]# setsebool -P deny_ptrace off
Copy to Clipboard Toggle word wrap
참고
setsebool -P 명령은 영구적으로 변경합니다. 재부팅 시 변경 사항이 유지되지 않도록 하려면 -P 옵션을 사용하지 마십시오.
이 부울은 Red Hat Enterprise Linux의 일부인 패키지에만 영향을 미칩니다. 결과적으로 타사 패키지에서 ptrace() 시스템 호출을 계속 사용할 수 있었습니다. ptrace() 를 사용할 수 있는 모든 도메인을 나열하려면 다음 명령을 입력합니다. setools-console 패키지는 sesearch 유틸리티를 제공하며 패키지가 기본적으로 설치되지 않습니다.
~]# sesearch -A -p ptrace,sys_ptrace -C | grep -v deny_ptrace | cut -d ' ' -f 5
Copy to Clipboard Toggle word wrap

4.16. 축소네일 보호

축소판 아이콘은 공격자가 USB 장치 또는 CD와 같은 이동식 미디어를 사용하여 잠긴 시스템으로 침입할 수 있습니다. 이동식 미디어를 감지하면 Nautilus 파일 관리자에서 축소판 드라이버 코드를 실행하여 시스템이 잠긴 경우에도 적절한 파일 브라우저에 축소판 아이콘을 표시합니다. 이 동작은 축소판 실행 파일이 취약한 경우 공격자가 암호에 들어가지 않고 잠금 화면을 우회하기 위해 축소판 드라이버 코드를 사용할 수 있기 때문에 안전하지 않습니다.
따라서 이러한 공격을 방지하기 위해 새로운 SELinux 정책을 사용합니다. 이 정책은 화면이 잠길 때 모든 축소판 드라이버가 잠길 수 있도록 합니다. 제한된 사용자와 제한되지 않은 사용자 모두에 대해 축소판 보호가 활성화됩니다. 이 정책은 다음 애플리케이션에 영향을 미칩니다.
  • /usr/bin/evince-thumbnailer
  • /usr/bin/ffmpegthumbnailer
  • /usr/bin/gnome-exe-thumbnailer.sh
  • /usr/bin/gnome-nds-thumbnailer
  • /usr/bin/gnome-xcf-thumbnailer
  • /usr/bin/gsf-office-thumbnailer
  • /usr/bin/raw-thumbnailer
  • /usr/bin/shotwell-video-thumbnailer
  • /usr/bin/totem-video-thumbnailer
  • /usr/bin/whaaw-thumbnailer
  • /usr/lib/tumbler-1/tumblerd
  • /usr/lib64/tumbler-1/tumblerd

5장. sepolicy Suite

sepolicy 유틸리티는 설치된 SELinux 정책을 쿼리하는 기능 제품군을 제공합니다. 이러한 기능은 새로운 기능이거나 sepolgen 또는 setrans 와 같은 별도의 유틸리티에 의해 이전에 제공되었습니다. 모음을 사용하면 전환 보고서, 도움말 페이지 또는 새로운 정책 모듈을 생성할 수 있으므로 사용자가 더 쉽게 액세스할 수 있고 SELinux 정책을 더 잘 이해할 수 있습니다.
policycoreutils-devel 패키지는 sepolicy 를 제공합니다. sepolicy 를 설치할 root 사용자로 다음 명령을 입력합니다.
~]# yum install policycoreutils-devel
Copy to Clipboard Toggle word wrap
sepolicy 제품군은 명령줄 매개 변수로 호출되는 다음 기능을 제공합니다.
Expand
표 5.1. sepolicy 기능
기능Description
부울부울 설명을 보려면 SELinux 정책을 쿼리합니다.
통신SELinux 정책을 쿼리하여 도메인이 서로 통신할 수 있는지 확인합니다.
generateSELinux 정책 모듈 템플릿 생성
GUISELinux 정책 용 그래픽 사용자 인터페이스
인터페이스SELinux 정책 인터페이스 나열
manpageSELinux man 페이지 생성
네트워크SELinux 정책 네트워크 정보 쿼리
전환SELinux 정책을 쿼리하고 프로세스 전환 보고서 생성

5.1. sepolicy Python Bindings

이전 버전의 Red Hat Enterprise Linux에서는 setools 패키지에 sesearchseinfo 유틸리티가 포함되어 있었습니다. sesearch 유틸리티는 SELinux 정책에서 규칙을 검색하는 데 사용되며 seinfo 유틸리티를 사용하면 정책의 다양한 구성 요소를 쿼리할 수 있습니다.
Red Hat Enterprise Linux 7에서는 sesearchseinfo 에 대한 Python 바인딩이 추가되어 sepolicy 제품군을 통해 이러한 유틸리티의 기능을 사용할 수 있습니다. 아래 예제를 참조하십시오.
> python
>>> import sepolicy
>>> sepolicy.info(sepolicy.ATTRIBUTE)
Returns a dictionary of all information about SELinux Attributes
>>>sepolicy.search([sepolicy.ALLOW])
Returns a dictionary of all allow rules in the policy.
Copy to Clipboard Toggle word wrap

5.2. SELinux 정책 모듈 생성: sepolicy generate

이전 버전의 Red Hat Enterprise Linux에서는 sepolgen 또는 selinux-polgengui 유틸리티를 사용하여 SELinux 정책을 생성했습니다. 이러한 툴은 sepolicy 제품군에 병합되었습니다. Red Hat Enterprise Linux 7에서 sepolicy generate 명령은 초기 SELinux 정책 모듈 템플릿을 생성하는 데 사용됩니다.
sepolgen 과 달리 sepolicy generate 를 root 사용자로 실행할 필요가 없습니다. 이 유틸리티는 또한 정책 패키지 파일(.pp.pp)을 설치하는 RPM 패키지를 빌드하는 데 사용할 수 있는 RPM 사양 파일을 생성하고, 인터페이스 파일(NAME .if)을 올바른 위치에 설치하고 커널에 SELinux 정책을 설치하고 레이블을 수정합니다. 설정 스크립트는 SELinux 정책을 계속 설치하고 레이블을 설정합니다. 또한 설치된 정책을 기반으로 하는 도움말 페이지는 sepolicy manpage 명령을 사용하여 생성됩니다. [7] 마지막으로 sepolicy 는 SELinux 정책과 매뉴얼 페이지를 RPM 패키지로 빌드 및 컴파일하고 다른 시스템에 설치할 준비가 되었습니다.
sepolicy 생성이 실행되면 다음 파일이 생성됩니다.
NAME.te - enforcing file을 입력합니다.
이 파일은 특정 도메인의 모든 유형과 규칙을 정의합니다.
NAME.if - 인터페이스 파일
이 파일은 시스템의 기본 파일 컨텍스트를 정의합니다. NAME.te 파일에서 생성된 파일 유형을 가져와 유형에 파일 경로를 연결합니다. restoreconrpm 과 같은 유틸리티에서는 이러한 경로를 사용하여 레이블을 작성합니다.
NAME_selinux.spec - RPM 사양 파일
이 파일은 SELinux 정책을 설치하고 레이블을 설정하는 RPM 사양 파일입니다. 이 파일은 또한 정책을 설명하는 인터페이스 파일과 도움말 페이지를 설치합니다. sepolicy manpage -d NAME 명령을 사용하여 도움말 페이지를 생성할 수 있습니다.
NAME.sh - Helper shell script
이 스크립트는 시스템의 레이블을 컴파일, 설치 및 수정하는 데 도움이 됩니다. 또한 설치된 정책, 컴파일 및 기타 시스템에 설치하는 데 적합한 RPM 패키지를 기반으로 도움말 페이지를 생성합니다.
SELinux 정책 모듈을 생성할 수 있는 경우 sepolicy 는 소스 도메인에서 대상 도메인으로 생성된 모든 경로를 출력합니다. sepolicy generate 에 대한 자세한 내용은 sepolicy-generate(8) 매뉴얼 페이지를 참조하십시오.


[7] sepolicy manpage 에 대한 자세한 내용은 5.4절. “수동 페이지 생성: sepolicy manpage 을 참조하십시오.

5.3. 도메인 전환 이해: sepolicy transition

이전에는 setrans 유틸리티를 사용하여 두 도메인 또는 프로세스 유형 간 전환이 가능한지 확인하고 이러한 도메인 또는 프로세스 간에 전환하는 데 사용되는 모든 중간 유형을 출력했습니다. Red Hat Enterprise Linux 7에서 setranssepolicy 제품군의 일부로 제공되며 이제 sepolicy transition 명령을 대신 사용합니다.
sepolicy transition 명령은 SELinux 정책을 쿼리하고 프로세스 전환 보고서를 생성합니다. sepolicy transition 명령에는 두 개의 명령줄 인수( -s 옵션으로 지정됨)와 대상 도메인( -t 옵션으로 지정됨)이 필요합니다. 소스 도메인만 입력하면 sepolicy 전환에 소스 도메인이 전환할 수 있는 모든 가능한 도메인이 나열됩니다. 다음 출력에는 모든 항목이 포함되어 있지 않습니다. @ 문자는 다음을 실행 함을 의미합니다.
~]$ sepolicy transition -s httpd_t
httpd_t @ httpd_suexec_exec_t --> httpd_suexec_t
httpd_t @ mailman_cgi_exec_t --> mailman_cgi_t
httpd_t @ abrt_retrace_worker_exec_t --> abrt_retrace_worker_t
httpd_t @ dirsrvadmin_unconfined_script_exec_t --> dirsrvadmin_unconfined_script_t
httpd_t @ httpd_unconfined_script_exec_t --> httpd_unconfined_script_t
Copy to Clipboard Toggle word wrap
대상 도메인이 지정되면 sepolicy 전환 에서 소스 도메인에서 대상 도메인으로의 모든 전환 경로에 대한 SELinux 정책을 검사하고 이러한 경로를 나열합니다. 다음 출력은 완료되지 않았습니다.
~]$ sepolicy transition -s httpd_t -t system_mail_t
httpd_t @ exim_exec_t --> system_mail_t
httpd_t @ courier_exec_t --> system_mail_t
httpd_t @ sendmail_exec_t --> system_mail_t
httpd_t ... httpd_suexec_t @ sendmail_exec_t --> system_mail_t
httpd_t ... httpd_suexec_t @ exim_exec_t --> system_mail_t
httpd_t ... httpd_suexec_t @ courier_exec_t --> system_mail_t
httpd_t ... httpd_suexec_t ... httpd_mojomojo_script_t @ sendmail_exec_t --> system_mail_t
Copy to Clipboard Toggle word wrap
sepolicy 전환에 대한 자세한 내용은 sepolicy-transition(8) 매뉴얼 페이지를 참조하십시오.

5.4. 수동 페이지 생성: sepolicy manpage

sepolicy manpage 명령은 프로세스 도메인을 문서화하는 SELinux 정책을 기반으로 수동 페이지를 생성합니다. 따라서 이러한 설명서는 항상 최신 상태입니다. 자동으로 생성된 각 도움말 페이지는 프로세스 도메인 이름과 _selinux 접미사(예: httpd_selinux )로 구성됩니다.
도움말 페이지에는 제한된 도메인에 대한 SELinux 정책의 다양한 부분에 대한 정보를 제공하는 여러 섹션이 포함되어 있습니다.
  • Entrypoints 섹션에는 도메인 전환 중에 실행해야 하는 모든 실행 파일이 포함되어 있습니다.
  • 프로세스 유형 섹션에는 대상 도메인과 동일한 접두사로 시작하는 모든 프로세스 유형이 나열됩니다.
  • 부울s 섹션에는 도메인과 연결된 부울이 나열됩니다.
  • Port Types 섹션에는 도메인과 동일한 접두사와 일치하는 포트 유형이 포함되어 있으며 이러한 포트 유형에 할당된 기본 포트 번호를 설명합니다.
  • Managed Files 섹션에서는 도메인이 쓸 수 있는 유형과 이러한 유형과 연결된 기본 경로에 대해 설명합니다.
  • 파일 컨텍스트 섹션에는 도메인과 연결된 모든 파일 유형이 포함되어 있으며 시스템의 기본 경로 레이블과 함께 이러한 파일 유형을 사용하는 방법을 설명합니다.
  • 공유 파일 섹션에서는 public_content_t 와 같은 도메인 공유 유형을 사용하는 방법을 설명합니다.
sepolicy manpage 에 대한 자세한 내용은 sepolicy-manpage(8) 매뉴얼 페이지를 참조하십시오.

6장. 사용자 제한

Red Hat Enterprise Linux에서 사용자는 기본적으로 SELinux unconfined_u 사용자에게 매핑됩니다. unconfined_u 에서 실행하는 모든 프로세스는 unconfined_t 도메인에 있습니다. 즉, 사용자는 표준 Linux DAC 정책의 한도 내에서 시스템 전체에 액세스할 수 있습니다. 그러나 Red Hat Enterprise Linux에서는 수많은 제한된 SELinux 사용자를 사용할 수 있습니다. 즉, 사용자는 제한된 기능 집합으로 제한할 수 있습니다. 각 Linux 사용자는 SELinux 정책을 사용하여 SELinux 사용자에게 매핑되므로 Linux 사용자는 다음을 수행할 수 없는 SELinux 사용자(예:)에 지정된 제한 사항을 상속할 수 있습니다.
  • X 윈도우 시스템 실행
  • 네트워킹 사용
  • setuid 응용 프로그램 실행 (SELinux 정책이 허용하지 않는 경우)
  • 또는 susudo 명령을 실행합니다.
예를 들어 SELinux user_u 사용자가 실행하는 프로세스는 user_t 도메인에 있습니다. 이러한 프로세스는 네트워크에 연결할 수 있지만 su 또는 sudo 명령을 실행할 수 없습니다. 이렇게 하면 사용자로부터 시스템을 보호하는 데 도움이 됩니다. 제한된 사용자 및 해당 기능에 대한 자세한 내용은 3.3절. “제한된 사용자 및 제한되지 않은 사용자”, 표 3.1. “SELinux 사용자 기능” 을 참조하십시오.

6.1. Linux 및 SELinux 사용자 맵핑

root로 다음 명령을 입력하여 Linux 사용자와 SELinux 사용자 간의 매핑을 확인합니다.
~]# semanage login -l

Login Name           SELinux User         MLS/MCS Range        Service

__default__          unconfined_u         s0-s0:c0.c1023       *
root                 unconfined_u         s0-s0:c0.c1023       *
system_u             system_u             s0-s0:c0.c1023       *
Copy to Clipboard Toggle word wrap
Red Hat Enterprise Linux에서 Linux 사용자는 기본적으로 SELinux __default__ 로그인에 매핑됩니다(이는 SELinux unconfined_u 사용자에게 매핑됨). useradd 명령을 사용하여 Linux 사용자를 생성하면 옵션이 지정되지 않은 경우 SELinux unconfined_u 사용자에게 매핑됩니다. 다음은 default-mapping을 정의합니다.
__default__          unconfined_u         s0-s0:c0.c1023       *
Copy to Clipboard Toggle word wrap

6.2. 새로운 Linux 사용자 제한: useradd

SELinux unconfined_u 사용자에게 매핑된 Linux 사용자는 unconfined_t 도메인에서 실행됩니다. 이는 unconfined_u 에 매핑된 Linux 사용자로 로그인한 동안 id -Z 명령을 실행하여 확인할 수 있습니다.
~]$ id -Z
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
Copy to Clipboard Toggle word wrap
Linux 사용자가 unconfined_t 도메인에서 실행되면 SELinux 정책 규칙이 적용되지만, unconfined_t 도메인에서 실행되는 Linux 사용자가 거의 모든 액세스 권한을 허용하는 정책 규칙이 있습니다. 제한되지 않은 Linux 사용자가 SELinux 정책에서 정의한 애플리케이션을 실행하는 경우 unconfined_t 도메인에서 자체 제한된 도메인으로 전환할 수 있는 경우 제한되지 않은 Linux 사용자에게는 여전히 해당 제한된 도메인의 제한 사항이 적용됩니다. 이 경우의 보안 이점은 Linux 사용자가 제한되지 않았더라도 애플리케이션이 제한된 상태로 유지되므로 애플리케이션에서 결함을 악용하는 것은 정책에 의해 제한될 수 있다는 것입니다.
참고
이렇게 하면 사용자로부터 시스템을 보호하지 않습니다. 대신, 사용자 및 시스템은 애플리케이션의 결함으로 인해 발생할 수 있는 손상으로부터 보호되고 있습니다.
useradd 명령으로 Linux 사용자를 생성할 때 -Z 옵션을 사용하여 매핑되는 SELinux 사용자를 지정합니다. 다음 예제에서는 새 Linux 사용자인 useruuser 를 생성하고 해당 사용자를 SELinux user_u 사용자에게 매핑합니다. SELinux user_u 사용자에게 매핑된 Linux 사용자는 user_t 도메인에서 실행됩니다. 이 도메인에서 Linux 사용자는 SELinux 정책에서 허용하지 않는 한 setuid 애플리케이션을 실행할 수 없으며 su 또는 sudo 명령을 실행할 수 없으므로 이러한 명령을 사용하여 root 사용자가 되지 않습니다.

절차 6.1. user_u SELinux 사용자로 새 Linux 사용자 제한

  1. root 로서 SELinux user_u 사용자에게 매핑되는 새 Linux 사용자(useruuser)를 만듭니다.
    ~]# useradd -Z user_u useruuser
    Copy to Clipboard Toggle word wrap
  2. useruuseruser_u 간의 매핑을 보려면 root로 다음 명령을 입력합니다.
    ~]# semanage login -l
    
    Login Name           SELinux User         MLS/MCS Range        Service
    
    __default__          unconfined_u         s0-s0:c0.c1023       *
    root                 unconfined_u         s0-s0:c0.c1023       *
    system_u             system_u             s0-s0:c0.c1023       *
    useruuser            user_u               s0                   *
    
    Copy to Clipboard Toggle word wrap
  3. root 로서 Linux useruuser 사용자에게 암호를 할당합니다.
    ~]# passwd useruuser
    Changing password for user useruuser.
    New password: Enter a password
    Retype new password: Enter the same password again
    passwd: all authentication tokens updated successfully.
    
    Copy to Clipboard Toggle word wrap
  4. 현재 세션에서 로그아웃한 후 Linux useruuser 사용자로 로그인합니다. 로그인하면 pam_selinux 모듈은 Linux 사용자를 SELinux 사용자(이 경우 user_u)에 매핑하고 결과 SELinux 컨텍스트를 설정합니다. 그런 다음 Linux 사용자의 쉘이 이 컨텍스트를 사용하여 시작됩니다. 다음 명령을 입력하여 Linux 사용자의 컨텍스트를 확인합니다.
    ~]$ id -Z
    user_u:user_r:user_t:s0
    
    Copy to Clipboard Toggle word wrap
  5. Linux useruuser 에서 로그아웃한 후 계정으로 다시 로그인합니다. Linux useruuser 사용자가 필요하지 않은 경우 root로 다음 명령을 입력하여 홈 디렉터리와 함께 제거합니다.
    ~]# userdel -Z -r useruuser
    Copy to Clipboard Toggle word wrap

6.3. 기존 Linux 사용자 제한: semanage login

Linux 사용자가 SELinux unconfined_u 사용자(기본 동작)에 매핑되고 매핑된 SELinux 사용자를 변경하려는 경우 semanage login 명령을 사용합니다. 다음 예제에서는 newuser 라는 새 Linux 사용자를 생성한 다음 해당 Linux 사용자를 SELinux user_u 사용자에게 매핑합니다.

절차 6.2. SELinux 사용자에게 Linux 사용자 매핑

  1. root 로서 새 Linux 사용자(newuser)를 만듭니다. 이 사용자는 기본 매핑을 사용하므로 semanage login -l 출력에 표시되지 않습니다.
    ~]# useradd newuser
    Copy to Clipboard Toggle word wrap
    ~]# semanage login -l
    
    Login Name           SELinux User         MLS/MCS Range        Service
    
    __default__          unconfined_u         s0-s0:c0.c1023       *
    root                 unconfined_u         s0-s0:c0.c1023       *
    system_u             system_u             s0-s0:c0.c1023       *
    
    Copy to Clipboard Toggle word wrap
  2. Linux newuser 사용자를 SELinux user_u 사용자에게 매핑하려면 root로 다음 명령을 입력합니다.
    ~]# semanage login -a -s user_u newuser
    Copy to Clipboard Toggle word wrap
    a 옵션은 새 레코드를 추가하고 -s 옵션은 Linux 사용자를 매핑할 SELinux 사용자를 지정합니다. 마지막 인수 newuser 는 지정된 SELinux 사용자에게 매핑하려는 Linux 사용자입니다.
  3. Linux newuser 사용자와 user_u 간의 매핑을 보려면 semanage 유틸리티를 다시 사용합니다.
    ~]# semanage login -l
    
    Login Name           SELinux User         MLS/MCS Range        Service
    
    __default__          unconfined_u         s0-s0:c0.c1023       *
    newuser              user_u               s0                   *
    root                 unconfined_u         s0-s0:c0.c1023       *
    system_u             system_u             s0-s0:c0.c1023       *
    
    Copy to Clipboard Toggle word wrap
  4. root 로서 Linux newuser 사용자에게 암호를 할당합니다.
    ~]# passwd newuser
    Changing password for user newuser.
    New password: Enter a password
    Retype new password: Enter the same password again
    passwd: all authentication tokens updated successfully.
    
    Copy to Clipboard Toggle word wrap
  5. 현재 세션에서 로그아웃한 후 Linux newuser 사용자로 로그인합니다. 다음 명령을 입력하여 newuser 의 SELinux 컨텍스트를 확인합니다.
    ~]$ id -Z
    user_u:user_r:user_t:s0
    Copy to Clipboard Toggle word wrap
  6. Linux newuser 의 세션에서 로그아웃한 후 계정으로 다시 로그인합니다. Linux newuser 사용자를 원하지 않는 경우 root로 다음 명령을 입력하여 홈 디렉토리와 함께 제거합니다.
    ~]# userdel -r newuser
    Copy to Clipboard Toggle word wrap
    root 로서 Linux newuser 사용자와 user_u 간의 매핑을 제거합니다.
    ~]# semanage login -d newuser
    Copy to Clipboard Toggle word wrap
    ~]# semanage login -l
    
    Login Name           SELinux User         MLS/MCS Range        Service
    
    __default__          unconfined_u         s0-s0:c0.c1023       *
    root                 unconfined_u         s0-s0:c0.c1023       *
    system_u             system_u             s0-s0:c0.c1023       *
    
    Copy to Clipboard Toggle word wrap

6.4. 기본 맵핑 변경

Red Hat Enterprise Linux에서 Linux 사용자는 기본적으로 SELinux __default__ 로그인에 매핑됩니다(이는 SELinux unconfined_u 사용자에게 매핑됨). 새 Linux 사용자를 원하는 경우 Linux 사용자는 기본적으로 SELinux 사용자에게 구체적으로 매핑되지 않은 경우 semanage login 명령을 사용하여 기본 매핑을 변경합니다.
예를 들어 root로 다음 명령을 입력하여 기본 매핑을 unconfined_u 에서 user_u 로 변경합니다.
~]# semanage login -m -S targeted -s "user_u" -r s0 __default__
Copy to Clipboard Toggle word wrap
__default__ login이 user_u:에 매핑되었는지 확인합니다.
~]# semanage login -l

Login Name           SELinux User         MLS/MCS Range        Service

__default__          user_u               s0-s0:c0.c1023       *
root                 unconfined_u         s0-s0:c0.c1023       *
system_u             system_u             s0-s0:c0.c1023       *
Copy to Clipboard Toggle word wrap
새 Linux 사용자가 생성되고 SELinux 사용자를 지정하지 않거나 기존 Linux 사용자가 semanage login -l 출력의 특정 항목과 일치하지 않는 경우 __default__ 로그인에 따라 user_u 에 매핑됩니다.
기본 동작으로 다시 변경하려면 root로 다음 명령을 입력하여 __default__ login을 SELinux unconfined_u 사용자에게 매핑합니다.
~]# semanage login -m -S targeted -s "unconfined_u" -r s0-s0:c0.c1023 __default__
Copy to Clipboard Toggle word wrap

6.5. xguest: 키오스크 모드

xguest 패키지는 kiosk 사용자 계정을 제공합니다. 이 계정은 라이브러리, 은행, 차량, 정보 키오스크, 커피 등 사람들이 사용하는 시스템을 보호하는 데 사용됩니다. kiosk 사용자 계정은 매우 제한적입니다. 본질적으로 사용자가 로그인하여 Firefox 를 사용하여 인터넷 웹 사이트를 탐색할 수 있습니다. 게스트 사용자는 xguest_u 에 할당되어 있습니다. 표 3.1. “SELinux 사용자 기능” 을 참조하십시오. 파일 생성 또는 설정 변경과 같이 이 계정으로 로그인하는 동안 변경한 내용은 로그아웃 시 손실됩니다.
키오스크 계정을 설정하려면 다음을 수행합니다.
  1. root로 xguest 패키지를 설치합니다. 필요에 따라 종속성을 설치합니다.
    ~]# yum install xguest
    Copy to Clipboard Toggle word wrap
  2. 다양한 사용자가 키오스크 계정을 사용할 수 있도록 하려면 계정은 암호로 보호되지 않으므로 SELinux가 강제 모드로 실행 중인 경우에만 계정을 보호할 수 있습니다. 이 계정으로 로그인하기 전에 getenforce 유틸리티를 사용하여 SELinux가 강제 모드에서 실행 중인지 확인합니다.
    ~]$ getenforce
    Enforcing
    
    Copy to Clipboard Toggle word wrap
    강제 모드로 변경하는 데 대한 정보는 4.4절. “SELinux 상태 및 모드의 영구 변경” 을 참조하십시오. SELinux가 허용 모드이거나 비활성화된 경우 이 계정으로 로그인할 수 없습니다.
  3. GDM(GNOME Display Manager)을 사용하면 이 계정에만 로그인할 수 있습니다. xguest 패키지가 설치되면 guest 계정이 GDM 로그인 화면에 추가됩니다.

6.6. 사용자 애플리케이션 실행 부울

Linux 사용자가 홈 디렉토리 및 쓰기 액세스 권한이 있는 /tmp 디렉토리에서 애플리케이션(사용자의 권한을 상속하는) 애플리케이션을 실행할 수 있도록 허용하지 않으면 결함이 있거나 악의적인 애플리케이션이 사용자가 소유한 파일을 수정하지 못하도록 합니다.
부울은 이 동작을 변경하는 데 사용할 수 있으며 root로 실행해야 하는 setsebool 유틸리티를 사용하여 구성됩니다. setsebool -P 명령은 영구적으로 변경합니다. 재부팅 시 변경 사항을 유지하지 않으려면 -P 옵션을 사용하지 마십시오.

guest_t

guest_t 도메인의 Linux 사용자가 홈 디렉토리 및 /tmp 에서 애플리케이션을 실행하지 못하도록 하려면 다음을 수행하십시오.
~]# setsebool -P guest_exec_content off
Copy to Clipboard Toggle word wrap

xguest_t

xguest_t 도메인의 Linux 사용자가 홈 디렉토리 및 /tmp 에서 애플리케이션을 실행하지 못하도록 하려면 다음을 수행하십시오.
~]# setsebool -P xguest_exec_content off
Copy to Clipboard Toggle word wrap

user_t

user_t 도메인의 Linux 사용자가 홈 디렉토리 및 /tmp 에서 애플리케이션을 실행하지 못하도록 하려면 다음을 수행합니다.
~]# setsebool -P user_exec_content off
Copy to Clipboard Toggle word wrap

staff_t

staff_t 도메인의 Linux 사용자가 홈 디렉토리 및 /tmp 에서 애플리케이션을 실행하지 못하도록 하려면 다음을 수행합니다.
~]# setsebool -P staff_exec_content off
Copy to Clipboard Toggle word wrap
staff_exec_content 부울을 켜고 staff_t 도메인의 Linux 사용자가 홈 디렉토리 및 /tmp 에서 애플리케이션을 실행할 수 있도록 하려면 다음을 수행합니다.
~]# setsebool -P staff_exec_content on
Copy to Clipboard Toggle word wrap

7장. Sandbox를 사용하여 프로그램 보안 설정

샌드박스 보안 유틸리티는 시스템 관리자가 엄격하게 제한된 SELinux 도메인 내에서 애플리케이션을 실행할 수 있는 SELinux 정책 세트를 추가합니다. 새 파일을 열거나 네트워크에 대한 액세스 권한에 대한 권한 제한을 정의할 수 있습니다. 이를 통해 시스템에 손상을 초래하지 않고 신뢰할 수 없는 소프트웨어의 처리 특성을 안전하게 테스트할 수 있습니다.

7.1. Sandbox를 사용하여 애플리케이션 실행

sandbox 유틸리티를 사용하기 전에 policycoreutils-sandbox 패키지를 설치해야 합니다.
~]# yum install policycoreutils-sandbox
Copy to Clipboard Toggle word wrap
애플리케이션을 제한하는 기본 구문은 다음과 같습니다.
~]$ sandbox [options] application_under_test
Copy to Clipboard Toggle word wrap
샌드박스 에서 그래픽 애플리케이션을 실행하려면 -X 옵션을 사용합니다. 예를 들어 다음과 같습니다.
~]$ sandbox -X evince
Copy to Clipboard Toggle word wrap
X 는 필요한 리소스를 복사하고 사용자의 디렉터리 또는 /tmp 디렉터리에 닫힌 가상 환경을 생성하기 전에 애플리케이션에 대해 제한된 보조 X 서버를 설정하도록 샌드박스에 지시합니다.
한 세션에서 다음 세션으로 데이터를 보존하려면 다음을 수행합니다.
~]$ sandbox -H sandbox/home -T sandbox/tmp -X firefox
Copy to Clipboard Toggle word wrap
sandbox/home/homesandbox /tmp 에 사용됩니다. 다른 애플리케이션은 다양한 제한된 환경에 배치됩니다. 애플리케이션은 전체 화면 모드로 실행되므로 다른 기능에 액세스할 수 없습니다. 앞서 언급했듯이 sandbox_x_file_t 로 레이블이 지정된 파일을 제외하고 파일을 열 수 없습니다.
네트워크에 대한 액세스는 처음에 샌드박스 내에서 불가능합니다. 액세스를 허용하려면 sandbox_web_t 레이블을 사용합니다. 예를 들어 Firefox 를 시작하려면 다음을 수행합니다.
~]$ sandbox ‑X ‑t sandbox_web_t firefox
Copy to Clipboard Toggle word wrap
주의
sandbox_net_t 레이블은 모든 네트워크 포트에 대한 무제한 양방향 네트워크 액세스를 허용합니다. sandbox_web_t 는 웹 검색에만 필요한 포트에 대한 연결을 허용합니다.
sandbox_net_t 를 사용해야 하며 필요한 경우에만 사용해야 합니다.
자세한 내용은 샌드박스 (8) 도움말 페이지 및 사용 가능한 전체 옵션 목록을 참조하십시오.

8장. sVirt

sVirt는 SELinux와 가상화를 통합하는 Red Hat Enterprise Linux에 포함된 기술입니다. sVirt는 가상 시스템을 사용할 때 보안을 개선하기 위해 MAC(강제적 액세스 제어)를 적용합니다. 이러한 기술을 통합하는 주된 이유는 호스트 또는 다른 가상 시스템을 대상으로 하는 공격 벡터로 사용될 수 있는 하이퍼바이저의 버그에 대비하여 보안을 개선하고 시스템을 강화하는 것입니다.
이 장에서는 sVirt가 Red Hat Enterprise Linux의 가상화 기술과 통합하는 방법에 대해 설명합니다.

비가상화 환경

비가상화 환경에서 호스트는 물리적으로 서로 분리되며 각 호스트에는 웹 서버 또는 DNS 서버와 같은 서비스로 구성된 자체 포함 환경이 있습니다. 이러한 서비스는 자체 사용자 공간, 커널 및 물리적 호스트와 직접 통신하여 해당 서비스를 네트워크에 직접 제공합니다. 다음 이미지는 가상화되지 않은 환경을 나타냅니다.

가상화 환경

가상화 환경에서는 여러 운영 체제를 단일 호스트 커널과 물리적 호스트 내에 수용(게스트)할 수 있습니다. 다음 이미지는 가상화된 환경을 나타냅니다.

8.1. 보안 및 가상화

서비스가 가상화되지 않은 경우 시스템은 물리적으로 분리됩니다. 모든 위협은 네트워크 공격을 제외하고 일반적으로 영향을 받는 시스템에 포함됩니다. 서비스를 가상화 환경에 그룹화하면 시스템에서 추가 취약점이 발생합니다. 게스트 인스턴스에서 악용할 수 있는 하이퍼바이저에 보안 취약점이 있는 경우 이 게스트는 호스트를 공격할 뿐만 아니라 해당 호스트에서 실행 중인 다른 게스트도 수행할 수 있습니다. 이는 이론적이지 않습니다. 이미 하이퍼바이저에 공격이 있습니다. 이러한 공격은 게스트 인스턴스를 초과하여 다른 게스트를 공격에 노출할 수 있습니다.
sVirt는 게스트를 격리하고 악용되는 경우 추가 공격을 제한하기 위한 노력입니다. 이 내용은 가상 머신을 중단하고 다른 호스트 인스턴스로 확장할 수 없는 다음 이미지에서 보여줍니다.
SELinux는 MAC(Mandatory Access Control) 구현에 가상화 인스턴스를 위한 플러그형 보안 프레임워크를 도입합니다. sVirt 프레임워크를 사용하면 게스트와 해당 리소스의 레이블을 고유하게 지정할 수 있습니다. 레이블을 지정하면 서로 다른 게스트 간의 액세스를 거부할 수 있는 규칙을 적용할 수 있습니다.

8.2. sVirt 레이블링

sVirt는 SELinux 보호의 다른 서비스와 마찬가지로 프로세스 기반 메커니즘과 제한 사항을 사용하여 게스트 인스턴스에 대한 추가 보안 계층을 제공합니다. 일반적으로 sVirt가 백그라운드에서 작동되고 있음을 알 수 없습니다. 이 섹션에서는 sVirt의 레이블 지정 기능에 대해 설명합니다.
다음 출력에 표시된 대로 sVirt를 사용할 때 각 VM(가상 시스템) 프로세스에 레이블이 지정되며 동적으로 생성된 수준으로 실행됩니다. 각 프로세스는 다른 레벨의 다른 VM과 격리됩니다.
~]# ps -eZ | grep qemu

system_u:system_r:svirt_t:s0:c87,c520 27950 ?  00:00:17 qemu-kvm
system_u:system_r:svirt_t:s0:c639,c757 27989 ? 00:00:06 qemu-system-x86
Copy to Clipboard Toggle word wrap
실제 디스크 이미지는 다음 출력에 표시된 대로 프로세스와 일치하도록 자동으로 레이블이 지정됩니다.
~]# ls -lZ /var/lib/libvirtimages/*

system_u:object_r:svirt_image_t:s0:c87,c520   image1
Copy to Clipboard Toggle word wrap
다음 표에서는 sVirt를 사용할 때 할당할 수 있는 다양한 라벨을 간략하게 설명합니다.
Expand
표 8.1. sVirt 레이블
유형SELinux 문맥Description
가상 머신 프로세스system_u:system_r:svirt_t:MCS1MCS1은 임의로 선택한 MCS 필드입니다. 현재 약 50만 개의 라벨이 지원됩니다.
가상 머신 이미지system_u:object_r:svirt_image_t:MCS1동일한 MCS 필드가 있는 svirt_t 레이블이 지정된 프로세스만 해당 이미지 파일 및 장치를 읽고 쓸 수 있습니다.
가상 머신 공유 읽기/쓰기 콘텐츠system_u:object_r:svirt_image_t:s0svirt_t 라는 모든 프로세스는 svirt_image_t:s0 파일 및 장치에 쓸 수 있습니다.
가상 머신 이미지system_u:object_r:virt_content_t:s0이미지가 종료될 때 사용되는 시스템 기본 레이블입니다. 이 레이블이 있는 파일/장치를 읽을 수 있는 svirt_t 가상 프로세스가 없습니다.
sVirt를 사용할 때 정적 레이블을 수행할 수도 있습니다. 정적 레이블을 사용하면 관리자가 가상 시스템의 MCS/MLS 필드를 포함한 특정 레이블을 선택할 수 있습니다. 정적으로 레이블이 지정된 가상 시스템을 실행하는 관리자는 이미지 파일에서 올바른 레이블을 설정해야 합니다. 가상 시스템은 항상 해당 레이블로 시작되고 sVirt 시스템은 정적으로 레이블이 지정된 가상 시스템의 콘텐츠 레이블을 변경하지 않습니다. 이렇게 하면 sVirt 구성 요소가 MLS 환경에서 실행될 수 있습니다. 요구 사항에 따라 시스템에서 다양한 민감도 수준으로 여러 가상 시스템을 실행할 수도 있습니다.

9장. 보안 Linux 컨테이너

LXC(LinuxContainers)는 시스템에서 동일한 서비스의 여러 복사본을 동시에 실행할 수 있는 낮은 수준의 가상화 기능입니다. 전체 가상화에 비해 컨테이너는 전체 새 시스템을 부팅할 필요가 없으며 메모리를 적게 사용할 수 있으며 기본 운영 체제를 읽기 전용으로 사용할 수 있습니다. 예를 들어, LXC를 사용하면 시스템 데이터를 공유하는 동시에 여러 웹 서버를 동시에 실행할 수 있으며, 심지어 root 사용자로 실행할 수도 있습니다. 그러나 컨테이너 내에서 권한 있는 프로세스를 실행하면 다른 컨테이너에서 실행되는 컨테이너 또는 프로세스 외부에서 실행되는 다른 프로세스에 영향을 미칠 수 있습니다. 보안 Linux 컨테이너는 SELinux 컨텍스트를 사용하므로 해당 컨테이너에서 실행되는 프로세스가 서로 또는 호스트와 상호 작용하지 못하게 합니다.
Docker 애플리케이션은 Red Hat Enterprise Linux에서 Linux 컨테이너를 관리하는 주요 유틸리티입니다. 또는 libvirt 패키지에서 제공하는 virsh 명령줄 유틸리티를 사용할 수도 있습니다.
Linux 컨테이너에 대한 자세한 내용은 컨테이너 시작하기를 참조하십시오.

10장. SELinux systemd 액세스 제어

Red Hat Enterprise Linux 7에서 시스템 서비스는 systemd 데몬에 의해 제어됩니다. 이전 Red Hat Enterprise Linux 릴리스에서 데몬은 다음 두 가지 방법으로 시작할 수 있습니다.
  • 부팅 시 System V init 데몬이 init.rc 스크립트를 시작한 다음 이 스크립트가 필요한 데몬을 시작했습니다. 예를 들어 부팅 시 시작된 Apache 서버에는 다음 SELinux 레이블이 있습니다.
    system_u:system_r:httpd_t:s0
    Copy to Clipboard Toggle word wrap
  • 관리자가 init.rc 스크립트를 수동으로 시작하여 데몬이 실행됩니다. 예를 들어 서비스 httpd restart 명령이 Apache 서버에서 호출되면 결과 SELinux 레이블은 다음과 같습니다.
    unconfined_u:system_r:httpd_t:s0
    Copy to Clipboard Toggle word wrap
수동으로 시작하면 프로세스가 SELinux 레이블을 시작한 사용자 부분을 채택하여 위의 두 시나리오에서 레이블을 지정하지 않았습니다. systemd 데몬에서는 전환이 매우 다릅니다. systemd 는 시스템에서 데몬을 시작하고 중지하기 위해 모든 호출을 처리하므로 init_t 유형을 사용하여 데몬을 수동으로 다시 시작할 때 레이블의 사용자 부분을 덮어쓸 수 있습니다. 결과적으로 위의 두 시나리오의 레이블은 예상대로 system_u:system_r:httpd_t:s0 이며 SELinux 정책이 개선되어 어떤 도메인을 제어할 수 있는지 제어할 수 있었습니다.

10.1. 서비스의 SELinux 액세스 권한

이전 버전의 Red Hat Enterprise Linux에서는 관리자가 System V Init 스크립트 레이블을 기반으로 서비스를 시작하거나 중지할 수 있는 사용자 또는 애플리케이션을 제어할 수 있었습니다. 이제 systemd 가 모든 서비스를 시작 및 중지하고 사용자 및 프로세스는 systemctl 유틸리티를 사용하여 systemd 와 통신합니다. systemd 데몬은 SELinux 정책을 참조하고 호출 프로세스의 레이블과 호출자가 관리하려고 하는 단위 파일의 레이블을 확인한 다음, 호출자가 액세스할 수 있는지 여부를 SELinux에 요청할 수 있습니다. 이 접근 방식을 통해 시스템 서비스의 시작 및 중지를 비롯한 중요한 시스템 기능에 대한 액세스 제어를 강화합니다.
예를 들어, 이전에 관리자는 NetworkManager가 systemctl 을 실행하여 D-Bus 메시지를 systemd 로 보낼 수 있도록 허용해야 했으며, 이 메시지는 NetworkManager가 요청한 모든 서비스를 시작하거나 중지했습니다. 실제로 NetworkManager는 systemctl 이 수행할 수 있는 모든 작업을 수행할 수 있습니다. 또한 특정 서비스를 시작하거나 중지할 수 있도록 제한된 관리자를 설정하는 것도 불가능했습니다.
이러한 문제를 해결하기 위해 systemd 는 SELinux Access Manager로도 작동합니다. systemctl 을 실행하는 프로세스의 레이블 또는 D-Bus 메시지를 systemd 로 보낸 프로세스를 검색할 수 있습니다. 그런 다음 데몬은 프로세스가 구성하려는 유닛 파일의 레이블을 조회합니다. 마지막으로 SELinux 정책에서 프로세스 레이블과 유닛 파일 레이블 간의 특정 액세스를 허용하는 경우 커널에서 정보를 검색할 수 있습니다. 즉, 특정 서비스에 대해 systemd 와 상호 작용해야 하는 손상된 애플리케이션을 이제 SELinux로 제한할 수 있습니다. 정책 작성자는 이러한 세분화된 제어를 사용하여 관리자를 제한할 수도 있습니다. 정책 변경에는 service 라는 새 클래스와 다음 권한이 포함됩니다.
class service
{
       start
       stop
       status
       reload
       kill
       load
       enable
       disable
}
Copy to Clipboard Toggle word wrap
예를 들어 정책 작성자는 도메인에서 서비스의 상태를 가져오거나 서비스를 시작 및 중지할 수 있지만 서비스를 활성화하거나 비활성화할 수 없습니다. SELinux 및 systemd 의 액세스 제어 작업이 모든 경우에 일치하지 않습니다. SELinux 액세스 검사를 사용하여 systemd 메서드 호출을 연결하도록 매핑이 정의되었습니다. 표 10.1. “SELinux 액세스 검사에서 systemd 장치 파일 메서드 호출 매핑” 는 단위 파일에 대한 액세스 검사를 매핑하고 표 10.2. “SELinux 액세스 검사에서 systemd 일반 시스템 호출 매핑” 는 일반적으로 시스템에 대한 액세스 검사를 다룹니다. 두 테이블에 일치하는 항목이 없으면 정의되지 않은 시스템 검사가 호출됩니다.
Expand
표 10.1. SELinux 액세스 검사에서 systemd 장치 파일 메서드 호출 매핑
systemd 장치 파일 방법 SELinux 액세스 확인
DisableUnitFiles 비활성화
EnableUnitFiles 활성화
GetUnit 상태
GetUnitByPID 상태
GetUnitFileState 상태
강제 종료 stop
KillUnit stop
LinkUnitFiles 활성화
ListUnits 상태
LoadUnit 상태
MaskUnitFiles 비활성화
PresetUnitFiles 활성화
ReenableUnitFiles 활성화
다시 실행 시작
새로 고침 새로 고침
ReloadOrRestart 시작
ReloadOrRestartUnit 시작
ReloadOrTryRestart 시작
ReloadOrTryRestartUnit 시작
ReloadUnit 새로 고침
ResetFailed stop
ResetFailedUnit stop
재시작 시작
RestartUnit 시작
시작 시작
StartUnit 시작
StartUnitReplace 시작
중지 stop
StopUnit stop
TryRestart 시작
TryRestartUnit 시작
UnmaskUnitFiles 활성화
Expand
표 10.2. SELinux 액세스 검사에서 systemd 일반 시스템 호출 매핑
systemd 일반 시스템 호출 SELinux 액세스 확인
ClearJobs reboot
FlushDevices Halted
get 상태
GetAll 상태
GetJob 상태
GetSeat 상태
GetSession 상태
GetSessionByPID 상태
GetUser 상태
Halted Halted
인트로스펙션 상태
kexec reboot
KillSession Halted
KillUser Halted
ListJobs 상태
ListSeats 상태
ListSessions 상태
ListUsers 상태
LockSession Halted
PowerOff Halted
재부팅 reboot
SetUserLinger Halted
TerminateSeat Halted
TerminateSession Halted
TerminateUser Halted

예 10.1. 시스템 서비스에 대한 SELinux 정책

sesearch 유틸리티를 사용하면 시스템 서비스에 대한 정책 규칙을 나열할 수 있습니다. 예를 들어 sesearch -A -s NetworkManager_t -c service 명령을 호출하면 다음이 반환됩니다.
allow NetworkManager_t dnsmasq_unit_file_t : service { start stop status reload kill load } ; 
allow NetworkManager_t nscd_unit_file_t : service { start stop status reload kill load } ; 
allow NetworkManager_t ntpd_unit_file_t : service { start stop status reload kill load } ; 
allow NetworkManager_t pppd_unit_file_t : service { start stop status reload kill load } ; 
allow NetworkManager_t polipo_unit_file_t : service { start stop status reload kill load } ;
Copy to Clipboard Toggle word wrap

10.2. SELinux 및 journald

systemd 에서 journald 데몬( systemd-journal라고도 함)은 로깅 데이터를 수집하고 저장하는 시스템 서비스인 syslog 유틸리티의 대안입니다. 커널에서 수신되는 로깅 정보, 시스템 서비스의 표준 및 오류 출력에서 libc syslog() 함수를 사용하는 사용자 프로세스에서 또는 기본 API를 사용하여 구조화 및 인덱싱된 저널을 생성하고 유지 관리합니다. 각 로그 메시지의 여러 메타데이터 필드를 안전한 방식으로 암시적으로 수집합니다.
systemd-journal 서비스를 SELinux와 함께 사용하여 보안을 강화할 수 있습니다. SELinux는 설계한 작업만 수행할 수 있도록 허용하여 프로세스를 제어합니다. 정책 작성자의 보안 목표에 따라 때로는 더 적은 경우도 있습니다. 예를 들어 SELinux는 손상된 ntpd 프로세스가 네트워크 시간 처리 이외의 작업을 수행하지 못하도록 합니다. 그러나 ntpd 프로세스는 SELinux가 손상된 프로세스가 해당 메시지를 계속 전송할 수 있도록 syslog 메시지를 보냅니다. 손상된 ntpd 는 다른 데몬과 일치하도록 syslog 메시지를 포맷하고 관리자가 잘못되거나 전체 시스템을 손상시키기 위해 syslog 파일을 읽는 유틸리티가 더 나을 수 있습니다.
systemd-journal 데몬은 모든 로그 메시지를 확인하고 특히 SELinux 레이블을 추가합니다. 그러면 로그 메시지의 불일치가 감지되고 발생하기 전에 이 유형의 공격을 방지할 수 있습니다. journalctl 유틸리티를 사용하여 systemd 저널의 로그를 쿼리할 수 있습니다. 명령줄 인수를 지정하지 않으면 이 유틸리티를 실행하면 가장 오래된 항목부터 시작하여 저널의 전체 내용이 나열됩니다. 시스템 구성 요소에 대한 로그를 포함하여 시스템에서 생성된 모든 로그를 보려면 root로 journalctl 을 실행합니다. 루트가 아닌 사용자로 실행하는 경우 현재 로그인한 사용자와 관련된 로그로만 출력이 제한됩니다.

예 10.2. journalctl로 로그 나열

특정 SELinux 레이블과 관련된 모든 로그를 나열하는 데 journalctl 을 사용할 수 있습니다. 예를 들어 다음 명령은 system_u:system_r:policykit_t:s0 레이블에서 로그인한 모든 로그를 나열합니다.
~]# journalctl _SELINUX_CONTEXT=system_u:system_r:policykit_t:s0
Oct 21 10:22:42 localhost.localdomain polkitd[647]: Started polkitd version 0.112
Oct 21 10:22:44 localhost.localdomain polkitd[647]: Loading rules from directory /etc/polkit-1/rules.d
Oct 21 10:22:44 localhost.localdomain polkitd[647]: Loading rules from directory /usr/share/polkit-1/rules.d
Oct 21 10:22:44 localhost.localdomain polkitd[647]: Finished loading, compiling and executing 5 rules
Oct 21 10:22:44 localhost.localdomain polkitd[647]: Acquired the name org.freedesktop.PolicyKit1 on the system bus Oct 21 10:23:10 localhost polkitd[647]: Registered Authentication Agent for unix-session:c1 (system bus name :1.49, object path /org/freedesktop/PolicyKit1/AuthenticationAgent, locale en_US.UTF-8) (disconnected from bus)
Oct 21 10:23:35 localhost polkitd[647]: Unregistered Authentication Agent for unix-session:c1 (system bus name :1.80 [/usr/bin/gnome-shell --mode=classic], object path /org/freedesktop/PolicyKit1/AuthenticationAgent, locale en_US.utf8)
Copy to Clipboard Toggle word wrap
journalctl 에 대한 자세한 내용은 journalctl(1) 매뉴얼 페이지를 참조하십시오.

11장. 문제 해결

다음 장에서는 SELinux가 액세스를 거부할 때 발생하는 상황, 문제의 주요 세 가지 원인, 올바른 레이블링에 대한 정보를 찾고, SELinux 거부를 분석하고, audit2allow 를 사용하여 사용자 지정 정책 모듈을 생성하는 방법을 설명합니다.

11.1. 액세스가 거부되면 어떤 문제가 발생합니까

액세스 허용 또는 허용하지 않기와 같은 SELinux 결정은 캐시됩니다. 이 캐시를 AVC(액세스 벡터 캐시)라고 합니다. 거부 메시지는 SELinux가 액세스를 거부하면 로깅됩니다. 이러한 거부는 "AVC 거부"라고도 하며 실행 중인 데몬에 따라 다른 위치에 기록됩니다.
데몬: auditd
로그 위치: /var/log/audit/audit.log
데몬: auditd off; rsyslogd on
로그 위치: /var/log/messages
데몬: setroubleshootd, rsyslogd, auditd
로그 위치: /var/log/audit/audit.log. 더 읽기 쉬운 거부 메시지도 /var/log/messages로 전송
X Window 시스템을 실행하고 setroubleshootsetroubleshoot-server 패키지가 설치되어 있고 setroubleshootdauditd 데몬이 실행 중인 경우 SELinux에서 액세스를 거부하면 경고가 표시됩니다.
Show 를 클릭하면 SELinux가 액세스를 거부한 이유에 대한 자세한 분석과 액세스를 허용하는 가능한 솔루션이 있습니다. X Window 시스템을 실행하지 않는 경우 SELinux에서 액세스를 거부하면 명확하지 않습니다. 예를 들어, 웹사이트를 검색하는 사용자에게 다음과 유사한 오류가 발생할 수 있습니다.
Forbidden

You don't have permission to access file name on this server
Copy to Clipboard Toggle word wrap
이러한 경우 DAC 규칙(표준 Linux 권한)에서 액세스를 허용하는 경우 /var/log/messages/var/log/audit/audit.log"SELinux is preventing""denied" 오류를 각각 확인합니다. root 사용자로 다음 명령을 실행하여 수행할 수 있습니다.
~]# grep "SELinux is preventing" /var/log/messages
Copy to Clipboard Toggle word wrap
~]# grep "denied" /var/log/audit/audit.log
Copy to Clipboard Toggle word wrap

11.2. 상위 세 가지 문제 원인

다음 섹션에서는 문제 레이블 지정, 서비스용 부울 및 포트 구성, SELinux 규칙의 세 가지 원인에 대해 설명합니다.

11.2.1. 문제 레이블 지정

SELinux를 실행하는 시스템에서는 모든 프로세스와 파일에 보안 관련 정보가 포함된 레이블이 지정됩니다. 이 정보를 SELinux 컨텍스트라고 합니다. 이러한 레이블이 잘못되면 액세스가 거부될 수 있습니다. 애플리케이션이 잘못 레이블된 경우 잘못된 레이블이 프로세스에 할당될 수 있습니다. 이로 인해 SELinux가 액세스를 거부할 수 있으며 프로세스가 레이블이 잘못 지정된 파일이 생성될 수 있습니다.
레이블 지정 문제의 일반적인 원인은 비표준 디렉터리가 서비스에 사용되는 경우입니다. 예를 들어, 웹 사이트에 /var/www/html/ 을 사용하는 대신 관리자가 /srv/myweb/ 을 사용하려고 합니다. Red Hat Enterprise Linux에서 /srv 디렉터리는 var_t 유형으로 레이블이 지정됩니다. /srv 에서 생성된 파일 및 디렉터리는 이 유형을 상속합니다. 또한 최상위 디렉터리(예: /myserver)에서 새로 생성된 오브젝트는 default_t 유형으로 레이블을 지정할 수 있습니다. SELinux는 Apache HTTP Server(httpd)가 이러한 유형에 모두 액세스하지 못하도록 합니다. 액세스를 허용하려면 SELinux에서 /srv/myweb/ 의 파일에 httpd 에 액세스할 수 있는지 알아야 합니다.
~]# semanage fcontext -a -t httpd_sys_content_t "/srv/myweb(/.*)?"
Copy to Clipboard Toggle word wrap
semanage 명령은 /srv/myweb/ 디렉터리(및 그 아래의 모든 파일 및 디렉터리)에 대한 컨텍스트를 SELinux file-context 구성에 추가합니다.[8]. semanage 유틸리티는 컨텍스트를 변경하지 않습니다. root 로 restorecon 유틸리티를 실행하여 변경 사항을 적용합니다.
~]# restorecon -R -v /srv/myweb
Copy to Clipboard Toggle word wrap
파일 컨텍스트 구성에 컨텍스트를 추가하는 방법에 대한 자세한 내용은 4.7.2절. “영구적인 변경 사항: semanage fcontext” 을 참조하십시오.
11.2.1.1. 올바른 문맥이란 무엇입니까?
matchpathcon 유틸리티는 파일 경로의 컨텍스트를 확인하고 해당 경로의 기본 레이블과 비교합니다. 다음 예제에서는 잘못 레이블이 지정된 파일이 포함된 디렉터리에서 matchpathcon 을 사용하는 방법을 보여줍니다.
~]$ matchpathcon -V /var/www/html/*
/var/www/html/index.html has context unconfined_u:object_r:user_home_t:s0, should be system_u:object_r:httpd_sys_content_t:s0
/var/www/html/page1.html has context unconfined_u:object_r:user_home_t:s0, should be system_u:object_r:httpd_sys_content_t:s0
Copy to Clipboard Toggle word wrap
이 예에서 index.htmlpage1.html 파일은 user_home_t 유형으로 레이블이 지정됩니다. 이 유형은 사용자 홈 디렉토리의 파일에 사용됩니다. mv 명령을 사용하여 홈 디렉토리에서 파일을 이동하면 파일이 user_home_t 유형으로 레이블이 지정될 수 있습니다. 이 유형은 홈 디렉토리 외부에 없어야 합니다. restorecon 유틸리티를 사용하여 이러한 파일을 올바른 형식으로 복원합니다.
~]# restorecon -v /var/www/html/index.html 
restorecon reset /var/www/html/index.html context unconfined_u:object_r:user_home_t:s0->system_u:object_r:httpd_sys_content_t:s0
Copy to Clipboard Toggle word wrap
디렉터리 아래의 모든 파일의 컨텍스트를 복원하려면 -R 옵션을 사용합니다.
~]# restorecon -R -v /var/www/html/
restorecon reset /var/www/html/page1.html context unconfined_u:object_r:samba_share_t:s0->system_u:object_r:httpd_sys_content_t:s0
restorecon reset /var/www/html/index.html context unconfined_u:object_r:samba_share_t:s0->system_u:object_r:httpd_sys_content_t:s0
Copy to Clipboard Toggle word wrap
matchpathcon 의 자세한 예제는 4.10.3절. “기본 SELinux 컨텍스트 확인” 을 참조하십시오.

11.2.2. 제한된 서비스 실행 방법은 무엇입니까?

서비스는 다양한 방법으로 실행할 수 있습니다. 이를 위해 서비스를 실행하는 방법을 지정해야 합니다. 이 작업은 SELinux 정책 작성에 대한 지식 없이 런타임 시 SELinux 정책 부분을 변경할 수 있는 부울을 통해 수행할 수 있습니다. 이렇게 하면 SELinux 정책을 다시 로드하거나 다시 컴파일하지 않고도 NFS 볼륨에 서비스 액세스 허용 등의 변경 사항을 허용합니다. 또한 기본이 아닌 포트 번호에서 서비스를 실행하려면 semanage 명령을 사용하여 업데이트하는 정책 구성이 필요합니다.
예를 들어 Apache HTTP Server가 MariaDB와 통신하도록 허용하려면 httpd_can_network_connect_db 부울을 활성화합니다.
~]# setsebool -P httpd_can_network_connect_db on
Copy to Clipboard Toggle word wrap
특정 서비스에 대한 액세스가 거부되면 getseboolgrep 유틸리티를 사용하여 액세스를 허용하는 부울을 사용할 수 있는지 확인합니다. 예를 들어 getsebool -a | grep ftp 명령을 사용하여 FTP 관련 부울을 검색합니다.
~]$ getsebool -a | grep ftp
ftpd_anon_write --> off
ftpd_full_access --> off
ftpd_use_cifs --> off
ftpd_use_nfs --> off

ftpd_connect_db --> off
httpd_enable_ftp_server --> off
tftp_anon_write --> off
Copy to Clipboard Toggle word wrap
부울 목록과 사용 중인지 여부를 확인하려면 getsebool -a 명령을 실행합니다. 부울 목록의 경우 각 항목이 무엇인지, 실행 중인지에 대한 설명과 semanage boolean -l 명령을 root로 실행합니다. 부울 나열 및 구성에 대한 자세한 내용은 4.6절. “부울” 을 참조하십시오.

포트 번호

정책 구성에 따라 서비스는 특정 포트 번호에서만 실행되도록 허용할 수 있습니다. 정책 변경 없이 서비스가 실행되는 포트를 변경하려고 하면 서비스가 시작되지 않을 수 있습니다. 예를 들어 semanage port -l | grep http 명령을 root로 실행하여 http 관련 포트를 나열합니다.
~]# semanage port -l | grep http
http_cache_port_t              tcp      3128, 8080, 8118
http_cache_port_t              udp      3130
http_port_t                    tcp      80, 443, 488, 8008, 8009, 8443
pegasus_http_port_t            tcp      5988
pegasus_https_port_t           tcp      5989
Copy to Clipboard Toggle word wrap
http_port_t 포트 유형은 포트 Apache HTTP Server가 수신할 수 있는 포트를 정의합니다. 이 경우 TCP 포트 80, 443, 488, 8008, 8009 및 8443입니다. 관리자가 httpd 가 포트 9876(Listen 9876)에서 수신 대기하도록 httpd.conf 를 구성하지만 이를 반영하도록 정책이 업데이트되지 않으면 다음 명령이 실패합니다.
~]# systemctl start httpd.service
Job for httpd.service failed. See 'systemctl status httpd.service' and 'journalctl -xn' for details.
Copy to Clipboard Toggle word wrap
~]# systemctl status httpd.service
httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled)
   Active: failed (Result: exit-code) since Thu 2013-08-15 09:57:05 CEST; 59s ago
  Process: 16874 ExecStop=/usr/sbin/httpd $OPTIONS -k graceful-stop (code=exited, status=0/SUCCESS)
  Process: 16870 ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND (code=exited, status=1/FAILURE)
Copy to Clipboard Toggle word wrap
다음과 유사한 SELinux 거부 메시지는 /var/log/audit/audit.log 에 기록됩니다.
type=AVC msg=audit(1225948455.061:294): avc:  denied  { name_bind } for  pid=4997 comm="httpd" src=9876 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=system_u:object_r:port_t:s0 tclass=tcp_socket
Copy to Clipboard Toggle word wrap
httpdhttp_port_t 포트 유형에 대해 나열되지 않은 포트에서 수신 대기하도록 허용하려면 semanage port 명령을 입력하여 정책 구성에 포트를 추가합니다.[9]:
~]# semanage port -a -t http_port_t -p tcp 9876
Copy to Clipboard Toggle word wrap
a 옵션은 새 레코드를 추가하고, -t 옵션은 유형을 정의하고, -p 옵션은 프로토콜을 정의합니다. 마지막 인수는 추가할 포트 번호입니다.

11.2.3. 진화하는 규칙 및 깨진 애플리케이션

애플리케이션이 손상되어 SELinux에서 액세스를 거부할 수 있습니다. 또한 SELinux 규칙이 진화하고 있습니다. SELinux는 특정 방식으로 애플리케이션이 실행되고 있지 않을 수 있으므로 애플리케이션이 예상대로 작동하는 경우에도 액세스를 거부할 수 있습니다. 예를 들어, PostgreSQL의 새 버전이 릴리스되면 현재 정책이 이전에 표시되지 않은 작업을 수행하여 액세스가 허용되어야 하는 경우에도 액세스가 거부될 수 있습니다.
이러한 경우 액세스가 거부된 후 audit2allow 유틸리티를 사용하여 액세스를 허용하는 사용자 지정 정책 모듈을 생성합니다. audit2allow 사용에 대한 자세한 내용은 11.3.8절. “액세스 허용: audit2allow” 을 참조하십시오.


[8] /etc/selinux/targeted/contexts/files/ 의 파일은 파일 및 디렉터리에 대한 컨텍스트를 정의합니다. 이 디렉터리의 파일은 restoreconsetfiles 유틸리티에서 읽고 파일과 디렉터리를 기본 컨텍스트로 복원합니다.
[9] semanage port -a 명령은 /etc/selinux/targeted/modules/active/ports.local 파일에 항목을 추가합니다. 기본적으로 이 파일은 root만 볼 수 있습니다.

11.3. 문제 해결

다음 섹션에서는 문제를 해결하는 데 도움이 됩니다. SELinux 규칙보다 먼저 확인하는 Linux 권한 확인: SELinux의 가능한 원인은 액세스를 거부하지만 거부를 거부하지만 기록되지는 않음, 레이블링 및 부울에 대한 정보가 포함된 서비스 수동 페이지; 전체 시스템 대신 하나의 프로세스가 허용을 실행할 수 있도록 허용 도메인, 거부 메시지를 검색하고 보는 방법, 감사2allow 를 사용하여 사용자 지정 정책 모듈을 생성하는 방법.

11.3.1. Linux 권한

액세스가 거부되면 표준 Linux 권한을 확인합니다. 1장. 소개 에서 언급했듯이 대부분의 운영 체제는 DAC(임의적 액세스 제어) 시스템을 사용하여 액세스를 제어하므로 사용자가 소유한 파일의 권한을 제어할 수 있습니다. SELinux 정책 규칙은 DAC 규칙 후에 확인됩니다. DAC 규칙이 먼저 액세스를 거부하면 SELinux 정책 규칙이 사용되지 않습니다.
액세스가 거부되고 SELinux 거부가 기록되지 않은 경우 다음 명령을 사용하여 표준 Linux 권한을 확인합니다.
~]$ ls -l /var/www/html/index.html
-rw-r----- 1 root root 0 2009-05-07 11:06 index.html
Copy to Clipboard Toggle word wrap
이 예에서 index.html 은 root 사용자 및 그룹이 소유합니다. root 사용자에게는 읽기 및 쓰기 권한(-rw)이 있으며 root 그룹의 멤버는 읽기 권한(-r-)을 갖습니다. 다른 모든 사용자에게는 액세스 권한이 없습니다(---). 기본적으로 이러한 권한은 httpd 가 이 파일을 읽는 것을 허용하지 않습니다. 이 문제를 해결하려면 chown 명령을 사용하여 소유자와 그룹을 변경합니다. 이 명령은 root로 실행해야 합니다.
~]# chown apache:apache /var/www/html/index.html
Copy to Clipboard Toggle word wrap
이 명령은 httpd 가 Linux Apache 사용자로 실행되는 기본 구성을 가정합니다. httpd 를 다른 사용자로 실행하는 경우 apache:apache 를 해당 사용자로 교체합니다.
Linux 권한 관리에 대한 정보는 Fedora Documentation Project "Permissions" 초안을 참조하십시오.

11.3.2. 음소거 거부의 원인

특정 상황에서 SELinux가 액세스를 거부하면 AVC 거부 메시지가 기록되지 않을 수 있습니다. 애플리케이션 및 시스템 라이브러리 기능은 작업을 수행하는 데 필요한 것보다 더 많은 액세스 권한을 조사하는 경우가 많습니다. 무해한 애플리케이션 탐색을 위해 AVC 거부로 감사 로그를 채우지 않고 최소 권한을 유지하기 위해 정책은 dontaudit 규칙을 사용하여 권한을 허용하지 않고 AVC 거부를 음소거할 수 있습니다. 이러한 규칙은 표준 정책에서 일반적입니다. dontaudit의 단점은 SELinux가 액세스를 거부하지만 거부 메시지가 기록되지 않으므로 문제 해결이 더 어렵습니다.
dontaudit 규칙을 일시적으로 비활성화하여 모든 거부를 로깅할 수 있도록 하려면 다음 명령을 root로 입력합니다.
~]# semodule -DB
Copy to Clipboard Toggle word wrap
D 옵션은 dontaudit 규칙을 비활성화합니다. -B 옵션은 정책을 다시 빌드합니다. semodule -DB 를 실행한 후 권한 문제가 발생한 애플리케이션을 수행하고 애플리케이션과 관련된 SELinux 거부가 기록되고 있는지 확인합니다. dontaudit 규칙에 의해 일부 거부를 무시하고 처리해야 하므로 허용되는 거부를 결정할 때 주의하십시오. 확실하지 않거나 지침을 검색할 때 SELinux 목록(예: fedora-selinux-list )의 다른 SELinux 사용자와 개발자에게 문의하십시오.
정책을 다시 빌드하고 dontaudit 규칙을 활성화하려면 root로 다음 명령을 입력합니다.
~]# semodule -B
Copy to Clipboard Toggle word wrap
이렇게 하면 정책이 원래 상태로 복원됩니다. 전체 dontaudit 규칙 목록은 sesearch --dontaudit 명령을 실행합니다. 범위를 좁히면 -s domain 옵션과 grep 명령을 사용하여 검색 범위를 좁힙니다. 예를 들어 다음과 같습니다.
~]$ sesearch --dontaudit -s smbd_t | grep squid
dontaudit smbd_t squid_port_t : tcp_socket name_bind ;
dontaudit smbd_t squid_port_t : udp_socket name_bind ;
Copy to Clipboard Toggle word wrap
분석 거부에 대한 자세한 내용은 11.3.6절. “원시 감사 메시지”11.3.7절. “sealert 메시지” 을 참조하십시오.

11.3.3. 서비스 수동 페이지

서비스의 수동 페이지에는 지정된 상황에 사용할 파일 유형과 같은 중요한 정보와 서비스 액세스를 변경하는 부울(예: httpd 가 NFS 볼륨에 액세스)이 포함됩니다. 이 정보는 표준 도움말 페이지 또는 sepolicy manpage 유틸리티를 사용하여 모든 서비스 도메인에 대한 SELinux 정책에서 자동으로 생성될 수 있는 도움말 페이지에 있을 수 있습니다. 이러한 도움말 페이지의 이름은 service-name_selinux 형식으로 지정됩니다. 이러한 도움말 페이지는 selinux-policy-doc 패키지와 함께 제공됩니다.
예를 들어 httpd_selinux(8) 도움말 페이지에는 주어진 상황에 사용할 파일 유형과 부울을 사용하여 스크립트를 허용하고, 파일을 공유하고, 사용자 홈 디렉터리 내의 디렉터리에 액세스하는 등의 정보가 있습니다. 서비스를 위한 SELinux 정보가 포함된 기타 도움말 페이지는 다음과 같습니다.
  • Samba: samba_selinux(8) 도움말 페이지는 예를 들어 samba_enable_home_dirs 부울을 활성화하면 Samba가 사용자 홈 디렉터리를 공유할 수 있음을 설명합니다.
  • NFS: nfsd_selinux(8) 도움말 페이지는 사용자가 가능한 한 방법으로 nfsd 프로세스를 보안할 수 있는 SELinux nfsd 정책을 설명합니다.
도움말 페이지의 정보는 SELinux가 액세스를 거부하지 않도록 올바른 파일 유형과 부울을 구성하는 데 도움이 됩니다.
sepolicy manpage 에 대한 자세한 내용은 5.4절. “수동 페이지 생성: sepolicy manpage 을 참조하십시오.

11.3.4. 허용 도메인

SELinux가 허용 모드로 실행 중이면 SELinux는 액세스를 거부하지 않지만 강제 모드에서 실행 중인 경우 거부된 작업에 대해 거부된 작업에 대해 거부됩니다. 이전에는 단일 도메인 허용(프로세스: 프로세스가 도메인에서 실행됨)을 수행할 수 없었습니다. 이로 인해 전체 시스템의 문제를 해결할 수 있게 되었습니다.
허용 도메인을 사용하면 관리자가 전체 시스템 허용을 수행하는 대신 단일 프로세스(도메인)가 허용 실행되도록 구성할 수 있습니다. SELinux 검사는 허용 도메인에 대해 계속 수행됩니다. 그러나 커널은 SELinux가 액세스를 거부한 상황에서 AVC 거부를 허용합니다.
허용 도메인에는 다음과 같은 용도가 있습니다.
  • 단일 프로세스(도메인) 실행 허용(도메인)을 실행하여 전체 시스템을 허용하도록 위험을 초래하지 않고 문제를 해결하는 데 사용할 수 있습니다.
  • 이를 통해 관리자는 새 애플리케이션에 대한 정책을 만들 수 있습니다. 이전에는 최소 정책을 생성한 다음 전체 시스템을 허용 모드로 전환하여 애플리케이션을 실행할 수 있지만 SELinux 거부는 여전히 기록되었습니다. 그런 다음 audit2allow 를 사용하여 정책을 작성할 수 있습니다. 이로 인해 전체 시스템이 위험해질 수 있습니다. 허용 도메인을 사용하면 새 정책의 도메인만 전체 시스템을 위험에 빠뜨리지 않고 허용으로 표시할 수 있습니다.
11.3.4.1. 도메인 허용 만들기
도메인을 허용하도록 하려면 semanage permissive -a domain 명령을 실행합니다. 여기서 domain 은 허용적으로 만들 도메인입니다. 예를 들어 root로 다음 명령을 입력하여 httpd_t 도메인( Apache HTTP Server가 실행되는 도메인)을 허용하도록 설정합니다.
~]# semanage permissive -a httpd_t
Copy to Clipboard Toggle word wrap
허용으로 만든 도메인 목록을 보려면 semodule -l | grep permissive 명령을 root로 실행합니다. 예를 들어 다음과 같습니다.
~]# semodule -l | grep permissive
permissive_httpd_t    (null)
permissivedomains     (null)
Copy to Clipboard Toggle word wrap
더 이상 도메인을 허용하지 않으려면 semanage permissive -d domain 명령을 root로 실행합니다. 예를 들어 다음과 같습니다.
~]# semanage permissive -d httpd_t
Copy to Clipboard Toggle word wrap
11.3.4.2. 허용 도메인 비활성화
permissivedomains.pp 모듈에는 시스템에 제공된 모든 허용 도메인 선언이 포함되어 있습니다. 모든 허용 도메인을 비활성화하려면 root로 다음 명령을 입력합니다.
~]# semodule -d permissivedomains
Copy to Clipboard Toggle word wrap
참고
semodule -d 명령을 통해 정책 모듈을 비활성화하면 semodule -l 명령의 출력에 더 이상 표시되지 않습니다. 비활성화를 포함한 모든 정책 모듈을 보려면 root로 다음 명령을 입력합니다.
~]# semodule --list-modules=full
Copy to Clipboard Toggle word wrap
11.3.4.3. 허용 도메인에 대한 거부
SYSCALL 메시지는 허용 도메인에 따라 다릅니다. 다음은 Apache HTTP 서버의 AVC 거부 (및 관련 시스템 호출)의 예입니다.
type=AVC msg=audit(1226882736.442:86): avc:  denied  { getattr } for  pid=2427 comm="httpd" path="/var/www/html/file1" dev=dm-0 ino=284133 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:samba_share_t:s0 tclass=file

type=SYSCALL msg=audit(1226882736.442:86): arch=40000003 syscall=196 success=no exit=-13 a0=b9a1e198 a1=bfc2921c a2=54dff4 a3=2008171 items=0 ppid=2425 pid=2427 auid=502 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=4 comm="httpd" exe="/usr/sbin/httpd" subj=unconfined_u:system_r:httpd_t:s0 key=(null)
Copy to Clipboard Toggle word wrap
기본적으로 httpd_t 도메인은 허용되지 않으므로 작업이 거부되고 SYSCALL 메시지에 success=no 가 포함됩니다. 다음은 semanage permissive -a httpd_t 명령이 httpd_t 도메인을 허용하도록 실행되었음을 제외하고 동일한 상황에 대한 AVC 거부의 예입니다.
type=AVC msg=audit(1226882925.714:136): avc:  denied  { read } for  pid=2512 comm="httpd" name="file1" dev=dm-0 ino=284133 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:samba_share_t:s0 tclass=file

type=SYSCALL msg=audit(1226882925.714:136): arch=40000003 syscall=5 success=yes exit=11 a0=b962a1e8 a1=8000 a2=0 a3=8000 items=0 ppid=2511 pid=2512 auid=502 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=4 comm="httpd" exe="/usr/sbin/httpd" subj=unconfined_u:system_r:httpd_t:s0 key=(null)
Copy to Clipboard Toggle word wrap
이 경우 AVC 거부가 기록되었지만 SYSCALL 메시지의 success=yes 에 표시된 대로 액세스가 거부되지 않았습니다.
허용 도메인에 대한 자세한 내용은 Dan Walsh의 "허용 도메인" 블로그 항목을 참조하십시오.

11.3.5. 거부 검색 및 보기

이 섹션에서는 setroubleshoot,setroubleshoot-server,dbusaudit 패키지가 설치되어 있고 auditd,rsyslogdsetroubleshootd 데몬이 실행 중인 것으로 가정합니다. 이러한 데몬을 시작하는 방법에 대한 자세한 내용은 4.2절. “사용된 로그 파일은 무엇입니까?” 을 참조하십시오. ausearch,aureport, sealert 와 같은 SELinux AVC 메시지를 검색하고 보는 데 사용할 수 있습니다.

ausearch

audit 패키지는 다양한 검색 기준을 기반으로 이벤트에 대한 감사 데몬 로그를 쿼리할 수 있는 ausearch 유틸리티를 제공합니다.[10] ausearch 유틸리티는 /var/log/audit/audit.log 에 액세스하므로 root 사용자로 실행해야 합니다.
검색 대상: 모든 거부
명령: ausearch -m avc,user_avc,selinux_err,user_selinux_err
검색 대상: 이에 대한 거부는 오늘
명령: ausearch -m avc -ts 오늘
검색 대상: 지난 10분 후 거부
명령: ausearch -m avc -ts recent
특정 서비스에 대한 SELinux AVC 메시지를 검색하려면 -c comm-name 옵션을 사용합니다. 여기서 comm-name 은 실행 파일 이름(예: Apache HTTP Server의 경우 httpd, Samba의 경우 smbd )을 사용합니다.
~]# ausearch -m avc -c httpd
Copy to Clipboard Toggle word wrap
~]# ausearch -m avc -c smbd
Copy to Clipboard Toggle word wrap
ausearch 명령에서는 읽기 쉽도록 --interpret (-i) 옵션을 사용하거나 스크립트 처리를 위해 --raw (-r) 옵션을 사용하는 것이 좋습니다. 추가 ausearch 옵션은 ausearch(8) 매뉴얼 페이지를 참조하십시오.

aureport

audit 패키지는 감사 시스템 로그에 대한 요약 보고서를 생성하는 aureport 유틸리티를 제공합니다. [11] aureport 유틸리티는 /var/log/audit/audit.log 에 액세스하므로 root 사용자로 실행해야 합니다. SELinux 거부 메시지 목록과 각 메시지가 발생한 빈도를 보려면 aureport -a 명령을 실행합니다. 다음은 두 개의 거부를 포함하는 출력 예입니다.
~]# aureport -a

AVC Report
========================================================
# date time comm subj syscall class permission obj event
========================================================
1. 05/01/2009 21:41:39 httpd unconfined_u:system_r:httpd_t:s0 195 file getattr system_u:object_r:samba_share_t:s0 denied 2
2. 05/03/2009 22:00:25 vsftpd unconfined_u:system_r:ftpd_t:s0 5 file read unconfined_u:object_r:cifs_t:s0 denied 4
Copy to Clipboard Toggle word wrap

sealert

setroubleshoot-server 패키지는 setroubleshoot-server 에서 번역한 거부 메시지를 읽는 sealert 유틸리티를 제공합니다.[12] 거부는 /var/log/messages 에 표시된 대로 ID가 할당됩니다. 다음은 메시지 거부의 예입니다.
setroubleshoot: SELinux is preventing /usr/sbin/httpd from name_bind access on the tcp_socket. For complete SELinux messages. run sealert -l 8c123656-5dda-4e5d-8791-9e3bd03786b7
Copy to Clipboard Toggle word wrap
이 예에서 거부 ID는 8c123656-5dda-4e5d-8791-9e3bd03786b7 입니다. l 옵션은 ID를 인수로 사용합니다. sealert -l 8c123656-5dda-4e5d-8791-9e3bd03786b7 명령을 실행하면 SELinux가 액세스를 거부한 이유와 액세스 허용에 대한 자세한 분석을 제공합니다.
X Window 시스템을 실행하고 setroubleshootsetroubleshoot-server 패키지가 설치되어 있고 setroubleshootd,dbusauditd 데몬이 실행 중인 경우 SELinux에서 액세스가 거부되면 경고가 표시됩니다.
Show 를 클릭하면 문제를 해결할 수 있는 sealert GUI가 시작됩니다.
또는 sealert -b 명령을 실행하여 sealert GUI를 실행합니다. 모든 거부 메시지에 대한 자세한 분석을 보려면 sealert -l \* 명령을 실행합니다.

11.3.6. 원시 감사 메시지

원시 감사 메시지는 /var/log/audit/audit.log 에 기록됩니다. 다음은 Apache HTTP Server( httpd_t 도메인에서 실행)가 /var/www/html/file1 파일( samba_share_t 유형으로 레이블이 지정된)에 액세스하려고 할 때 발생한 AVC 거부 메시지(및 관련 시스템 호출)의 예입니다.
type=AVC msg=audit(1226874073.147:96): avc:  denied  { getattr } for  pid=2465 comm="httpd" path="/var/www/html/file1" dev=dm-0 ino=284133 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:samba_share_t:s0 tclass=file

type=SYSCALL msg=audit(1226874073.147:96): arch=40000003 syscall=196 success=no exit=-13 a0=b98df198 a1=bfec85dc a2=54dff4 a3=2008171 items=0 ppid=2463 pid=2465 auid=502 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=6 comm="httpd" exe="/usr/sbin/httpd" subj=unconfined_u:system_r:httpd_t:s0 key=(null)
Copy to Clipboard Toggle word wrap
{ getattr }
중괄호의 항목은 거부된 권한을 나타냅니다. getattr 항목은 소스 프로세스가 대상 파일의 상태 정보를 읽으려고 한다는 것을 나타냅니다. 이 작업은 파일을 읽기 전에 수행됩니다. 이 작업은 레이블이 잘못되어 액세스 중인 파일로 인해 거부됩니다. 일반적으로 표시되는 권한에는 getattr,read, write 가 포함됩니다.
comm="httpd"
프로세스를 시작한 실행 파일입니다. 실행 파일의 전체 경로는 시스템 호출의 exe= 섹션에 있습니다(이 경우 exe="/usr/sbin/httpd" ).
path="/var/www/html/file1"
프로세스가 액세스하려고 한 개체(대상)의 경로입니다.
scontext="unconfined_u:system_r:httpd_t:s0"
거부된 작업을 시도한 프로세스의 SELinux 컨텍스트입니다. 이 경우 httpd_t 도메인에서 실행 중인 Apache HTTP Server의 SELinux 컨텍스트입니다.
tcontext="unconfined_u:object_r:samba_share_t:s0"
프로세스가 액세스를 시도한 개체(대상)의 SELinux 컨텍스트입니다. 이 경우 file1 의 SELinux 컨텍스트입니다. samba_share_t 유형은 httpd_t 도메인에서 실행되는 프로세스에 액세스할 수 없습니다.
특정 상황에서 tcontext 는 예를 들어 프로세스가 사용자 ID와 같은 실행 중인 프로세스의 특성을 변경하는 시스템 서비스를 실행하려고 할 때 scontext 와 일치할 수 있습니다. 또한 프로세스가 일반 제한보다 더 많은 리소스(예: 메모리)를 사용하려고 할 때 t context 와 일치하여 해당 프로세스가 해당 제한을 중단할 수 있는지 보안 검사를 수행할 수 있습니다.
시스템 호출(SYSCALL) 메시지에서 다음 두 항목이 중요합니다.
  • success=no: 거부(AVC)가 적용되었는지 여부를 나타냅니다. success=no 는 시스템 호출이 성공하지 못했음을 나타냅니다(SELinux 거부된 액세스). success=yes 는 시스템 호출에 성공했음을 나타냅니다. 허용 도메인 또는 제한되지 않은 도메인(예: unconfined_service_tkernel_t )에서 확인할 수 있습니다.
  • exe="/usr/sbin/httpd": 프로세스를 시작한 실행 파일의 전체 경로(이 경우 exe="/usr/sbin/httpd" ).
잘못된 파일 유형은 SELinux에서 액세스를 거부하는 일반적인 원인입니다. 문제 해결을 시작하려면 소스 컨텍스트(scontext)와 대상 컨텍스트(tcontext)를 비교합니다. 프로세스(scontext)가 이러한 오브젝트(tcontext)에 액세스해야 합니까? 예를 들어 Apache HTTP Server(httpd_t)는 별도로 구성된 경우를 제외하고 httpd_sys_content_t,public_content_thttpd_selinux(8) 매뉴얼 페이지에 지정된 유형에만 액세스해야 합니다.

11.3.7. sealert 메시지

거부는 /var/log/messages 에 표시된 대로 ID가 할당됩니다. 다음은 Apache HTTP Server( httpd_t 도메인에서 실행)가 /var/www/html/file1 파일( samba_share_t 유형으로 레이블이 지정된)에 액세스하려고 할 때 발생한 AVC 거부( 메시지에로그됨)의 예입니다.
hostname setroubleshoot: SELinux is preventing httpd (httpd_t) "getattr" to /var/www/html/file1 (samba_share_t). For complete SELinux messages. run sealert -l 32eee32b-21ca-4846-a22f-0ba050206786
Copy to Clipboard Toggle word wrap
권장된 대로 sealert -l 32eee32b-21ca-4846-a22f-0ba050206786 명령을 실행하여 전체 메시지를 확인합니다. 이 명령은 로컬 시스템에서만 작동하며 sealert GUI와 동일한 정보를 제공합니다.
~]$ sealert -l 32eee32b-21ca-4846-a22f-0ba050206786
SELinux is preventing httpd from getattr access on the file /var/www/html/file1.

*****  Plugin restorecon (92.2 confidence) suggests   ************************

If you want to fix the label. 
/var/www/html/file1 default label should be httpd_sys_content_t.
Then you can run restorecon.
Do
# /sbin/restorecon -v /var/www/html/file1

*****  Plugin public_content (7.83 confidence) suggests   ********************

If you want to treat file1 as public content
Then you need to change the label on file1 to public_content_t or public_content_rw_t.
Do
# semanage fcontext -a -t public_content_t '/var/www/html/file1'
# restorecon -v '/var/www/html/file1'

*****  Plugin catchall (1.41 confidence) suggests   **************************

If you believe that httpd should be allowed getattr access on the file1 file by default.
Then you should report this as a bug.
You can generate a local policy module to allow this access.
Do
allow this access for now by executing:
# ausearch -c 'httpd' --raw | audit2allow -M my-httpd
# semodule -i my-httpd.pp


Additional Information:
Source Context                system_u:system_r:httpd_t:s0
Target Context                unconfined_u:object_r:samba_share_t:s0
Target Objects                /var/www/html/file1 [ file ]
Source                        httpd
Source Path                   httpd
Port                          <Unknown>
Host                          hostname.redhat.com
Source RPM Packages           
Target RPM Packages           
Policy RPM                    selinux-policy-3.13.1-166.el7.noarch
Selinux Enabled               True
Policy Type                   targeted
Enforcing Mode                Enforcing
Host Name                     hostname.redhat.com
Platform                      Linux hostname.redhat.com
                              3.10.0-693.el7.x86_64 #1 SMP Thu Jul 6 19:56:57
                              EDT 2017 x86_64 x86_64
Alert Count                   2
First Seen                    2017-07-20 02:52:11 EDT
Last Seen                     2017-07-20 02:52:11 EDT
Local ID                      32eee32b-21ca-4846-a22f-0ba050206786

Raw Audit Messages
type=AVC msg=audit(1500533531.140:295): avc:  denied  { getattr } for  pid=24934 comm="httpd" path="/var/www/html/file1" dev="vda1" ino=31457414 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:samba_share_t:s0 tclass=file


Hash: httpd,httpd_t,samba_share_t,file,getattr
Copy to Clipboard Toggle word wrap
요약
거부된 작업에 대한 간략한 요약. 이는 /var/log/messages 의 거부와 동일합니다. 이 예에서 httpd 프로세스는 samba_share_t 유형으로 레이블이 지정된 파일(file1)에 대한 액세스가 거부되었습니다.
자세한 설명
보다 자세한 설명. 이 예에서 file1samba_share_t 유형으로 레이블이 지정됩니다. 이 유형은 Samba를 사용하여 내보내려는 파일 및 디렉터리에 사용됩니다. 설명은 이러한 액세스가 필요한 경우 Apache HTTP Server 및 Samba에서 액세스할 수 있는 유형으로 유형을 변경하는 것을 제안합니다.
액세스 허용
액세스를 허용하는 방법에 대한 제안 사항. 이는 파일의 레이블을 다시 지정하거나 부울을 활성화하거나 로컬 정책 모듈을 만드는 것일 수 있습니다. 이 경우 제안은 Apache HTTP 서버와 Samba 모두에서 액세스할 수 있는 유형을 사용하여 파일에 레이블을 지정하는 것입니다.
명령 수정
액세스를 허용하고 거부를 해결하기 위해 제안된 명령. 이 예제에서는 Apache HTTP Server 및 Samba가 액세스할 수 있는 file1 유형을 public_content_t 로 변경하는 명령을 제공합니다.
추가 정보
정책 패키지 이름 및 버전(selinux-policy-3.13.1-166.el7.noarch)과 같은 버그 보고서에 유용한 정보는 거부가 발생한 이유를 해결하는 데 도움이 되지 않을 수 있습니다.
원시 감사 메시지
거부와 관련된 /var/log/audit/audit.log 의 원시 감사 메시지입니다. AVC 거부의 각 항목에 대한 자세한 내용은 11.3.6절. “원시 감사 메시지” 을 참조하십시오.

11.3.8. 액세스 허용: audit2allow

주의
production의 이 섹션에서는 예제를 사용하지 마십시오. audit2allow 유틸리티 사용을 시연하는 데만 사용됩니다.
audit2allow 유틸리티는 거부된 작업의 로그에서 정보를 수집한 다음 SELinux 정책 허용 규칙을 생성합니다.[13] 11.3.7절. “sealert 메시지” 에 따라 거부 메시지를 분석한 후 레이블 변경 또는 부울이 액세스할 수 없는 경우 audit2allow 를 사용하여 로컬 정책 모듈을 생성합니다. SELinux에서 액세스를 거부하는 경우 audit2allow 를 실행하면 이전에 거부된 액세스를 허용하는 Type Enforcement 규칙이 생성됩니다.
SELinux 거부가 표시될 때 audit2allow 를 사용하여 첫 번째 옵션으로 로컬 정책 모듈을 생성하지 않아야 합니다. 레이블 지정 문제가 있는 경우 문제 해결을 시작해야 합니다. 두 번째 가장 자주 발생하는 사례는 프로세스 구성을 변경했으며 SELinux에 대해 알려주는 것을 잊어버리는 것입니다. 자세한 내용은 SELinux 오류의 4가지 주요 원인 백서를 참조하십시오.
다음 예제에서는 audit2allow 를 사용하여 정책 모듈을 생성하는 방법을 보여줍니다.
  1. 거부 메시지 및 관련 시스템 호출은 /var/log/audit/audit.log 파일에 기록됩니다.
    type=AVC msg=audit(1226270358.848:238): avc:  denied  { write } for  pid=13349 comm="certwatch" name="cache" dev=dm-0 ino=218171 scontext=system_u:system_r:certwatch_t:s0 tcontext=system_u:object_r:var_t:s0 tclass=dir
    
    type=SYSCALL msg=audit(1226270358.848:238): arch=40000003 syscall=39 success=no exit=-13 a0=39a2bf a1=3ff a2=3a0354 a3=94703c8 items=0 ppid=13344 pid=13349 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=4294967295 comm="certwatch" exe="/usr/bin/certwatch" subj=system_u:system_r:certwatch_t:s0 key=(null)
    
    Copy to Clipboard Toggle word wrap
    이 예에서 certwatchvar_t 유형으로 레이블이 지정된 디렉터리에 대한 쓰기 액세스 권한이 거부되었습니다. 거부 메시지를 11.3.7절. “sealert 메시지” 에 따라 분석합니다. 레이블 변경 또는 부울이 액세스할 수 없는 경우 audit2allow 를 사용하여 로컬 정책 모듈을 생성합니다.
  2. 다음 명령을 입력하여 액세스가 거부된 이유에 대한 사람이 읽을 수 있는 설명을 생성합니다. audit2allow 유틸리티는 /var/log/audit/audit.log 를 읽고 root 사용자로 실행해야 합니다.
    ~]# audit2allow -w -a
    type=AVC msg=audit(1226270358.848:238): avc:  denied  { write } for  pid=13349 comm="certwatch" name="cache" dev=dm-0 ino=218171 scontext=system_u:system_r:certwatch_t:s0 tcontext=system_u:object_r:var_t:s0 tclass=dir
    	Was caused by:
    		Missing type enforcement (TE) allow rule.
    
    	You can use audit2allow to generate a loadable module to allow this access.
    
    Copy to Clipboard Toggle word wrap
    a 명령줄 옵션을 사용하면 모든 감사 로그를 읽습니다. w 옵션은 사람이 읽을 수 있는 설명을 생성합니다. 표시된 대로 유형 적용 규칙이 누락되어 액세스가 거부되었습니다.
  3. 거부된 액세스를 허용하는 유형 적용 규칙을 보려면 다음 명령을 입력합니다.
    ~]# audit2allow -a
    
    
    #============= certwatch_t ==============
    allow certwatch_t var_t:dir write;
    
    Copy to Clipboard Toggle word wrap
    중요
    유형 적용 규칙이 누락된 경우 일반적으로 SELinux 정책의 버그로 인해 발생하며 Red Hat Bugzilla 에서 보고해야 합니다. Red Hat Enterprise Linux의 경우 Red Hat Enterprise Linux 제품에 대한 버그를 생성하고 selinux-policy 구성 요소를 선택합니다. 이러한 버그 보고서에 audit2allow -w -aaudit2allow -a 명령의 출력을 포함합니다.
  4. audit2allow -a 에 의해 표시되는 규칙을 사용하려면 root로 다음 명령을 입력하여 사용자 지정 모듈을 생성합니다. M 옵션은 현재 작업 디렉터리에 -M 으로 지정된 이름으로 Type Enforcement 파일(.te)을 생성합니다.
    ~]# audit2allow -a -M mycertwatch
    ******************** IMPORTANT ***********************
    To make this policy package active, execute:
    
    semodule -i mycertwatch.pp
    
    Copy to Clipboard Toggle word wrap
  5. 또한 audit2allow 는 유형 시행 규칙을 정책 패키지(.pp)로 컴파일합니다.
    ~]# ls
    mycertwatch.pp  mycertwatch.te
    
    Copy to Clipboard Toggle word wrap
    모듈을 설치하려면 root로 다음 명령을 입력합니다.
    ~]# semodule -i mycertwatch.pp
    Copy to Clipboard Toggle word wrap
    중요
    audit2allow 로 생성된 모듈은 필요한 것보다 더 많은 액세스를 허용할 수 있습니다. review를 위해 audit2allow 로 생성된 정책을 업스트림 SELinux 목록에 게시하는 것이 좋습니다. 정책에 버그가 있다고 생각되면 Red Hat Bugzilla 에 버그를 생성하십시오.
여러 프로세스의 거부 메시지가 여러 개 있지만 단일 프로세스에 대한 사용자 지정 정책만 생성하려면 grep 유틸리티를 사용하여 audit2allow 입력을 좁힙니다. 다음 예제에서는 grep 을 사용하여 certwatch 와 관련된 거부 메시지만 audit2allow 를 통해 보내는 방법을 보여줍니다.
~]# grep certwatch /var/log/audit/audit.log | audit2allow -R -M mycertwatch2
******************** IMPORTANT ***********************
To make this policy package active, execute:

semodule -i mycertwatch2.pp
Copy to Clipboard Toggle word wrap


[10] ausearch 에 대한 자세한 내용은 ausearch(8) 매뉴얼 페이지를 참조하십시오.
[11] aureport 에 대한 자세한 내용은 aureport(8) 매뉴얼 페이지를 참조하십시오.
[12] sealert 에 대한 자세한 내용은 sealert(8) 매뉴얼 페이지를 참조하십시오.
[13] audit2allow 에 대한 자세한 내용은 audit2allow(1) 매뉴얼 페이지를 참조하십시오.

12장. 추가 정보

12.1. 기여자

12.2. 기타 리소스

Fedora

국가안보국(NSA)

NSA는 원래 SELinux 개발자였습니다. NSA의 NSA의 NSA 연구진들은 Linux 커널의 주요 하위 시스템에서 유연한 필수 액세스 제어를 설계 및 구현하고 Flask 아키텍처(보안 서버 및 액세스 벡터 캐시)에서 제공하는 새로운 운영 체제 구성 요소를 구현했습니다.

Tresys 기술

Tresys Technology 는 다음 중 업스트림입니다.

SELinux GitHub 리포지토리

SELinux 프로젝트 Wiki

SELinux 노트북 - 기초 - 4번째 버전

디지털Ocean: CentOS 7의 SELinux 소개

IRC

Freenode 에서 :
  • #SELinux
  • #fedora-selinux

II 부. 제한된 서비스 관리

이 부분에서는 실제 작업에 중점을 두고 다양한 서비스를 설정하고 구성하는 방법에 대한 정보를 제공합니다. 각 서비스에 대해 사양을 사용하는 가장 일반적인 유형과 부울이 나열됩니다. 또한 이러한 서비스를 구성하는 실제 사례와 SELinux가 운영을 보완하는 방법에 대한 데모도 포함되어 있습니다.
SELinux가 강제 모드인 경우 Red Hat Enterprise Linux에서 사용되는 기본 정책은 대상 정책입니다. 대상이 되는 프로세스는 제한된 도메인과 제한되지 않은 도메인에서 대상으로 실행되지 않는 프로세스입니다. 대상 정책 및 제한 및 제한되지 않은 프로세스에 대한 자세한 내용은 3장. 대상 지정 정책 을 참조하십시오.

13장. Apache HTTP 서버

Apache HTTP 서버는 현재 HTTP 표준과 함께 오픈 소스 HTTP 서버를 제공합니다.[14]
Red Hat Enterprise Linux에서 httpd 패키지는 Apache HTTP 서버를 제공합니다. 다음 명령을 입력하여 httpd 패키지가 설치되어 있는지 확인합니다.
~]$ rpm -q httpd
package httpd is not installed
Copy to Clipboard Toggle word wrap
Apache HTTP Server가 설치되어 있지 않고 Apache HTTP Server를 사용하려면 yum 유틸리티를 root 사용자로 사용하여 설치합니다.
~]# yum install httpd
Copy to Clipboard Toggle word wrap

13.1. Apache HTTP 서버 및 SELinux

SELinux가 활성화되면 Apache HTTP Server(httpd)가 기본적으로 제한된 상태로 실행됩니다. 제한된 프로세스는 자체 도메인에서 실행되며 다른 제한된 프로세스와 분리됩니다. SELinux 정책 구성에 따라 공격자가 제한된 프로세스가 손상되면 공격자가 리소스에 대한 액세스와 가능한 손상을 제한합니다. 다음 예제에서는 자체 도메인에서 실행되는 httpd 프로세스를 보여줍니다. 이 예제에서는 httpd,setroubleshoot,setroubleshoot-serverpolicycoreutils-python 패키지가 설치되어 있다고 가정합니다.
  1. getenforce 명령을 실행하여 SELinux가 강제 모드에서 실행 중인지 확인합니다.
    ~]$ getenforce
    Enforcing
    
    Copy to Clipboard Toggle word wrap
    이 명령은 SELinux가 강제 모드에서 실행되는 경우 Enforcing 을 반환합니다.
  2. root로 다음 명령을 입력하여 httpd 를 시작합니다.
    ~]# systemctl start httpd.service
    Copy to Clipboard Toggle word wrap
    서비스가 실행 중인지 확인합니다. 출력에는 아래 정보가 포함되어야 합니다(시간 스탬프만 다릅니다).
    ~]# systemctl status httpd.service       
    httpd.service - The Apache HTTP Server
    	  Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled)
    	  Active: active (running) since Mon 2013-08-05 14:00:55 CEST; 8s ago
    
    Copy to Clipboard Toggle word wrap
  3. httpd 프로세스를 보려면 다음 명령을 실행합니다.
    ~]$ ps -eZ | grep httpd
    system_u:system_r:httpd_t:s0    19780 ?        00:00:00 httpd
    system_u:system_r:httpd_t:s0    19781 ?        00:00:00 httpd
    system_u:system_r:httpd_t:s0    19782 ?        00:00:00 httpd
    system_u:system_r:httpd_t:s0    19783 ?        00:00:00 httpd
    system_u:system_r:httpd_t:s0    19784 ?        00:00:00 httpd
    system_u:system_r:httpd_t:s0    19785 ?        00:00:00 httpd
    
    Copy to Clipboard Toggle word wrap
    httpd 프로세스와 관련된 SELinux 컨텍스트는 system_u:system_r:httpd_t:s0 입니다. 컨텍스트의 마지막 부분인 httpd_t 는 유형입니다. 유형은 프로세스 및 파일의 유형에 대한 도메인을 정의합니다. 이 경우 httpd 프로세스는 httpd_t 도메인에서 실행됩니다.
SELinux 정책은 제한된 도메인에서 실행되는 프로세스(예: httpd_t)가 파일, 기타 프로세스 및 시스템과의 상호 작용하는 방법을 정의합니다. httpd 액세스를 허용하려면 파일에 올바르게 레이블이 지정되어야 합니다. 예를 들어 httpdhttpd_sys_content_t 유형으로 레이블이 지정된 파일을 읽을 수 있지만 Linux(DAC) 권한이 쓰기 액세스를 허용하는 경우에도 해당 파일에 쓸 수 없습니다. 스크립트 네트워크 액세스 허용, NFS 및 CIFS 볼륨에 대한 httpd 액세스 허용, CGI(Common Gateway Interface) 스크립트를 실행할 수 있는 httpd 와 같은 특정 동작을 허용하려면 부울을 활성화해야 합니다.
httpd 가 TCP 포트 80, 443, 488, 8008, 8009 또는 8443 이외의 포트에서 수신 대기하도록 /etc/httpd/conf/httpd.conf 파일이 구성된 경우 semanage port 명령을 사용하여 SELinux 정책 구성에 새 포트 번호를 추가해야 합니다. 다음 예제에서는 httpd 에 대한 SELinux 정책 구성에 정의되지 않은 포트에서 수신 대기하도록 httpd 를 구성하는 방법을 보여줍니다. 결과적으로 httpd 가 시작되지 않습니다. 이 예제에서는 httpd 가 정책에 아직 정의되지 않은 비표준 포트에서 수신 대기할 수 있도록 SELinux 시스템을 구성하는 방법도 보여줍니다. 이 예제에서는 httpd 패키지가 설치되어 있다고 가정합니다. 예제에서 root 사용자로 각 명령을 실행합니다.
  1. 다음 명령을 입력하여 httpd 가 실행 중이 아닌지 확인합니다.
    ~]# systemctl status httpd.service
    httpd.service - The Apache HTTP Server
    	  Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled)
              Active: inactive (dead)
    
    Copy to Clipboard Toggle word wrap
    출력이 다르면 프로세스를 중지합니다.
    ~]# systemctl stop httpd.service
    Copy to Clipboard Toggle word wrap
  2. semanage 유틸리티를 사용하여 SELinux가 httpd 가 수신 대기할 수 있는 포트를 확인합니다.
    ~]# semanage port -l | grep -w http_port_t
    http_port_t                    tcp      80, 443, 488, 8008, 8009, 8443
    
    Copy to Clipboard Toggle word wrap
  3. /etc/httpd/conf/httpd.conf 파일을 root로 편집합니다. httpd 에 대한 SELinux 정책 구성에 구성되지 않은 포트를 나열하도록 Listen 옵션을 구성합니다. 이 예에서는 httpd 가 포트 12345에서 수신 대기하도록 구성되어 있습니다.
    # Change this to Listen on specific IP addresses as shown below to 
    # prevent Apache from glomming onto all bound IP addresses (0.0.0.0)
    #
    #Listen 12.34.56.78:80
    Listen 127.0.0.1:12345
    
    Copy to Clipboard Toggle word wrap
  4. 다음 명령을 입력하여 httpd 를 시작합니다.
    ~]# systemctl start httpd.service
    Job for httpd.service failed. See 'systemctl status httpd.service' and 'journalctl -xn' for details.
    
    Copy to Clipboard Toggle word wrap
    다음과 유사한 SELinux 거부 메시지가 기록됩니다.
    setroubleshoot: SELinux is preventing the httpd (httpd_t) from binding to port 12345. For complete SELinux messages. run sealert -l f18bca99-db64-4c16-9719-1db89f0d8c77
    
    Copy to Clipboard Toggle word wrap
  5. 이 예제에서 사용되는 대로 SELinux가 포트 12345에서 수신 대기하도록 허용하려면 다음 명령이 필요합니다.
    ~]# semanage port -a -t http_port_t -p tcp 12345
    Copy to Clipboard Toggle word wrap
  6. httpd 를 다시 시작하고 새 포트에서 수신 대기하도록 합니다.
    ~]# systemctl start httpd.service
    Copy to Clipboard Toggle word wrap
  7. 이제 SELinux가 비표준 포트(이 예제의 TCP 12345)에서 수신 대기하도록 구성되어 httpd 가 이 포트에서 성공적으로 시작됩니다.
  8. httpd 가 TCP 포트 12345에서 수신 대기 및 통신하고 있음을 증명하려면 다음과 같이 지정된 포트에 대한 telnet 연결을 열고 HTTP GET 명령을 실행합니다.
    ~]# telnet localhost 12345
    Trying 127.0.0.1...
    Connected to localhost.
    Escape character is '^]'.
    GET / HTTP/1.0
    
    HTTP/1.1 200 OK
    Date: Wed, 02 Dec 2009 14:36:34 GMT
    Server: Apache/2.2.13 (Red Hat)
    Accept-Ranges: bytes
    Content-Length: 3985
    Content-Type: text/html; charset=UTF-8
    [...continues...]
    
    Copy to Clipboard Toggle word wrap

13.2. 유형

고급 프로세스 격리를 제공하기 위해 SELinux 대상 정책에 사용되는 기본 권한 제어 방법은 Type Enforcement입니다. 모든 파일과 프로세스는 유형으로 레이블이 지정됩니다. type은 프로세스의 SELinux 도메인과 파일의 SELinux 유형을 정의합니다. SELinux 정책 규칙은 유형에 액세스하는 도메인이든 다른 도메인에 액세스하는 도메인이든 관계없이 유형이 서로 액세스하는 방법을 정의합니다. 액세스는 허용하는 특정 SELinux 정책 규칙이 있는 경우에만 허용됩니다.
다음 예제에서는 /var/www/html/ 디렉터리에 새 파일을 생성하고 상위 디렉터리(/var/www/html/)에서 httpd_sys_content_t 유형을 상속하는 파일을 보여줍니다.
  1. 다음 명령을 입력하여 /var/www/html/:의 SELinux 컨텍스트를 확인합니다.
    ~]$ ls -dZ /var/www/html
    drwxr-xr-x  root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html
    
    Copy to Clipboard Toggle word wrap
    이는 /var/www/html/httpd_sys_content_t 유형으로 레이블이 지정됩니다.
  2. touch 유틸리티를 root로 사용하여 새 파일을 생성합니다.
    ~]# touch /var/www/html/file1
    Copy to Clipboard Toggle word wrap
  3. 다음 명령을 입력하여 SELinux 컨텍스트를 확인합니다.
    ~]$ ls -Z /var/www/html/file1
    -rw-r--r--  root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/file1
    
    Copy to Clipboard Toggle word wrap
ls -Z 명령은 httpd_sys_content_t 유형으로 레이블이 지정된 file1 을 표시합니다. SELinux는 httpd 가 이 유형으로 레이블이 지정된 파일을 읽을 수 있도록 허용하지만 Linux 권한이 쓰기 액세스를 허용하는 경우에도 해당 파일에 쓸 수 없습니다. SELinux 정책은 httpd_t 도메인에서 실행되는 프로세스 유형을 정의합니다( httpd 가 실행되는 위치)는 읽고 쓸 수 있습니다. 따라서 프로세스가 다른 프로세스에서 사용할 파일에 액세스하는 것을 방지할 수 있습니다.
예를 들어 httpdhttpd_sys_content_t 유형으로 레이블이 지정된 파일에 액세스할 수 있지만 기본적으로 samba_share_t 유형으로 레이블이 지정된 파일에 액세스할 수 없습니다( Samba로 권장됨). 또한 사용자 홈 디렉터리의 파일은 user_home_t 유형으로 레이블이 지정됩니다. 기본적으로 httpd 가 사용자 홈 디렉터리의 파일을 읽거나 쓰는 것을 방지합니다.
다음은 httpd 와 함께 사용되는 몇 가지 유형을 나열합니다. 다양한 유형을 사용하여 유연한 액세스를 구성할 수 있습니다.
httpd_sys_content_t
정적 웹 사이트에서 사용하는 .html 파일과 같은 정적 웹 콘텐츠에 이 유형을 사용합니다. 이 유형으로 레이블이 지정된 파일은 httpdhttpd 에서 실행하는 스크립트에 액세스할 수 있습니다(읽기 전용). 기본적으로 이 유형으로 레이블이 지정된 파일과 디렉터리는 httpd 또는 기타 프로세스에서 작성하거나 수정할 수 없습니다. 기본적으로 에서 생성되거나 /var/www/html/ 디렉터리에 복사된 파일은 httpd_sys_content_t 유형으로 레이블이 지정됩니다.
httpd_sys_script_exec_t
httpd 를 실행할 스크립트에 이 유형을 사용합니다. 이 유형은 일반적으로 /var/www/cgi-bin/ 디렉터리의 CGI(Common Gateway Interface) 스크립트에 사용됩니다. 기본적으로 SELinux 정책은 httpd 가 CGI 스크립트를 실행하지 못하도록 합니다. 이를 허용하려면 httpd_sys_script_exec_t 유형으로 스크립트에 레이블을 지정하고 httpd_enable_cgi 부울을 활성화합니다. httpd _sys_script_exec_t 로 레이블이 지정된 스크립트는 httpd_sys_script_t 도메인에서 실행됩니다. httpd_sys_script_t 도메인은 postgresql_tmysqld_t 와 같은 다른 시스템 도메인에 액세스할 수 있습니다.
httpd_sys_rw_content_t
이 유형으로 레이블이 지정된 파일은 httpd_sys_script_exec_t 유형으로 레이블이 지정된 스크립트에서 작성할 수 있지만 다른 유형으로 레이블이 지정된 스크립트에서 수정할 수 없습니다. httpd_sys_rw_content_t 유형을 사용하여 httpd_sys_script_exec_t 유형으로 레이블이 지정된 스크립트에서 읽고 쓸 파일에 레이블을 지정해야 합니다.
httpd_sys_ra_content_t
이 유형으로 레이블이 지정된 파일은 httpd_sys_script_exec_t 유형으로 레이블이 지정된 스크립트에서 추가할 수 있지만 다른 유형으로 레이블이 지정된 스크립트에서 수정할 수 없습니다. httpd_sys_ra_content_t 유형을 사용하여 httpd_sys_script_exec_t 유형으로 레이블이 지정된 스크립트에서 읽고 추가할 파일에 레이블을 지정해야 합니다.
httpd_unconfined_script_exec_t
이 유형으로 레이블이 지정된 스크립트는 SELinux 보호 없이 실행됩니다. 다른 모든 옵션을 모두 고갈시킨 후 복잡한 스크립트에만 이 유형을 사용합니다. httpd 또는 전체 시스템에 대해 SELinux 보호를 비활성화하는 대신 이 유형을 사용하는 것이 좋습니다.
참고
httpd에 사용 가능한 유형을 추가하려면 다음 명령을 입력합니다.
~]$ grep httpd /etc/selinux/targeted/contexts/files/file_contexts
Copy to Clipboard Toggle word wrap

절차 13.1. SELinux 컨텍스트 변경

파일 및 디렉토리의 유형은 chcon 명령을 사용하여 변경할 수 있습니다. chcon 을 사용하여 변경한 내용은 파일 시스템의 레이블을 다시 지정하거나 restorecon 명령으로 유지되지 않습니다. SELinux 정책은 사용자가 지정된 파일에 대한 SELinux 컨텍스트를 수정할 수 있는지 여부를 제어합니다. 다음 예제에서는 httpd 에서 사용할 새 디렉터리와 index.html 파일을 생성하고 해당 파일과 디렉터리에 레이블을 지정하여 httpd 액세스를 허용하는 방법을 보여줍니다.
  1. root Cryostat 유틸리티를 사용하여 httpd 에서 사용할 파일을 저장할 최상위 디렉터리 구조를 만듭니다.
    ~]# mkdir -p /my/website
    Copy to Clipboard Toggle word wrap
  2. file-context 구성의 패턴과 일치하지 않는 파일 및 디렉터리는 default_t 유형으로 레이블을 지정할 수 있습니다. 이 유형은 제한된 서비스에 액세스할 수 없습니다.
    ~]$ ls -dZ /my
    drwxr-xr-x  root root unconfined_u:object_r:default_t:s0 /my
    
    Copy to Clipboard Toggle word wrap
  3. root로 다음 명령을 입력하여 my/ 디렉토리 및 하위 디렉터리의 유형을 httpd 에 액세스할 수 있는 유형으로 변경합니다. 이제 /my/website/ 에서 생성된 파일은 default_t 유형이 아닌 httpd_sys_content_t 유형을 상속하므로 httpd에 액세스할 수 있습니다.
    ~]# chcon -R -t httpd_sys_content_t /my/
    ~]# touch /my/website/index.html
    ~]# ls -Z /my/website/index.html
    -rw-r--r--  root root unconfined_u:object_r:httpd_sys_content_t:s0 /my/website/index.html
    
    Copy to Clipboard Toggle word wrap
chcon 에 대한 자세한 내용은 4.7.1절. “임시 변경 사항: chcon” 을 참조하십시오.
semanage fcontext 명령( policycoreutils-python 패키지에서 제공하는semanage )을 사용하여 레이블 재레이블 및 restorecon 명령 후에도 레이블을 변경합니다. 이 명령은 파일 컨텍스트 구성에 변경 사항을 추가합니다. 그런 다음 file-context 구성을 읽는 restorecon 을 실행하여 레이블 변경을 적용합니다. 다음 예제에서는 httpd 에서 사용할 새 디렉터리와 index.html 파일을 생성하고 해당 디렉터리와 파일의 레이블을 지속적으로 변경하여 httpd 액세스를 허용하는 방법을 보여줍니다.
  1. root Cryostat 유틸리티를 사용하여 httpd 에서 사용할 파일을 저장할 최상위 디렉터리 구조를 만듭니다.
    ~]# mkdir -p /my/website
    Copy to Clipboard Toggle word wrap
  2. root로 다음 명령을 입력하여 레이블 변경 사항을 파일 컨텍스트 구성에 추가합니다.
    ~]# semanage fcontext -a -t httpd_sys_content_t "/my(/.*)?"
    Copy to Clipboard Toggle word wrap
    "/my(/.*)?" 표현식은 레이블 변경이 my/ 디렉토리와 그 아래의 모든 파일과 디렉터리에 적용됨을 의미합니다.
  3. touch 유틸리티를 root로 사용하여 새 파일을 생성합니다.
    ~]# touch /my/website/index.html
    Copy to Clipboard Toggle word wrap
  4. root로 다음 명령을 입력하여 레이블 변경 사항을 적용합니다.restorecon 은 2단계에서 semanage 명령으로 수정된 file-context 구성을 읽습니다.
    ~]# restorecon -R -v /my/
    restorecon reset /my context unconfined_u:object_r:default_t:s0->system_u:object_r:httpd_sys_content_t:s0
    restorecon reset /my/website context unconfined_u:object_r:default_t:s0->system_u:object_r:httpd_sys_content_t:s0
    restorecon reset /my/website/index.html context unconfined_u:object_r:default_t:s0->system_u:object_r:httpd_sys_content_t:s0
    
    Copy to Clipboard Toggle word wrap
semanage에 대한 자세한 내용은 4.7.2절. “영구적인 변경 사항: semanage fcontext” 을 참조하십시오.

13.3. 부울

SELinux는 서비스를 실행하는 데 필요한 최소 액세스 수준을 기반으로 합니다. 서비스는 다양한 방법으로 실행할 수 있으므로 서비스 실행 방법을 지정해야 합니다. 이 작업은 SELinux 정책 작성에 대한 지식 없이 런타임 시 SELinux 정책 부분을 변경할 수 있는 부울을 사용하여 수행할 수 있습니다. 이렇게 하면 SELinux 정책을 다시 로드하거나 다시 컴파일하지 않고도 NFS 볼륨에 서비스 액세스 허용 등의 변경 사항을 허용합니다.
부울의 상태를 수정하려면 setsebool 명령을 사용합니다. 예를 들어 httpd_anon_write 부울을 활성화하려면 root 사용자로 다음 명령을 입력합니다.
~]# setsebool -P httpd_anon_write on
Copy to Clipboard Toggle word wrap
부울을 비활성화하려면 동일한 예제를 사용하여 다음과 같이 명령에서 를 off 로 변경합니다.
~]# setsebool -P httpd_anon_write off
Copy to Clipboard Toggle word wrap
참고
setsebool 변경 사항을 재부팅해도 유지하지 않으려면 -P 옵션을 사용하지 마십시오.
다음은 httpd 가 실행되는 방식을 충족하는 일반적인 부울에 대한 설명입니다.
httpd_anon_write
비활성화된 경우 이 부울을 사용하면 httpdpublic_content_rw_t 유형으로 레이블이 지정된 파일에 대한 읽기 액세스 권한만 가질 수 있습니다. 이 부울을 활성화하면 httpd 가 공용 파일 전송 서비스에 대한 파일을 포함하는 공용 디렉터리와 같이 public_content_rw_t 유형으로 레이블이 지정된 파일에 쓸 수 있습니다.
httpd_mod_auth_ntlm_winbind
이 부울을 활성화하면 httpd 에서 mod_auth_ntlm_winbind 모듈을 사용하여 NTLM 및 Winbind 인증 메커니즘에 액세스할 수 있습니다.
httpd_mod_auth_pam
이 부울을 활성화하면 httpd 에서 mod_auth_pam 모듈을 사용하여 PAM 인증 메커니즘에 액세스할 수 있습니다.
httpd_sys_script_anon_write
이 부울은 공용 파일 전송 서비스에서 사용되는 대로 public_content_rw_t 유형으로 레이블이 지정된 파일에 대한 HTTP 스크립트가 허용되는지 여부를 정의합니다.
httpd_builtin_scripting
이 부울은 httpd 스크립팅에 대한 액세스를 정의합니다. 이 부울을 활성화하려면 PHP 콘텐츠에 필요합니다.
httpd_can_network_connect
이 부울을 비활성화하면 HTTP 스크립트 및 모듈이 네트워크 또는 원격 포트에 대한 연결을 시작하지 못하게 합니다. 이 액세스를 허용하려면 이 부울을 활성화합니다.
httpd_can_network_connect_db
이 부울을 비활성화하면 HTTP 스크립트 및 모듈이 데이터베이스 서버에 대한 연결을 시작하지 못하게 합니다. 이 액세스를 허용하려면 이 부울을 활성화합니다.
httpd_can_network_relay
httpd 가 정방향 또는 역방향 프록시로 사용될 때 이 부울을 활성화합니다.
httpd_can_sendmail
이 부울을 비활성화하면 HTTP 모듈이 메일을 보내지 못하게 합니다. 이는 httpd 에서 취약점을 발견해야 하는 스팸 공격을 방지할 수 있습니다. HTTP 모듈이 메일을 보낼 수 있도록 이 부울을 활성화합니다.
httpd_dbus_avahi
비활성화되면 이 부울은D-Bus 를 통해 avahi 서비스에 대한 httpd 액세스를 거부합니다. 이 액세스를 허용하려면 이 부울을 활성화합니다.
httpd_enable_cgi
비활성화되면 이 부울에서 httpd 가 CGI 스크립트를 실행하지 못하도록 합니다. httpd 가 CGI 스크립트를 실행할 수 있도록 하려면 이 부울을 활성화합니다(CGI 스크립트는 httpd_sys_script_exec_t 유형으로 레이블이 지정되어야 함).
httpd_enable_ftp_server
이 부울을 활성화하면 httpd 가 FTP 포트에서 수신 대기하고 FTP 서버로 작동할 수 있습니다.
httpd_enable_homedirs
비활성화된 경우 이 부울은 httpd 가 사용자 홈 디렉터리에 액세스하지 못하도록 합니다. 사용자 홈 디렉터리에 대한 httpd 액세스를 허용하려면 이 부울을 활성화합니다(예: /home/*/ 의 콘텐츠).
httpd_execmem
이 부울을 사용하면 httpd 에서 실행 가능하고 쓰기 가능한 메모리 주소가 필요한 프로그램을 실행할 수 있습니다. 이 부울을 활성화하면 버퍼 오버플로에 대한 보호가 감소하지만 특정 모듈 및 애플리케이션(예: Java 및 킥 애플리케이션)에 대한 보호 권한이 필요하므로 보안 관점에서는 사용하지 않는 것이 좋습니다.
httpd_ssi_exec
이 부울은 웹 페이지의 서버 측에 SSI(서버 측) 요소를 포함할 수 있는지 여부를 정의합니다.
httpd_tty_comm
이 부울은 httpd 가 제어 터미널에 액세스할 수 있는지 여부를 정의합니다. 일반적으로 이 액세스는 필요하지 않지만 SSL 인증서 파일을 구성하는 등의 경우 터미널 액세스가 암호 프롬프트를 표시하고 처리해야 합니다.
httpd_unified
활성화하면 이 부울을 사용하면 httpd_t 가 모든 httpd 유형(즉, sys_content_t를 실행, 읽기 또는 쓰기)에 액세스할 수 있습니다. 비활성화된 경우 읽기 전용, 쓰기 가능 또는 실행 가능한 웹 콘텐츠 간에 분리가 수행됩니다. 이 부울을 비활성화하면 추가적인 보안 수준이 보장되지만, 각각 보유해야 하는 파일 액세스에 따라 스크립트 및 기타 웹 콘텐츠에 개별적으로 레이블을 지정하는 관리 오버헤드가 추가됩니다.
httpd_use_cifs
Samba를 사용하여 마운트된 파일 시스템과 같이 cifs_t 유형으로 레이블이 지정된 CIFS 볼륨의 파일에 httpd 액세스를 허용하려면 이 부울을 활성화합니다.
httpd_use_nfs
NFS를 사용하여 마운트된 파일 시스템과 같이 nfs_t 유형으로 레이블이 지정된 NFS 볼륨의 파일에 httpd 액세스를 허용하려면 이 부울을 활성화합니다.
참고
SELinux 정책의 지속적인 개발로 인해 위의 목록에 항상 서비스와 관련된 부울이 모두 포함되지 않을 수 있습니다. 나열하려면 다음 명령을 입력합니다.
~]$ getsebool -a | grep service_name
Copy to Clipboard Toggle word wrap
특정 부울에 대한 설명을 보려면 다음 명령을 입력합니다.
~]$ sepolicy booleans -b boolean_name
Copy to Clipboard Toggle word wrap
이 명령이 작동하려면 sepolicy 유틸리티를 제공하는 추가 policycoreutils-devel 패키지가 필요합니다.

13.4. 설정 예

다음 예제에서는 SELinux가 Apache HTTP 서버를 보완하는 방법과 Apache HTTP Server의 전체 기능을 유지 관리하는 방법을 보여주는 실제 데모를 제공합니다.

13.4.1. 정적 사이트 실행

정적 웹 사이트를 생성하려면 해당 웹 사이트의 .html 파일에 httpd_sys_content_t 유형의 레이블을 지정합니다. 기본적으로 Apache HTTP 서버는 httpd_sys_content_t 유형으로 레이블이 지정된 파일에 쓸 수 없습니다. 다음 예제에서는 읽기 전용 웹 사이트에 대한 파일을 저장할 새 디렉터리를 생성합니다.
  1. root Cryostat 유틸리티를 사용하여 최상위 디렉토리를 생성합니다.
    ~]# mkdir /mywebsite
    Copy to Clipboard Toggle word wrap
  2. root 로서 /mywebsite/index.html 파일을 만듭니다. 다음 콘텐츠를 복사하여 /mywebsite/index.html 에 붙여넣습니다.
    <html>
    <h2>index.html from /mywebsite/</h2>
    </html>
    
    Copy to Clipboard Toggle word wrap
  3. Apache HTTP Server가 /mywebsite/ 및 그 아래의 파일 및 하위 디렉터리에 대한 읽기 전용 액세스만 허용하려면 httpd_sys_content_t 유형의 디렉터리에 레이블을 지정합니다. root로 다음 명령을 입력하여 레이블 변경 사항을 파일 컨텍스트 구성에 추가합니다.
    ~]# semanage fcontext -a -t httpd_sys_content_t "/mywebsite(/.*)?"
    Copy to Clipboard Toggle word wrap
  4. restorecon 유틸리티를 root로 사용하여 레이블을 변경합니다.
    ~]# restorecon -R -v /mywebsite
    restorecon reset /mywebsite context unconfined_u:object_r:default_t:s0->system_u:object_r:httpd_sys_content_t:s0
    restorecon reset /mywebsite/index.html context unconfined_u:object_r:default_t:s0->system_u:object_r:httpd_sys_content_t:s0
    
    Copy to Clipboard Toggle word wrap
  5. 이 예에서는 /etc/httpd/conf/httpd.conf 파일을 root로 편집합니다. 기존 DocumentRoot 옵션을 주석 처리합니다. DocumentRoot "/mywebsite" 옵션을 추가합니다. 편집 후 이러한 옵션은 다음과 같이 표시됩니다.
    #DocumentRoot "/var/www/html"
    DocumentRoot "/mywebsite"
    
    Copy to Clipboard Toggle word wrap
  6. root로 다음 명령을 입력하여 Apache HTTP Server의 상태를 확인합니다. 서버가 중지되면 시작합니다.
    ~]# systemctl status httpd.service
    httpd.service - The Apache HTTP Server
       Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled)
       Active: inactive (dead)
    
    Copy to Clipboard Toggle word wrap
    ~]# systemctl start httpd.service
    Copy to Clipboard Toggle word wrap
    서버가 실행 중인 경우 root로 다음 명령을 실행하여 서비스를 다시 시작합니다( httpd.conf에 대한 변경 사항도 적용됨).
    ~]# systemctl status httpd.service
    httpd.service - The Apache HTTP Server
       Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled)
       Active: active (running) since Wed 2014-02-05 13:16:46 CET; 2s ago
    
    Copy to Clipboard Toggle word wrap
    ~]# systemctl restart httpd.service
    Copy to Clipboard Toggle word wrap
  7. 웹 브라우저를 사용하여 http://localhost/index.html 로 이동합니다. 다음은 다음과 같습니다.
    index.html from /mywebsite/
    
    Copy to Clipboard Toggle word wrap

13.4.2. NFS 및 CIFS 볼륨 공유

기본적으로 클라이언트쪽의 NFS 마운트는 NFS 볼륨의 정책에서 정의한 기본 컨텍스트로 레이블이 지정됩니다. 일반적인 정책에서 이 기본 컨텍스트는 nfs_t 유형을 사용합니다. 또한 기본적으로 클라이언트측에 마운트된 Samba 공유는 정책에서 정의한 기본 컨텍스트로 레이블이 지정됩니다. 일반적인 정책에서 이 기본 컨텍스트는 cifs_t 유형을 사용합니다.
정책 구성에 따라 서비스에서 nfs_t 또는 cifs_t 유형으로 레이블이 지정된 파일을 읽지 못할 수 있습니다. 이렇게 하면 이러한 유형으로 레이블이 지정된 파일 시스템이 마운트되지 않고 다른 서비스에서 읽거나 내보내지 못하게 할 수 있습니다. 부울을 활성화하거나 비활성화하여 nfs_tcifs_t 유형에 액세스할 수 있는 서비스를 제어할 수 있습니다.
httpd_use_nfs 부울을 활성화하여 httpd 가 NFS 볼륨( nfs_t 유형으로 레이블이 지정된)에 액세스하고 공유할 수 있도록 합니다.
~]# setsebool -P httpd_use_nfs on
Copy to Clipboard Toggle word wrap
httpd_use_cifs 부울을 활성화하여 httpd 가 CIFS 볼륨에 액세스하고 공유할 수 있도록 합니다( cifs_t 유형으로 레이블이 지정됨).
~]# setsebool -P httpd_use_cifs on
Copy to Clipboard Toggle word wrap
참고
setsebool 변경 사항을 재부팅해도 유지하지 않으려면 -P 옵션을 사용하지 마십시오.

13.4.3. 서비스 간 파일 공유

type Enforcement를 사용하면 프로세스가 다른 프로세스에서 사용할 파일에 액세스하는 것을 방지할 수 있습니다. 예를 들어 기본적으로 Samba는 Apache HTTP Server에서 사용하기 위한 httpd_sys_content_t 유형으로 레이블이 지정된 파일을 읽을 수 없습니다. 필요한 파일에 public_content_t 또는 public_content_rw_t 유형으로 레이블이 지정된 경우 Apache HTTP Server, FTP, rsync 및 Samba 간에 파일을 공유할 수 있습니다.
다음 예제에서는 디렉터리와 파일을 만들고 Apache HTTP 서버, FTP, rsync 및 Samba를 통해 해당 디렉토리와 파일을 공유(읽기 전용)할 수 있습니다.
  1. root Cryostat 유틸리티를 사용하여 여러 서비스 간에 파일을 공유할 새 최상위 디렉토리를 만듭니다.
    ~]# mkdir /shares
    Copy to Clipboard Toggle word wrap
  2. file-context 구성의 패턴과 일치하지 않는 파일 및 디렉터리는 default_t 유형으로 레이블을 지정할 수 있습니다. 이 유형은 제한된 서비스에 액세스할 수 없습니다.
    ~]$ ls -dZ /shares
    drwxr-xr-x  root root unconfined_u:object_r:default_t:s0 /shares
    
    Copy to Clipboard Toggle word wrap
  3. root 로서 /shares/index.html 파일을 만듭니다. 다음 콘텐츠를 복사하여 /shares/index.html 에 붙여넣습니다.
    <html>
    <body>
    <p>Hello</p>
    </body>
    </html>
    
    Copy to Clipboard Toggle word wrap
  4. public_content_t 유형을 사용하여 /shares/ 레이블을 지정하면 Apache HTTP Server, FTP, rsync 및 Samba의 읽기 전용 액세스를 허용합니다. root로 다음 명령을 입력하여 레이블 변경 사항을 파일 컨텍스트 구성에 추가합니다.
    ~]# semanage fcontext -a -t public_content_t "/shares(/.*)?"
    Copy to Clipboard Toggle word wrap
  5. restorecon 유틸리티를 root로 사용하여 레이블 변경 사항을 적용합니다.
    ~]# restorecon -R -v /shares/
    restorecon reset /shares context unconfined_u:object_r:default_t:s0->system_u:object_r:public_content_t:s0
    restorecon reset /shares/index.html context unconfined_u:object_r:default_t:s0->system_u:object_r:public_content_t:s0
    
    Copy to Clipboard Toggle word wrap
Samba를 통해 /shares/ 를 공유하려면 다음을 수행합니다.
  1. samba, samba -commonsamba-client 패키지가 설치되어 있는지 확인합니다(버전 번호가 다를 수 있음).
    ~]$ rpm -q samba samba-common samba-client
    samba-3.4.0-0.41.el6.3.i686
    samba-common-3.4.0-0.41.el6.3.i686
    samba-client-3.4.0-0.41.el6.3.i686
    
    Copy to Clipboard Toggle word wrap
    이러한 패키지가 설치되어 있지 않으면 root로 다음 명령을 실행하여 설치합니다.
    ~]# yum install package-name
    Copy to Clipboard Toggle word wrap
  2. /etc/samba/smb.conf 파일을 root로 편집합니다. 이 파일 하단에 다음 항목을 추가하여 Samba를 통해 /shares/ 디렉터리를 공유합니다.
    [shares]
    comment = Documents for Apache HTTP Server, FTP, rsync, and Samba
    path = /shares
    public = yes
    writable = no
    
    Copy to Clipboard Toggle word wrap
  3. Samba 파일 시스템을 마운트하려면 Samba 계정이 필요합니다. root로 다음 명령을 입력하여 Samba 계정을 만듭니다. 여기서 username 은 기존 Linux 사용자입니다. 예를 들어 smbpasswd -a testuser 는 Linux testuser 사용자에 대한 Samba 계정을 생성합니다.
    ~]# smbpasswd -a testuser
    New SMB password: Enter a password
    Retype new SMB password: Enter the same password again
    Added user testuser.
    
    Copy to Clipboard Toggle word wrap
    위의 명령을 실행하여 시스템에 존재하지 않는 계정의 사용자 이름을 지정하면 '사용자 이름 '! 오류에 대한 Unix 계정을찾을수 없습니다.
  4. Samba 서비스를 시작합니다.
    ~]# systemctl start smb.service
    Copy to Clipboard Toggle word wrap
  5. 다음 명령을 입력하여 사용 가능한 공유를 나열합니다. 여기서 username 은 3단계에 추가된 Samba 계정입니다. 암호를 입력하라는 메시지가 표시되면 3단계에서 Samba 계정에 할당된 암호를 입력합니다(버전 번호는 다를 수 있음).
    ~]$ smbclient -U username -L localhost
    Enter username's password:
    Domain=[HOSTNAME] OS=[Unix] Server=[Samba 3.4.0-0.41.el6]
    
    Sharename       Type      Comment
    ---------       ----      -------
    shares          Disk      Documents for Apache HTTP Server, FTP, rsync, and Samba
    IPC$            IPC       IPC Service (Samba Server Version 3.4.0-0.41.el6)
    username        Disk      Home Directories
    Domain=[HOSTNAME] OS=[Unix] Server=[Samba 3.4.0-0.41.el6]
    
    Server               Comment
    ---------            -------
    
    Workgroup            Master
    ---------            -------
    
    Copy to Clipboard Toggle word wrap
  6. 디렉터리 를 생성하는 사용자입니다. 이 디렉터리는 공유 Samba 공유를 마운트하는 데 사용됩니다.
    ~]# mkdir /test/
    Copy to Clipboard Toggle word wrap
  7. root로 다음 명령을 입력하여 공유 Samba 공유를 /test/ 에 마운트하고 사용자 이름을 3단계에서 사용자 이름으로 바꿉니다.
    ~]# mount //localhost/shares /test/ -o user=username
    Copy to Clipboard Toggle word wrap
    3단계에 구성된 사용자 이름의 암호를 입력합니다.
  8. Samba를 통해 공유되는 파일의 내용을 확인합니다.
    ~]$ cat /test/index.html
    <html>
    <body>
    <p>Hello</p>
    </body>
    </html>
    
    Copy to Clipboard Toggle word wrap
Apache HTTP 서버를 통해 /shares/ 를 공유하려면 다음을 수행합니다.
  1. httpd 패키지가 설치되었는지 확인합니다 (버전 번호는 다를 수 있음).
    ~]$ rpm -q httpd
    httpd-2.2.11-6.i386
    
    Copy to Clipboard Toggle word wrap
    이 패키지가 설치되지 않은 경우 yum 유틸리티를 root로 사용하여 설치합니다.
    ~]# yum install httpd
    Copy to Clipboard Toggle word wrap
  2. /var/www/html/ 디렉터리로 변경합니다. root로 다음 명령을 입력하여 / shares/ 디렉터리에 대한 링크(마운트 )를 생성합니다.
    html]# ln -s /shares/ shares
    Copy to Clipboard Toggle word wrap
  3. Apache HTTP 서버를 시작합니다.
    ~]# systemctl start httpd.service
    Copy to Clipboard Toggle word wrap
  4. 웹 브라우저를 사용하여 http://localhost/shares 로 이동합니다. /shares/index.html 파일이 표시됩니다.
기본적으로 Apache HTTP 서버는 index.html 파일이 있는 경우 읽습니다. /shares/index.html 이 없고 대신 file1,file2, file3 이 있는 경우 http://localhost/shares 에 액세스할 때 디렉터리 목록이 발생합니다.
  1. index.html 파일을 제거합니다.
    ~]# rm -i /shares/index.html
    Copy to Clipboard Toggle word wrap
  2. /shares/:에 3개의 파일을 생성하려면 touch 유틸리티를 root로 사용합니다.
    ~]# touch /shares/file{1,2,3}
    ~]# ls -Z /shares/
    -rw-r--r--  root root system_u:object_r:public_content_t:s0 file1
    -rw-r--r--  root root unconfined_u:object_r:public_content_t:s0 file2
    -rw-r--r--  root root unconfined_u:object_r:public_content_t:s0 file3
    
    Copy to Clipboard Toggle word wrap
  3. root로 다음 명령을 입력하여 Apache HTTP Server의 상태를 확인합니다.
    ~]# systemctl status httpd.service
    httpd.service - The Apache HTTP Server
       Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled)
       Active: inactive (dead)
    
    Copy to Clipboard Toggle word wrap
    서버가 중지되면 시작합니다.
    ~]# systemctl start httpd.service
    Copy to Clipboard Toggle word wrap
  4. 웹 브라우저를 사용하여 http://localhost/shares 로 이동합니다. 디렉터리 목록이 표시됩니다.

13.4.4. 포트 번호 변경

정책 구성에 따라 서비스는 특정 포트 번호에서만 실행되도록 허용할 수 있습니다. 정책 변경 없이 서비스가 실행되는 포트를 변경하려고 하면 서비스가 시작되지 않을 수 있습니다. semanage 유틸리티를 root 사용자로 사용하여 SELinux가 httpd 에서 수신 대기할 수 있는 포트를 나열합니다.
~]# semanage port -l | grep -w http_port_t
http_port_t                    tcp      80, 443, 488, 8008, 8009, 8443
Copy to Clipboard Toggle word wrap
기본적으로 SELinux는 httpd 가 TCP 포트 80, 443, 488, 8008, 8009 또는 8443에서 수신 대기하도록 허용합니다. httpdhttp_port_t 에 대해 나열되지 않은 포트에서 수신 대기하도록 /etc/httpd/conf/httpd.conf 가 구성된 경우httpd 가 시작되지 않습니다.
TCP 포트 80, 443, 488, 8008, 8009 또는 8443 이외의 포트에서 실행되도록 httpd 를 구성하려면 다음을 수행합니다.
  1. /etc/httpd/conf/httpd.conf 파일을 root로 편집하여 Listen 옵션은 httpd 에 대해 SELinux 정책에 구성되지 않은 포트를 나열합니다. 다음 예제에서는 10.0.0.1 IP 주소 및 TCP 포트 12345에서 수신 대기하도록 httpd 를 구성합니다.
    # Change this to Listen on specific IP addresses as shown below to 
    # prevent Apache from glomming onto all bound IP addresses (0.0.0.0)
    #
    #Listen 12.34.56.78:80
    Listen 10.0.0.1:12345
    
    Copy to Clipboard Toggle word wrap
  2. 다음 명령을 root 사용자로 입력하여 포트를 SELinux 정책 구성에 추가합니다.
    ~]# semanage port -a -t http_port_t -p tcp 12345
    Copy to Clipboard Toggle word wrap
  3. 포트가 추가되었는지 확인합니다.
    ~]# semanage port -l | grep -w http_port_t
    http_port_t                    tcp      12345, 80, 443, 488, 8008, 8009, 8443
    
    Copy to Clipboard Toggle word wrap
포트 12345에서 httpd 를 더 이상 실행하지 않는 경우 semanage 유틸리티를 root로 사용하여 정책 구성에서 포트를 제거합니다.
~]# semanage port -d -t http_port_t -p tcp 12345
Copy to Clipboard Toggle word wrap

14장. Samba

Samba는SMB(서버 메시지 블록) 및CIFS(Common Internet File System) 프로토콜의 오픈 소스 구현으로, 다양한 운영 체제에서 클라이언트 간에 파일 및 인쇄 서비스를 제공합니다.[15]
Red Hat Enterprise Linux에서 samba 패키지는 Samba 서버를 제공합니다. 다음 명령을 입력하여 samba 패키지가 설치되어 있는지 확인합니다.
~]$ rpm -q samba
package samba is not installed
Copy to Clipboard Toggle word wrap
설치되지 않고 Samba를 사용하려면 yum 유틸리티를 root 사용자로 사용하여 설치합니다.
~]# yum install samba
Copy to Clipboard Toggle word wrap

14.1. Samba 및 SELinux

SELinux가 활성화되면 Samba 서버(smbd)가 기본적으로 제한됩니다. 제한된 서비스는 자체 도메인에서 실행되며 다른 제한된 서비스와 분리됩니다. 다음 예제에서는 자체 도메인에서 실행되는 smbd 프로세스를 보여줍니다. 이 예제에서는 samba 패키지가 설치되어 있다고 가정합니다.
  1. getenforce 명령을 실행하여 SELinux가 강제 모드에서 실행 중인지 확인합니다.
    ~]$ getenforce
    Enforcing
    
    Copy to Clipboard Toggle word wrap
    이 명령은 SELinux가 강제 모드에서 실행되는 경우 Enforcing 을 반환합니다.
  2. root로 다음 명령을 입력하여 smbd 를 시작합니다.
    ~]# systemctl start smb.service
    Copy to Clipboard Toggle word wrap
    서비스가 실행 중인지 확인합니다. 출력에는 아래 정보가 포함되어야 합니다(시간 스탬프만 다릅니다).
    ~]# systemctl status smb.service
    smb.service - Samba SMB Daemon
       Loaded: loaded (/usr/lib/systemd/system/smb.service; disabled)
       Active: active (running) since Mon 2013-08-05 12:17:26 CEST; 2h 22min ago
    
    Copy to Clipboard Toggle word wrap
  3. smbd 프로세스를 보려면 다음 명령을 실행합니다.
    ~]$ ps -eZ | grep smb
    system_u:system_r:smbd_t:s0      9653 ?        00:00:00 smbd
    system_u:system_r:smbd_t:s0      9654?        00:00:00 smbd
    
    Copy to Clipboard Toggle word wrap
    smbd 프로세스와 관련된 SELinux 컨텍스트는 system_u:system_r:smbd_t:s0 입니다. 컨텍스트의 마지막 부분인 smbd_t 는 유형입니다. 유형은 프로세스 및 파일의 유형에 대한 도메인을 정의합니다. 이 경우 smbd 프로세스는 smbd_t 도메인에서 실행됩니다.
smbd 가 액세스하고 공유할 수 있도록 파일에 올바르게 레이블이 지정되어야 합니다. 예를 들어 smbdsamba_share_t 유형으로 레이블이 지정된 파일을 읽고 쓸 수 있지만 기본적으로 Apache HTTP Server에서 사용하기 위한 httpd_sys_content_t 유형으로 레이블이 지정된 파일에 액세스할 수 없습니다. 홈 디렉터리 및 NFS 볼륨을 Samba를 통해 내보내고 Samba가 도메인 컨트롤러 역할을 허용하는 등의 특정 동작을 허용하려면 부울을 활성화해야 합니다.

14.2. 유형

고급 프로세스 격리를 제공하기 위해 SELinux 대상 정책에 사용되는 기본 권한 제어 방법은 Type Enforcement입니다. 모든 파일과 프로세스는 유형으로 레이블이 지정됩니다. type은 프로세스의 SELinux 도메인과 파일의 SELinux 유형을 정의합니다. SELinux 정책 규칙은 유형에 액세스하는 도메인이든 다른 도메인에 액세스하는 도메인이든 관계없이 유형이 서로 액세스하는 방법을 정의합니다. 액세스는 허용하는 특정 SELinux 정책 규칙이 있는 경우에만 허용됩니다.
Samba가 공유할 수 있도록 samba_share_t 유형으로 파일에 레이블을 지정합니다. 생성한 파일에만 레이블을 지정하고 samba_share_t 유형으로 시스템 파일의 레이블을 다시 지정하지 않습니다. 이러한 파일과 디렉토리를 공유하기 위해 부울을 활성화할 수 있습니다. SELinux를 사용하면 /etc/samba/smb.conf 파일과 Linux 권한이 적절하게 설정된 경우 Samba가 samba_share_t 유형으로 레이블이 지정된 파일에 쓸 수 있습니다.
samba_etc_t 유형은 smb.conf 와 같은 /etc/samba/ 디렉터리의 특정 파일에 사용됩니다. samba_etc_t 유형으로 파일에 레이블을 수동으로 지정하지 마십시오. 이 디렉터리의 파일에 올바르게 레이블이 지정되지 않은 경우 root 사용자로 restorecon -R -v /etc/samba 명령을 입력하여 해당 파일을 기본 컨텍스트로 복원합니다. /etc/samba/smb.confsamba_etc_t 유형으로 레이블이 지정되지 않은 경우 Samba 서비스를 시작하는 데 실패하고 SELinux 거부 메시지가 기록될 수 있습니다. 다음은 /etc/samba/smb.confhttpd_sys_content_t 유형으로 레이블이 지정된 경우 거부 메시지의 예입니다.
setroubleshoot: SELinux is preventing smbd (smbd_t) "read" to ./smb.conf (httpd_sys_content_t). For complete SELinux messages. run sealert -l deb33473-1069-482b-bb50-e4cd05ab18af
Copy to Clipboard Toggle word wrap

14.3. 부울

SELinux는 서비스를 실행하는 데 필요한 최소 액세스 수준을 기반으로 합니다. 서비스는 다양한 방법으로 실행할 수 있으므로 서비스 실행 방법을 지정해야 합니다. 다음 부울을 사용하여 SELinux를 설정합니다.
smbd_anon_write
이 부울을 활성화하면 smbd 가 특별한 액세스 제한이 없는 공통 파일을 위해 예약된 영역과 같은 공용 디렉터리에 쓸 수 있습니다.
samba_create_home_dirs
이 부울을 활성화하면 Samba가 새로운 홈 디렉토리를 독립적으로 만들 수 있습니다. 대체로 이 작업은 PAM과 같은 메커니즘에 의해 수행됩니다.
samba_domain_controller
이 부울을 사용하면 Samba가 도메인 컨트롤러 역할을 하고 useradd,groupadd, passwd 와 같은 관련 명령을 실행할 수 있는 권한을 부여할 수 있습니다.
samba_enable_home_dirs
이 부울을 활성화하면 Samba가 사용자의 홈 디렉토리를 공유할 수 있습니다.
samba_export_all_ro
파일 또는 디렉터리를 내보내 읽기 전용 권한을 허용합니다. 이렇게 하면 samba_share_t 유형으로 레이블이 지정되지 않은 파일과 디렉터리를 Samba를 통해 공유할 수 있습니다. samba_export_all_ro 부울이 활성화되었지만 samba_export_all_rw 부울이 비활성화되면 /etc/samba/smb.conf 에 쓰기 액세스 권한이 구성되어 있어도 Samba 공유에 대한 쓰기 액세스 권한이 거부됩니다.
samba_export_all_rw
파일 또는 디렉터리를 내보내 읽기 및 쓰기 권한을 허용합니다. 이렇게 하면 samba_share_t 유형으로 레이블이 지정되지 않은 파일과 디렉터리를 Samba를 통해 내보낼 수 있습니다. /etc/samba/smb.conf 및 Linux 권한의 권한은 쓰기 액세스를 허용하도록 구성해야 합니다.
samba_run_unconfined
이 부울을 활성화하면 Samba는 /var/lib/samba/scripts/ 디렉터리에서 제한되지 않은 스크립트를 실행할 수 있습니다.
samba_share_fusefs
Samba가 fusefs 파일 시스템을 공유하려면 이 부울을 활성화해야 합니다.
samba_share_nfs
이 부울을 비활성화하면 smbd 가 Samba를 통해 NFS 공유에 완전히 액세스할 수 없습니다. 이 부울을 활성화하면 Samba가 NFS 볼륨을 공유할 수 있습니다.
use_samba_home_dirs
Samba 홈 디렉토리에 원격 서버를 사용하도록 이 부울을 활성화합니다.
virt_use_samba
CIFS 파일에 대한 가상 머신 액세스를 허용합니다.
참고
SELinux 정책의 지속적인 개발로 인해 위의 목록에 항상 서비스와 관련된 부울이 모두 포함되지 않을 수 있습니다. 나열하려면 다음 명령을 입력합니다.
~]$ getsebool -a | grep service_name
Copy to Clipboard Toggle word wrap
특정 부울에 대한 설명을 보려면 다음 명령을 입력합니다.
~]$ sepolicy booleans -b boolean_name
Copy to Clipboard Toggle word wrap
이 명령이 작동하려면 sepolicy 유틸리티를 제공하는 추가 policycoreutils-devel 패키지가 필요합니다.

14.4. 설정 예

다음 예제에서는 SELinux가 Samba 서버를 보완하는 방법과 Samba 서버의 전체 기능을 관리하는 방법을 보여주는 실제 데모를 제공합니다.

14.4.1. 생성한 디렉토리를 공유

다음 예제에서는 새 디렉터리를 만들고 Samba를 통해 해당 디렉터리를 공유합니다.
  1. samba, samba -common, samba-client 패키지가 설치되어 있는지 확인합니다.
    ~]$ rpm -q samba samba-common samba-client
    package samba is not installed
    package samba-common is not installed
    package samba-client is not installed
    
    Copy to Clipboard Toggle word wrap
    이러한 패키지가 설치되지 않은 경우 yum 유틸리티를 root로 사용하여 설치합니다.
    ~]# yum install package-name
    Copy to Clipboard Toggle word wrap
  2. root로 Cryo stat 유틸리티를 사용하여 Samba를 통해 파일을 공유할 새 최상위 디렉토리를 만듭니다.
    ~]# mkdir /myshare
    Copy to Clipboard Toggle word wrap
  3. touch 유틸리티 root를 사용하여 빈 파일을 생성합니다. 이 파일은 나중에 Samba 공유가 올바르게 마운트되었는지 확인하는 데 사용됩니다.
    ~]# touch /myshare/file1
    Copy to Clipboard Toggle word wrap
  4. SELinux를 사용하면 /etc/samba/smb.conf 파일 및 Linux 권한이 적절하게 설정된 경우 Samba가 samba_share_t 유형으로 레이블이 지정된 파일을 읽고 쓸 수 있습니다. root로 다음 명령을 입력하여 레이블 변경 사항을 파일 컨텍스트 구성에 추가합니다.
    ~]# semanage fcontext -a -t samba_share_t "/myshare(/.*)?"
    Copy to Clipboard Toggle word wrap
  5. restorecon 유틸리티를 root로 사용하여 레이블 변경 사항을 적용합니다.
    ~]# restorecon -R -v /myshare
    restorecon reset /myshare context unconfined_u:object_r:default_t:s0->system_u:object_r:samba_share_t:s0
    restorecon reset /myshare/file1 context unconfined_u:object_r:default_t:s0->system_u:object_r:samba_share_t:s0
    
    Copy to Clipboard Toggle word wrap
  6. /etc/samba/smb.conf 를 root로 편집합니다. 이 파일 하단에 다음을 추가하여 Samba를 통해 /myshare/ 디렉터리를 공유합니다.
    [myshare]
    comment = My share
    path = /myshare
    public = yes
    writable = no
    
    Copy to Clipboard Toggle word wrap
  7. Samba 파일 시스템을 마운트하려면 Samba 계정이 필요합니다. root로 다음 명령을 입력하여 Samba 계정을 만듭니다. 여기서 username 은 기존 Linux 사용자입니다. 예를 들어 smbpasswd -a testuser 는 Linux testuser 사용자에 대한 Samba 계정을 생성합니다.
    ~]# smbpasswd -a testuser
    New SMB password: Enter a password
    Retype new SMB password: Enter the same password again
    Added user testuser.
    
    Copy to Clipboard Toggle word wrap
    위 명령을 입력하면 시스템에 존재하지 않는 계정의 사용자 이름을 지정하면 '사용자 이름 '! 오류에 대한 Unix 계정을찾을수 없습니다.
  8. Samba 서비스를 시작합니다.
    ~]# systemctl start smb.service
    Copy to Clipboard Toggle word wrap
  9. 다음 명령을 입력하여 사용 가능한 공유를 나열합니다. 여기서 username 은 7단계에 추가된 Samba 계정입니다. 암호를 입력하라는 메시지가 표시되면 7단계에서 Samba 계정에 할당된 암호를 입력합니다(버전 번호는 다를 수 있음).
    ~]$ smbclient -U username -L localhost
    Enter username's password:
    Domain=[HOSTNAME] OS=[Unix] Server=[Samba 3.4.0-0.41.el6]
    
    Sharename       Type      Comment
    ---------       ----      -------
    myshare         Disk      My share
    IPC$            IPC       IPC Service (Samba Server Version 3.4.0-0.41.el6)
    username        Disk      Home Directories
    Domain=[HOSTNAME] OS=[Unix] Server=[Samba 3.4.0-0.41.el6]
    
    Server               Comment
    ---------            -------
    
    Workgroup            Master
    ---------            -------
    
    Copy to Clipboard Toggle word wrap
  10. root로 Cryo stat 유틸리티를 사용하여 새 디렉터리를 만듭니다. 이 디렉터리는 myshare Samba 공유를 마운트하는 데 사용됩니다.
    ~]# mkdir /test/
    Copy to Clipboard Toggle word wrap
  11. root로 다음 명령을 입력하여 myshare Samba 공유를 /test/ 에 마운트하고 사용자 이름을 단계 7의 사용자 이름으로 교체합니다.
    ~]# mount //localhost/myshare /test/ -o user=username
    Copy to Clipboard Toggle word wrap
    7단계에 구성된 사용자 이름의 암호를 입력합니다.
  12. 다음 명령을 입력하여 3단계에서 만든 file1 파일을 봅니다.
    ~]$ ls /test/
    file1
    
    Copy to Clipboard Toggle word wrap

14.4.2. 웹 사이트 공유

예를 들어 /var/www/html/ 디렉터리의 웹 사이트를 공유하려는 경우와 같이 samba_share_t 유형으로 파일에 레이블을 지정할 수 없습니다. 이러한 경우 samba_export_all_ro 부울을 사용하여 파일 또는 디렉터리(현재 레이블 없이)를 사용하여 읽기 전용 권한만 허용하거나 samba_export_all_rw 부울이 파일 또는 디렉터리(현재 레이블 제외)를 공유하도록 허용하여 읽기 및 쓰기 권한을 허용합니다.
다음 예제에서는 /var/www/html/ 에 웹 사이트에 대한 파일을 생성한 다음 Samba를 통해 해당 파일을 공유하여 읽기 및 쓰기 권한을 허용합니다. 이 예제에서는 httpd,samba,samba-common,samba-clientwget 패키지가 설치되어 있다고 가정합니다.
  1. root 사용자로 /var/www/html/file1.html 파일을 만듭니다. 다음 콘텐츠를 복사하여 이 파일에 붙여넣습니다.
    <html>
    <h2>File being shared through the Apache HTTP Server and Samba.</h2>
    </html>
    
    Copy to Clipboard Toggle word wrap
  2. 다음 명령을 입력하여 file1.html 의 SELinux 컨텍스트를 확인합니다.
    ~]$ ls -Z /var/www/html/file1.html
    -rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/file1.html
    
    Copy to Clipboard Toggle word wrap
    이 파일은 httpd_sys_content_t 로 레이블이 지정됩니다. 기본적으로 Apache HTTP 서버는 이 유형에 액세스할 수 있지만 Samba는 이 유형에 액세스할 수 없습니다.
  3. Apache HTTP 서버를 시작합니다.
    ~]# systemctl start httpd.service
    Copy to Clipboard Toggle word wrap
  4. 사용자가 에 대한 쓰기 액세스 권한이 있는 디렉터리로 변경하고 다음 명령을 입력합니다. 기본 구성을 변경하지 않는 한 이 명령은 성공합니다.
    ~]$ wget http://localhost/file1.html
    Resolving localhost... 127.0.0.1
    Connecting to localhost|127.0.0.1|:80... connected.
    HTTP request sent, awaiting response... 200 OK
    Length: 84 [text/html]
    Saving to: `file1.html.1'
    
    100%[=======================>] 84          --.-K/s   in 0s      
    
    `file1.html.1' saved [84/84]
    
    Copy to Clipboard Toggle word wrap
  5. /etc/samba/smb.conf 를 root로 편집합니다. 이 파일 하단에 다음을 추가하여 Samba를 통해 /var/www/html/ 디렉터리를 공유합니다.
    [website]
    comment = Sharing a website
    path = /var/www/html/
    public = no
    writable = no
    
    Copy to Clipboard Toggle word wrap
  6. /var/www/html/ 디렉터리는 httpd_sys_content_t 유형으로 레이블이 지정됩니다. 기본적으로 Samba는 Linux 권한이 허용하더라도 이 유형으로 레이블이 지정된 파일과 디렉터리에 액세스할 수 없습니다. Samba 액세스를 허용하려면 samba_export_all_ro 부울을 활성화합니다.
    ~]# setsebool -P samba_export_all_ro on
    Copy to Clipboard Toggle word wrap
    재부팅 시 변경 사항이 유지되지 않도록 하려면 -P 옵션을 사용하지 마십시오. samba_export_all_ro 부울을 활성화하면 Samba가 모든 유형에 액세스할 수 있습니다.
  7. Samba 서비스를 시작합니다.
    ~]# systemctl start smb.service
    Copy to Clipboard Toggle word wrap

15장. 파일 전송 프로토콜

FTP(파일 전송 프로토콜)는 오늘날 인터넷에서 발견된 가장 오래되고 가장 일반적으로 사용되는 프로토콜 중 하나입니다. 그 목적은 사용자가 원격 호스트에 직접 로그인하거나 원격 시스템을 사용하는 방법에 대한 지식이 없어도 네트워크에서 컴퓨터 호스트 간에 파일을 안정적으로 전송하는 것입니다. 이를 통해 사용자는 간단한 표준 명령 세트를 사용하여 원격 시스템의 파일에 액세스할 수 있습니다.
Very Secure FTP Daemon (vsftpd)은 처음부터 빠르고 안정적이며 가장 중요한 것으로 안전하게 설계되었습니다. 많은 수의 연결을 효율적이고 안전하게 처리할 수 있는 기능은 vsftpd 가 Red Hat Enterprise Linux를 통해 배포된 유일한 독립 실행형 FTP인 이유입니다.
Red Hat Enterprise Linux에서 vsftpd 패키지는 Very Secure FTP 데몬을 제공합니다. 다음 명령을 입력하여 vsftpd 가 설치되어 있는지 확인합니다.
~]$ rpm -q vsftpd
package vsftpd is not installed
Copy to Clipboard Toggle word wrap
FTP 서버를 사용하고 vsftpd 패키지가 설치되지 않은 경우 yum 유틸리티를 root 사용자로 사용하여 설치합니다.
~]# yum install vsftpd
Copy to Clipboard Toggle word wrap

15.1. 유형

고급 프로세스 격리를 제공하기 위해 SELinux 대상 정책에 사용되는 기본 권한 제어 방법은 Type Enforcement입니다. 모든 파일과 프로세스는 유형으로 레이블이 지정됩니다. type은 프로세스의 SELinux 도메인과 파일의 SELinux 유형을 정의합니다. SELinux 정책 규칙은 유형에 액세스하는 도메인이든 다른 도메인에 액세스하는 도메인이든 관계없이 유형이 서로 액세스하는 방법을 정의합니다. 액세스는 허용하는 특정 SELinux 정책 규칙이 있는 경우에만 허용됩니다.
기본적으로 익명 사용자는 FTP를 사용하여 로그인할 때 /var/ftp/ 디렉토리의 파일에 대한 읽기 액세스 권한을 갖습니다. 이 디렉터리는 public_content_t 유형으로 레이블이 지정되어 쓰기 액세스가 /etc/vsftpd/vsftpd.conf 에 구성된 경우에도 읽기 액세스만 허용합니다. public_content_t 유형은 Apache HTTP Server, Samba, NFS와 같은 다른 서비스에 액세스할 수 있습니다.
다음 유형 중 하나를 사용하여 FTP를 통해 파일을 공유합니다.
public_content_t
public_content_t 유형으로 생성한 레이블 파일 및 디렉터리에 vsftpd 를 통해 읽기 전용으로 공유할 수 있습니다. Apache HTTP Server, Samba, NFS 등의 기타 서비스도 이 유형으로 레이블이 지정된 파일에 액세스할 수 있습니다. Linux 권한이 쓰기 액세스를 허용하는 경우에도 public_content_t 유형으로 레이블이 지정된 파일은 에 쓸 수 없습니다. 쓰기 액세스 권한이 필요한 경우 public_content_rw_t 유형을 사용합니다.
public_content_rw_t
public_content_rw_t 유형으로 생성한 파일 및 디렉터리에 레이블을 지정하여 vsftpd 를 통해 읽기 및 쓰기 권한으로 공유합니다. Apache HTTP Server, Samba, NFS 등의 기타 서비스도 이 유형으로 레이블이 지정된 파일에 액세스할 수 있습니다. 각 서비스에 대한 부울은 이 유형으로 레이블이 지정된 파일에 쓰기 전에 활성화해야 합니다.

15.2. 부울

SELinux는 서비스를 실행하는 데 필요한 최소 액세스 수준을 기반으로 합니다. 서비스는 다양한 방법으로 실행할 수 있으므로 서비스 실행 방법을 지정해야 합니다. 다음 부울을 사용하여 SELinux를 설정합니다.
ftpd_anon_write
비활성화되면 이 부울을 사용하면 vsftpdpublic_content_rw_t 유형으로 레이블이 지정된 파일 및 디렉터리에 기록되지 않습니다. 사용자가 FTP를 사용하여 파일을 업로드할 수 있도록 이 부울을 활성화합니다. 파일이 업로드되는 디렉터리는 public_content_rw_t 유형으로 레이블이 지정되어야 하며 Linux 권한을 적절하게 설정해야 합니다.
ftpd_full_access
이 부울이 활성화되면 Linux(DAC) 권한만 사용하여 액세스를 제어하며 인증된 사용자는 public_content_t 또는 public_content_rw_t 유형으로 레이블이 지정되지 않은 파일에 대해 읽고 쓸 수 있습니다.
ftpd_use_cifs
이 부울을 활성화하면 vsftpd 에서 cifs_t 유형으로 레이블이 지정된 파일 및 디렉터리에 액세스할 수 있으므로 이 부울을 사용하면 vsftpd 를 통해 Samba를 사용하여 마운트된 파일 시스템을 공유할 수 있습니다.
ftpd_use_nfs
이 부울을 활성화하면 vsftpd 에서 nfs_t 유형으로 레이블이 지정된 파일 및 디렉터리에 액세스할 수 있으므로 이 부울을 사용하면 vsftpd 를 통해 NFS를 사용하여 마운트된 파일 시스템을 공유할 수 있습니다.
ftpd_connect_db
FTP 데몬이 데이터베이스에 대한 연결을 시작할 수 있도록 허용합니다.
httpd_enable_ftp_server
httpd 데몬이 FTP 포트에서 수신하고 FTP 서버로 작동하도록 허용합니다.
tftp_anon_write
이 부울을 활성화하면 특수한 액세스 제한이 없는 공통 파일용으로 예약된 영역과 같은 공용 디렉터리에 TFTP 액세스가 허용됩니다.
중요
Red Hat Enterprise Linux 7.7은 ftp_home_dir 부울을 제공하지 않습니다. 자세한 내용은 Red Hat Enterprise Linux 7.3 릴리스 노트 문서를 참조하십시오.
참고
SELinux 정책의 지속적인 개발로 인해 위의 목록에 항상 서비스와 관련된 부울이 모두 포함되지 않을 수 있습니다. 나열하려면 다음 명령을 입력합니다.
~]$ getsebool -a | grep service_name
Copy to Clipboard Toggle word wrap
특정 부울에 대한 설명을 보려면 다음 명령을 입력합니다.
~]$ sepolicy booleans -b boolean_name
Copy to Clipboard Toggle word wrap
이 명령이 작동하려면 sepolicy 유틸리티를 제공하는 추가 policycoreutils-devel 패키지가 필요합니다.

16장. 네트워크 파일 시스템

NFS(네트워크 파일 시스템)를 사용하면 원격 호스트가 네트워크를 통해 파일 시스템을 마운트하고 로컬로 마운트된 파일 시스템과 상호 작용할 수 있습니다. 이를 통해 시스템 관리자는 네트워크의 중앙 집중식 서버에 리소스를 통합할 수 있습니다.[16]
Red Hat Enterprise Linux에서는 전체 NFS 지원에 nfs-utils 패키지가 필요합니다. 다음 명령을 입력하여 nfs-utils 가 설치되었는지 확인합니다.
~]$ rpm -q nfs-utils
package nfs-utils is not installed
Copy to Clipboard Toggle word wrap
설치되지 않고 NFS를 사용하려면 yum 유틸리티를 root로 사용하여 설치합니다.
~]# yum install nfs-utils
Copy to Clipboard Toggle word wrap

16.1. NFS 및 SELinux

SELinux를 실행할 때 제한되지 않은 kernel_t 도메인 유형으로 레이블이 지정된 nfsd 프로세스를 제외하고 NFS 데몬은 기본적으로 제한됩니다. SELinux 정책을 사용하면 기본적으로 NFS가 파일을 공유할 수 있습니다. 또한 클라이언트와 서버 간에 SELinux 레이블을 전달하여 NFS 볼륨에 액세스하는 제한된 도메인의 보안 제어를 강화할 수 있습니다. 예를 들어, 홈 디렉터리가 NFS 볼륨에 설정된 경우 볼륨의 다른 디렉터리가 아닌 홈 디렉터리에만 액세스할 수 있는 제한된 도메인을 지정할 수 있습니다. 마찬가지로 Secure Virtualization과 같은 애플리케이션에서는 NFS 볼륨에 이미지 파일의 레이블을 설정하여 가상 머신의 분리 수준을 높일 수 있습니다.
레이블이 지정된 NFS에 대한 지원은 기본적으로 비활성화되어 있습니다. 활성화하려면 16.4.1절. “SELinux 레이블이 지정된 NFS 지원 활성화” 을 참조하십시오.

16.2. 유형

고급 프로세스 격리를 제공하기 위해 SELinux 대상 정책에 사용되는 기본 권한 제어 방법은 Type Enforcement입니다. 모든 파일과 프로세스는 유형으로 레이블이 지정됩니다. type은 프로세스의 SELinux 도메인과 파일의 SELinux 유형을 정의합니다. SELinux 정책 규칙은 유형에 액세스하는 도메인이든 다른 도메인에 액세스하는 도메인이든 관계없이 유형이 서로 액세스하는 방법을 정의합니다. 액세스는 허용하는 특정 SELinux 정책 규칙이 있는 경우에만 허용됩니다.
기본적으로 클라이언트쪽에 마운트된 NFS 볼륨은 NFS의 정책에서 정의한 기본 컨텍스트로 레이블이 지정됩니다. 일반적인 정책에서 이 기본 컨텍스트는 nfs_t 유형을 사용합니다. root 사용자는 mount -context 옵션을 사용하여 기본 유형을 재정의할 수 있습니다. 다음 유형은 NFS와 함께 사용됩니다. 다양한 유형을 사용하여 유연한 액세스를 구성할 수 있습니다.
var_lib_nfs_t
이 유형은 /var/lib/nfs/ 디렉터리에 복사되거나 생성된 기존 및 새 파일에 사용됩니다. 이 유형은 정상적인 작업에서 변경할 필요가 없습니다. 기본 설정에 대한 변경 사항을 복원하려면 root 사용자로 restorecon -R -v /var/lib/nfs 명령을 실행합니다.
nfsd_exec_t
/usr/sbin/rpc.nfsd 파일은 NFS와 관련된 기타 시스템 실행 파일 및 라이브러리와 마찬가지로 nfsd_exec_t 로 레이블이 지정됩니다. 사용자는 이 유형의 파일에 레이블을 지정하지 않아야 합니다. nfsd_exec_tnfsd_t 로 전환됩니다.

16.3. 부울

SELinux는 서비스를 실행하는 데 필요한 최소 액세스 수준을 기반으로 합니다. 서비스는 다양한 방법으로 실행할 수 있으므로 서비스 실행 방법을 지정해야 합니다. 다음 부울을 사용하여 SELinux를 설정합니다.
ftpd_use_nfs
활성화하면 이 부울을 사용하면 ftpd 데몬이 NFS 볼륨에 액세스할 수 있습니다.
cobbler_use_nfs
활성화하면 이 부울을 사용하면 cobblerd 데몬이 NFS 볼륨에 액세스할 수 있습니다.
git_system_use_nfs
이 부울을 활성화하면 Git 시스템 데몬이 NFS 볼륨의 시스템 공유 리포지토리를 읽을 수 있습니다.
httpd_use_nfs
활성화하면 이 부울을 사용하면 httpd 데몬이 NFS 볼륨에 저장된 파일에 액세스할 수 있습니다.
samba_share_nfs
활성화하면 이 부울을 사용하면 smbd 데몬이 NFS 볼륨을 공유할 수 있습니다. 비활성화되면 이 부울은 smbd 가 Samba를 사용하여 NFS 공유에 대한 전체 액세스 권한을 허용하지 않습니다.
sanlock_use_nfs
활성화하면 이 부울을 사용하면 sanlock 데몬이 NFS 볼륨을 관리할 수 있습니다.
sge_use_nfs
활성화하면 이 부울을 사용하면 sge 스케줄러가 NFS 볼륨에 액세스할 수 있습니다.
use_nfs_home_dirs
이 부울을 활성화하면 NFS 홈 디렉토리에 대한 지원이 추가됩니다.
virt_use_nfs
이 부울을 사용하면 가상 게스트가 NFS 볼륨의 파일을 관리할 수 있습니다.
xen_use_nfs
활성화하면 이 부울을 사용하면 Cryo stat 가 NFS 볼륨의 파일을 관리할 수 있습니다.
git_cgi_use_nfs
이 부울을 활성화하면CGI(Git Common Gateway Interface)가 NFS 볼륨에 액세스할 수 있습니다.
참고
SELinux 정책의 지속적인 개발로 인해 위의 목록에 항상 서비스와 관련된 부울이 모두 포함되지 않을 수 있습니다. 나열하려면 다음 명령을 입력합니다.
~]$ getsebool -a | grep service_name
Copy to Clipboard Toggle word wrap
특정 부울에 대한 설명을 보려면 다음 명령을 입력합니다.
~]$ sepolicy booleans -b boolean_name
Copy to Clipboard Toggle word wrap
이 명령이 작동하려면 sepolicy 유틸리티를 제공하는 추가 policycoreutils-devel 패키지가 필요합니다.

16.4. 설정 예

16.4.1. SELinux 레이블이 지정된 NFS 지원 활성화

다음 예제에서는 SELinux 레이블이 지정된 NFS 지원을 활성화하는 방법을 보여줍니다. 이 예제에서는 nfs-utils 패키지가 설치되어 있고, SELinux 대상 정책이 사용되며 SELinux가 강제 모드로 실행 중이라고 가정합니다.
참고
1~3단계는 NFS 서버 nfs-srv 에서 수행해야 합니다.
  1. NFS 서버가 실행 중인 경우 중지하십시오.
    [nfs-srv]# systemctl stop nfs
    Copy to Clipboard Toggle word wrap
    서버가 중지되었는지 확인합니다.
    [nfs-srv]# systemctl status nfs
    nfs-server.service - NFS Server
       Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; disabled)
       Active: inactive (dead)
    
    Copy to Clipboard Toggle word wrap
  2. /etc/sysconfig/nfs 파일을 편집하여 RPCNFSDARGS 플래그를 "-V 4.2" 로 설정합니다.
    # Optional arguments passed to rpc.nfsd. See rpc.nfsd(8)
    RPCNFSDARGS="-V 4.2"
    Copy to Clipboard Toggle word wrap
  3. 서버를 다시 시작하고 실행 중인지 확인합니다. 출력에는 아래의 정보가 포함되어 있으며 타임스탬프만 다릅니다.
    [nfs-srv]# systemctl start nfs
    Copy to Clipboard Toggle word wrap
    [nfs-srv]# systemctl status nfs
    nfs-server.service - NFS Server
       Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; disabled)
       Active: active (exited) since Wed 2013-08-28 14:07:11 CEST; 4s ago
    
    Copy to Clipboard Toggle word wrap
  4. 클라이언트쪽에서 NFS 서버를 마운트합니다.
    [nfs-client]# mount -o v4.2 server:mntpoint localmountpoint
    Copy to Clipboard Toggle word wrap
  5. 이제 모든 SELinux 레이블이 서버에서 클라이언트로 성공적으로 전달됩니다.
    [nfs-srv]$ ls -Z file
    -rw-rw-r--. user user unconfined_u:object_r:svirt_image_t:s0 file
    [nfs-client]$ ls -Z file
    -rw-rw-r--. user user unconfined_u:object_r:svirt_image_t:s0 file
    Copy to Clipboard Toggle word wrap
참고
홈 디렉토리 또는 기타 콘텐츠에 대해 레이블이 지정된 NFS 지원을 활성화하면 해당 콘텐츠에 EXT 파일 시스템에 있던 것과 동일한 레이블이 지정됩니다. 또한 다양한 버전의 NFS로 시스템을 마운트하거나 레이블이 지정된 NFS를 지원하지 않는 서버를 마운트하려고 하면 오류가 반환될 수 있습니다.


[16] 자세한 내용은 스토리지 관리 가이드NFS(네트워크 파일 시스템) 장을 참조하십시오.

17장. 영국 인터넷 이름 도메인

BIND에서는 이름이 지정된 데몬을 사용하여 이름 확인 서비스를 수행합니다. BIND를 사용하면 숫자 주소가 아니라 이름별로 컴퓨터 리소스 및 서비스를 찾을 수 있습니다.
Red Hat Enterprise Linux에서 bind 패키지는 DNS 서버를 제공합니다. 다음 명령을 입력하여 bind 패키지가 설치되어 있는지 확인합니다.
~]$ rpm -q bind
package bind is not installed
Copy to Clipboard Toggle word wrap
설치되지 않은 경우 yum 유틸리티를 root 사용자로 사용하여 설치합니다.
~]# yum install bind
Copy to Clipboard Toggle word wrap

17.1. BIND 및 SELinux

/var/named/slaves/, /var/named/dynamic//var/named/data/ 디렉토리에 대한 기본 권한을 사용하면 영역 전송 및 동적 DNS 업데이트를 사용하여 영역 파일을 업데이트할 수 있습니다. /var/named/ 의 파일은 마스터 영역 파일에 사용되는 named_zone_t 유형으로 레이블이 지정됩니다.
슬레이브 서버의 경우 /etc/named.conf 파일을 구성하여 /var/named/slaves/ 에 슬레이브 영역을 배치합니다. 다음은 testdomain.com 의 영역 파일을 /var/named/slaves/ 에 저장하는 슬레이브 DNS 서버의 /etc/named.conf 에 있는 도메인 항목의 예입니다.
zone "testdomain.com" {
			type slave;
			masters { IP-address; };
			file "/var/named/slaves/db.testdomain.com";
		       };
Copy to Clipboard Toggle word wrap
영역 파일의 레이블이 지정된 경우 영역 전송 및 동적 DNS가 영역 파일을 업데이트할 수 있도록 named_write_master_zones 부울을 활성화해야 합니다. 또한 이름이 지정된 사용자 또는 그룹이 읽기, 쓰기 및 실행 권한을 허용하도록 상위 디렉터리의 모드를 변경해야 합니다.
/var/named/ 의 영역 파일에 named_cache_t 유형으로 레이블이 지정되면 파일 시스템 재레이블 또는 restorecon -R /var/ 을 실행하면 해당 유형이 named_zone_t 로 변경됩니다.

17.2. 유형

고급 프로세스 격리를 제공하기 위해 SELinux 대상 정책에 사용되는 기본 권한 제어 방법은 Type Enforcement입니다. 모든 파일과 프로세스는 유형으로 레이블이 지정됩니다. type은 프로세스의 SELinux 도메인과 파일의 SELinux 유형을 정의합니다. SELinux 정책 규칙은 유형에 액세스하는 도메인이든 다른 도메인에 액세스하는 도메인이든 관계없이 유형이 서로 액세스하는 방법을 정의합니다. 액세스는 허용하는 특정 SELinux 정책 규칙이 있는 경우에만 허용됩니다.
다음 유형은 BIND와 함께 사용됩니다. 다양한 유형을 사용하여 유연한 액세스를 구성할 수 있습니다.
named_zone_t
마스터 영역 파일에 사용됩니다. 다른 서비스는 이 유형의 파일을 수정할 수 없습니다. named _write_master_zones 부울이 활성화된 경우에만 이 유형의 파일만 수정할 수 있습니다.
named_cache_t
기본적으로 named 는 추가 부울을 설정하지 않고 이 유형으로 레이블이 지정된 파일에 쓸 수 있습니다. /var/named/slaves/,/var/named/dynamic//var/named/data/ 디렉터리에 복사되거나 생성된 파일은 자동으로 named_cache_t 유형으로 레이블이 지정됩니다.
named_var_run_t
/var/run/bind/, /var/run/named/, /var/run/unbound/ 디렉터리에 복사되거나 생성된 파일은 이름이_var_run_t 유형으로 자동으로 레이블이 지정됩니다.
named_conf_t
일반적으로 /etc 디렉터리에 저장된 BIND 관련 구성 파일은 named_conf_t 유형으로 레이블이 자동으로 지정됩니다.
named_exec_t
일반적으로 /usr/sbin/ 디렉터리에 저장된 BIND 관련 실행 파일은 named_exec_t 유형으로 레이블이 자동으로 지정됩니다.
named_log_t
일반적으로 /var/log/ 디렉터리에 저장된 BIND 관련 로그 파일은 named_log_t 유형으로 레이블이 자동으로 지정됩니다.
named_unit_file_t
/usr/lib/systemd/system/ 디렉터리의 실행 가능한 BIND 관련 파일은 named_unit_file_t 유형으로 자동으로 레이블이 지정됩니다.

17.3. 부울

SELinux는 서비스를 실행하는 데 필요한 최소 액세스 수준을 기반으로 합니다. 서비스는 다양한 방법으로 실행할 수 있으므로 서비스 실행 방법을 지정해야 합니다. 다음 부울을 사용하여 SELinux를 설정합니다.
named_write_master_zones
비활성화하면 이 부울에서 named _zone_t 유형으로 레이블이 지정된 영역 파일 또는 디렉터리에 쓸 수 없습니다. 데몬은 일반적으로 영역 파일에 쓸 필요가 없지만 이 부울이 필요한 경우 또는 보조 서버가 영역 파일에 작성해야 하는 경우 이 부울을 활성화하여 이 작업을 허용합니다.
named_tcp_bind_http_port
이 부울을 활성화하면 BIND에서 Apache 포트를 바인딩할 수 있습니다.
참고
SELinux 정책의 지속적인 개발로 인해 위의 목록에 항상 서비스와 관련된 부울이 모두 포함되지 않을 수 있습니다. 나열하려면 다음 명령을 입력합니다.
~]$ getsebool -a | grep service_name
Copy to Clipboard Toggle word wrap
특정 부울에 대한 설명을 보려면 다음 명령을 입력합니다.
~]$ sepolicy booleans -b boolean_name
Copy to Clipboard Toggle word wrap
이 명령이 작동하려면 sepolicy 유틸리티를 제공하는 추가 policycoreutils-devel 패키지가 필요합니다.

17.4. 설정 예

17.4.1. 동적 DNS

BIND를 사용하면 호스트가 DNS 및 영역 파일에서 레코드를 동적으로 업데이트할 수 있습니다. 이는 호스트 컴퓨터의 IP 주소가 자주 변경되고 DNS 레코드에 실시간 수정이 필요한 경우에 사용됩니다.
동적 DNS에서 업데이트할 영역 파일에는 /var/named/dynamic/ 디렉터리를 사용합니다. 이 디렉토리에 생성되거나 복사된 파일은 named 가 해당 디렉토리에 쓸 수 있는 Linux 권한을 상속합니다. 이러한 파일은 named_cache_t 유형으로 레이블이 지정되므로 SELinux는 named 에서 해당 파일에 쓸 수 있도록 허용합니다.
/var/named/dynamic/ 의 영역 파일에 named_zone_t 유형으로 레이블이 지정되면 동적 DNS 업데이트가 병합되기 전에 저널에 기록해야 하므로 일정 기간 동안 성공하지 못할 수 있습니다. 저널이 병합하려고 할 때 named_zone_t 유형으로 영역 파일에 레이블이 지정되면 다음과 같은 오류가 기록됩니다.
named[PID]: dumping master file: rename: /var/named/dynamic/zone-name: permission denied
Copy to Clipboard Toggle word wrap
또한 다음 SELinux 거부 메시지가 기록됩니다.
setroubleshoot: SELinux is preventing named (named_t) "unlink" to zone-name (named_zone_t)
Copy to Clipboard Toggle word wrap
이 레이블 지정 문제를 해결하려면 restorecon 유틸리티를 root로 사용합니다.
~]# restorecon -R -v /var/named/dynamic
Copy to Clipboard Toggle word wrap

18장. 동시 버전 관리 시스템

CVS(Concurrent Versioning System)는 무료 개정 제어 시스템입니다. 이 명령은 일반적으로 여러 사용자가 액세스하는 중앙 파일 집합에 대한 수정 사항을 모니터링하고 추적하는 데 사용됩니다. 프로그래머는 일반적으로 소스 코드 리포지토리를 관리하는 데 사용되며 오픈 소스 개발자가 널리 사용합니다.
Red Hat Enterprise Linux에서 cvs 패키지는 CVS를 제공합니다. 다음 명령을 입력하여 cvs 패키지가 설치되어 있는지 확인합니다.
~]$ rpm -q cvs
package cvs is not installed
Copy to Clipboard Toggle word wrap
설치되지 않고 CVS를 사용하려면 yum 유틸리티를 root로 사용하여 설치합니다.
~]# yum install cvs
Copy to Clipboard Toggle word wrap

18.1. CVS 및 SELinux

cvs 데몬은 cvs_t 유형으로 레이블이 지정됩니다. 기본적으로 Red Hat Enterprise Linux에서 CVS는 특정 디렉토리를 읽고 쓸 수 있습니다. cvs_data_t 레이블은 cvs 가 읽기 및 쓰기 액세스 권한이 있는 영역을 정의합니다. SELinux에서 CVS를 사용하는 경우 클라이언트가 CVS 데이터에 예약된 영역에 대한 전체 액세스 권한을 보유하려면 올바른 레이블을 할당해야 합니다.

18.2. 유형

고급 프로세스 격리를 제공하기 위해 SELinux 대상 정책에 사용되는 기본 권한 제어 방법은 Type Enforcement입니다. 모든 파일과 프로세스는 유형으로 레이블이 지정됩니다. type은 프로세스의 SELinux 도메인과 파일의 SELinux 유형을 정의합니다. SELinux 정책 규칙은 유형에 액세스하는 도메인이든 다른 도메인에 액세스하는 도메인이든 관계없이 유형이 서로 액세스하는 방법을 정의합니다. 액세스는 허용하는 특정 SELinux 정책 규칙이 있는 경우에만 허용됩니다.
CVS와 함께 다음 유형을 사용합니다. 다양한 유형을 사용하여 유연한 액세스를 구성할 수 있습니다.
cvs_data_t
이 유형은 CVS 리포지토리의 데이터에 사용됩니다. CVS는 이러한 유형이 있는 경우에만 데이터에 대한 전체 액세스 권한을 얻을 수 있습니다.
cvs_exec_t
이 유형은 /usr/bin/cvs 바이너리에 사용됩니다.

18.3. 부울

SELinux는 서비스를 실행하는 데 필요한 최소 액세스 수준을 기반으로 합니다. 서비스는 다양한 방법으로 실행할 수 있으므로 서비스 실행 방법을 지정해야 합니다. 다음 부울을 사용하여 SELinux를 설정합니다.
cvs_read_shadow
이 부울을 사용하면 cvs 데몬이 사용자 인증을 위해 /etc/shadow 파일에 액세스할 수 있습니다.
참고
SELinux 정책의 지속적인 개발로 인해 위의 목록에 항상 서비스와 관련된 부울이 모두 포함되지 않을 수 있습니다. 나열하려면 다음 명령을 입력합니다.
~]$ getsebool -a | grep service_name
Copy to Clipboard Toggle word wrap
특정 부울에 대한 설명을 보려면 다음 명령을 입력합니다.
~]$ sepolicy booleans -b boolean_name
Copy to Clipboard Toggle word wrap
이 명령이 작동하려면 sepolicy 유틸리티를 제공하는 추가 policycoreutils-devel 패키지가 필요합니다.

18.4. 설정 예

18.4.1. CVS 설정

이 예제에서는 간단한 CVS 설정과 원격 액세스를 허용하는 SELinux 구성을 설명합니다. 이 예제에서는 두 개의 호스트가 사용됩니다. IP 주소가 192.168.1.1 이고 호스트 이름이 cvs-client 이고 IP 주소가 192.168.1.100cvs-srv 의 호스트 이름이 있는 CVS 서버가 사용됩니다. 두 호스트 모두 동일한 서브넷(192.168.1.0/24)에 있습니다. 이 예제는 cvsxinetd 패키지가 설치되어 있고, SELinux 대상 정책이 사용되고 SELinux가 강제 모드로 실행 중이라고 가정하는 유일한 예입니다.
이 예에서는 전체 DAC 권한을 가진 경우에도 SELinux가 파일 레이블을 기반으로 정책 규칙을 시행할 수 있으며 CVS에서 액세스하기 위해 특별히 레이블이 지정된 특정 영역에만 액세스할 수 있음을 보여줍니다.
참고
단계 1-9는 CVS 서버, cvs-srv 에서 수행되어야 합니다.
  1. 이 예에서는 cvsxinetd 패키지가 필요합니다. 패키지가 설치되었는지 확인합니다.
    [cvs-srv]$ rpm -q cvs xinetd
    package cvs is not installed
    package xinetd is not installed
    
    Copy to Clipboard Toggle word wrap
    설치되지 않은 경우 yum 유틸리티를 root로 사용하여 설치합니다.
    [cvs-srv]# yum install cvs xinetd
    Copy to Clipboard Toggle word wrap
  2. root로 다음 명령을 입력하여 CVS 라는 그룹을 만듭니다.
    [cvs-srv]# groupadd CVS
    Copy to Clipboard Toggle word wrap
    이 작업은 system-config-users 유틸리티를 사용하여 수행할 수도 있습니다.
  3. 사용자 이름으로 cvsuser 를 만들고 이 사용자를 CVS 그룹의 멤버로 만듭니다. 이 작업은 system-config-users 를 사용하여 수행할 수 있습니다.
  4. /etc/services 파일을 편집하고 CVS 서버가 다음과 유사한 항목의 주석을 제거했는지 확인합니다.
    cvspserver	2401/tcp			# CVS client/server operations
    cvspserver	2401/udp			# CVS client/server operations
    
    Copy to Clipboard Toggle word wrap
  5. 파일 시스템의 루트 영역에 CVS 리포지토리를 만듭니다. SELinux를 사용하는 경우 다른 하위 디렉터리에 영향을 주지 않고 재귀 레이블을 제공할 수 있도록 루트 파일 시스템에 리포지토리가 있는 것이 가장 좋습니다. 예를 들어 root 로서 리포지토리를 저장할 /cvs/ 디렉터리를 만듭니다.
    [root@cvs-srv]# mkdir /cvs
    Copy to Clipboard Toggle word wrap
  6. /cvs/ 디렉터리에 모든 사용자에게 전체 권한을 부여합니다.
    [root@cvs-srv]# chmod -R 777 /cvs
    Copy to Clipboard Toggle word wrap
    주의
    이는 예제일 뿐이며 이러한 권한은 프로덕션 시스템에서 사용해서는 안 됩니다.
  7. /etc/xinetd.d/cvs 파일을 편집하고 CVS 섹션의 주석을 제거하고 /cvs/ 디렉토리를 사용하도록 구성되어 있는지 확인합니다. 파일은 다음과 유사해야 합니다.
    service cvspserver
    {
    	disable	= no
    	port			= 2401
    	socket_type		= stream
    	protocol		= tcp
    	wait			= no
    	user			= root
    	passenv			= PATH
    	server			= /usr/bin/cvs
    	env			= HOME=/cvs
    	server_args		= -f --allow-root=/cvs pserver
    #	bind			= 127.0.0.1
    
    Copy to Clipboard Toggle word wrap
  8. xinetd 데몬을 시작합니다.
    [cvs-srv]# systemctl start xinetd.service
    Copy to Clipboard Toggle word wrap
  9. system-config-firewall 유틸리티를 사용하여 포트 2401에서 TCP를 통해 인바운드 연결을 허용하는 규칙을 추가합니다.
  10. 클라이언트 측에서 cvsuser 사용자로 다음 명령을 입력합니다.
    [cvsuser@cvs-client]$ cvs -d /cvs init
    Copy to Clipboard Toggle word wrap
  11. 이때 CVS는 구성되었지만 SELinux는 여전히 로그인 및 파일 액세스를 거부합니다. 이를 확인하려면 cvs-client 에서 $CVSROOT 변수를 설정하고 원격으로 로그인을 시도합니다. 다음 단계는 cvs-client 에서 수행해야 합니다.
    [cvsuser@cvs-client]$ export CVSROOT=:pserver:cvsuser@192.168.1.1:/cvs
    [cvsuser@cvs-client]$
    [cvsuser@cvs-client]$ cvs login
    Logging in to :pserver:cvsuser@192.168.1.1:2401/cvs
    CVS password: ********
    cvs [login aborted]: unrecognized auth response from 192.168.100.1: cvs pserver: cannot open /cvs/CVSROOT/config: Permission denied
    
    Copy to Clipboard Toggle word wrap
    SELinux가 액세스를 차단했습니다. SELinux가 이 액세스를 허용하도록 하려면 cvs-srv:에서 다음 단계를 수행해야 합니다.
  12. /cvs/ 디렉터리의 기존 및 새 데이터에 반복적으로 레이블을 지정하려면 /cvs/ 디렉터리의 /cvs/ 디렉터리의 컨텍스트를 root로 변경하여 cvs_data_t 유형을 지정합니다.
    [root@cvs-srv]# semanage fcontext -a -t cvs_data_t '/cvs(/.*)?'
    [root@cvs-srv]# restorecon -R -v /cvs
    Copy to Clipboard Toggle word wrap
  13. 이제 클라이언트 cvs-client 가 이 리포지토리의 모든 CVS 리소스에 로그인하고 액세스할 수 있어야 합니다.
    [cvsuser@cvs-client]$ export CVSROOT=:pserver:cvsuser@192.168.1.1:/cvs
    [cvsuser@cvs-client]$
    [cvsuser@cvs-client]$ cvs login
    Logging in to :pserver:cvsuser@192.168.1.1:2401/cvs
    CVS password: ********
    [cvsuser@cvs-client]$
    
    Copy to Clipboard Toggle word wrap

19장. Squiid 캐싱 프록시

Squid는 FTP, Gopher 및 HTTP 데이터 개체를 지원하는 웹 클라이언트를 위한 고성능 프록시 캐싱 서버입니다. 자주 요청되는 웹 페이지를 캐싱하고 다시 사용하여 대역폭을 줄이고 응답 시간을 개선합니다.[17]
Red Hat Enterprise Linux에서 squid 패키지는 Squid 캐싱 프록시를 제공합니다. 다음 명령을 입력하여 squid 패키지가 설치되어 있는지 확인합니다.
~]$ rpm -q squid
package squid is not installed
Copy to Clipboard Toggle word wrap
설치되지 않고 squid를 사용하려면 yum 유틸리티를 root로 사용하여 설치합니다.
~]# yum install squid
Copy to Clipboard Toggle word wrap

19.1. Squiid 캐싱 프록시 및 SELinux

SELinux가 활성화되면 Squid는 기본적으로 제한된 상태로 실행됩니다. 제한된 프로세스는 자체 도메인에서 실행되며 다른 제한된 프로세스와 분리됩니다. SELinux 정책 구성에 따라 공격자가 제한된 프로세스가 손상되면 공격자가 리소스에 대한 액세스와 가능한 손상을 제한합니다. 다음 예제에서는 자체 도메인에서 실행되는 Squid 프로세스를 보여줍니다. 이 예제에서는 squid 패키지가 설치되어 있다고 가정합니다.
  1. getenforce 명령을 실행하여 SELinux가 강제 모드에서 실행 중인지 확인합니다.
    ~]$ getenforce
    Enforcing
    
    Copy to Clipboard Toggle word wrap
    이 명령은 SELinux가 강제 모드에서 실행되는 경우 Enforcing 을 반환합니다.
  2. root 사용자로 다음 명령을 입력하여 squid 데몬을 시작합니다.
    ~]# systemctl start squid.service
    Copy to Clipboard Toggle word wrap
    서비스가 실행 중인지 확인합니다. 출력에는 아래 정보가 포함되어야 합니다(시간 스탬프만 다릅니다).
    ~]# systemctl status squid.service
    squid.service - Squid caching proxy
       Loaded: loaded (/usr/lib/systemd/system/squid.service; disabled)
       Active: active (running) since Mon 2013-08-05 14:45:53 CEST; 2s ago
    Copy to Clipboard Toggle word wrap
  3. 다음 명령을 입력하여 squid 프로세스를 확인합니다.
    ~]$ ps -eZ | grep squid
    system_u:system_r:squid_t:s0    27018 ?        00:00:00 squid
    system_u:system_r:squid_t:s0    27020 ?        00:00:00 log_file_daemon
    
    Copy to Clipboard Toggle word wrap
    squid 프로세스와 관련된 SELinux 컨텍스트는 system_u:system_r:squid_t:s0 입니다. 컨텍스트의 마지막 부분인 squid_t 는 유형입니다. 유형은 프로세스 및 파일의 유형에 대한 도메인을 정의합니다. 이 경우 Squid 프로세스는 squid_t 도메인에서 실행됩니다.
SELinux 정책은 squid_t 와 같이 제한된 도메인에서 실행되는 프로세스(예: 파일, 기타 프로세스, 일반적으로 시스템과 상호 작용하는 방법을 정의합니다. squid 액세스를 허용하려면 파일에 올바르게 레이블이 지정되어야 합니다.
/etc/squid/squid.conf 파일이 구성되어 있으므로 squid 가 기본 TCP 포트 3128, 3401 또는 4827 이외의 포트에서 수신 대기하면 semanage port 명령을 사용하여 SELinux 정책 구성에 필요한 포트 번호를 추가해야 합니다. 다음 예제에서는 SELinux 정책 구성에 처음 정의되지 않은 포트에서 수신 대기하도록 squid 를 구성하는 방법을 보여줍니다. 결과적으로 서버가 시작되지 않습니다. 이 예제에서는 데몬이 정책에 아직 정의되지 않은 비표준 포트에서 수신 대기하도록 SELinux 시스템을 구성하는 방법도 보여줍니다. 이 예에서는 squid 패키지가 설치되어 있다고 가정합니다. 예제에서 root 사용자로 각 명령을 실행합니다.
  1. squid 데몬이 실행 중이 아닌지 확인합니다.
    ~]# systemctl status squid.service
    squid.service - Squid caching proxy
       Loaded: loaded (/usr/lib/systemd/system/squid.service; disabled)
       Active: inactive (dead)
    
    Copy to Clipboard Toggle word wrap
    출력이 다르면 프로세스를 중지합니다.
    ~]# systemctl stop squid.service
    Copy to Clipboard Toggle word wrap
  2. 다음 명령을 입력하여 SELinux를 통해 squid 가 수신 대기할 수 있는 포트를 확인합니다.
    ~]# semanage port -l | grep -w -i squid_port_t
    squid_port_t                   tcp      3401, 4827
    squid_port_t                   udp      3401, 4827
    
    
    Copy to Clipboard Toggle word wrap
  3. /etc/squid/squid.conf 를 root로 편집합니다. squid 의 SELinux 정책 구성에 구성되지 않은 포트를 나열하도록 http_port 옵션을 구성합니다. 이 예에서는 데몬이 포트 10000에서 수신 대기하도록 구성되어 있습니다.
    # Squid normally listens to port 3128
    http_port 10000
    
    Copy to Clipboard Toggle word wrap
  4. setsebool 명령을 실행하여 squid_connect_any 부울이 off로 설정되어 있는지 확인합니다. 이렇게 하면 squid 가 특정 포트에서만 작동할 수 있습니다.
    ~]# setsebool -P squid_connect_any 0
    Copy to Clipboard Toggle word wrap
  5. squid 데몬을 시작합니다.
    ~]# systemctl start squid.service
    Job for squid.service failed. See 'systemctl status squid.service' and 'journalctl -xn' for details.
    
    Copy to Clipboard Toggle word wrap
    다음과 유사한 SELinux 거부 메시지가 기록됩니다.
    localhost setroubleshoot: SELinux is preventing the squid (squid_t) from binding to port 10000. For complete SELinux messages. run sealert -l 97136444-4497-4fff-a7a7-c4d8442db982
    
    Copy to Clipboard Toggle word wrap
  6. 이 예제에서 사용되는 대로 squid 가 포트 10000에서 수신 대기하도록 허용하려면 다음 명령이 필요합니다.
    ~]# semanage port -a -t squid_port_t -p tcp 10000
    Copy to Clipboard Toggle word wrap
  7. 다시 squid 를 시작하고 새 포트에서 수신 대기하도록 합니다.
    ~]# systemctl start squid.service
    Copy to Clipboard Toggle word wrap
  8. Squid가 비표준 포트(이 예에서는 TCP 10000)에서 수신 대기하도록 SELinux가 구성되었으므로 이 포트에서 성공적으로 시작됩니다.

19.2. 유형

고급 프로세스 격리를 제공하기 위해 SELinux 대상 정책에 사용되는 기본 권한 제어 방법은 Type Enforcement입니다. 모든 파일과 프로세스는 유형으로 레이블이 지정됩니다. type은 프로세스의 SELinux 도메인과 파일의 SELinux 유형을 정의합니다. SELinux 정책 규칙은 유형에 액세스하는 도메인이든 다른 도메인에 액세스하는 도메인이든 관계없이 유형이 서로 액세스하는 방법을 정의합니다. 액세스는 허용하는 특정 SELinux 정책 규칙이 있는 경우에만 허용됩니다.
다음 유형은 Squid와 함께 사용됩니다. 다양한 유형을 사용하여 유연한 액세스를 구성할 수 있습니다.
httpd_squid_script_exec_t
이 유형은 Squid 및 해당 구성에 대한 다양한 통계를 제공하는 cachemgr.cgi 와 같은 유틸리티에 사용됩니다.
squid_cache_t
/etc/squid/squid.confcache_dir 지시문에 정의된 대로 Squid에 의해 캐시되는 데이터에 이 유형을 사용합니다. 기본적으로 /var/cache/squid//var/spool/squid/ 디렉터리에 생성되거나 복사된 파일은 squid_cache_t 유형으로 레이블이 지정됩니다. /var/squidGuard/ 디렉터리에 복사되거나 /var/ squid Guard/ 디렉터리에 복사되는 squidGuard URL redirector 플러그인의 파일도 squid_cache_t 유형으로 레이블이 지정됩니다. Squid는 캐시된 데이터에 대해 이 유형으로 레이블이 지정된 파일과 디렉토리만 사용할 수 있습니다.
squid_conf_t
이 유형은 Squid에서 구성에 사용하는 디렉터리 및 파일에 사용됩니다. 기존 파일 또는 /etc/squid//usr/share/squid/ 디렉터리에 생성된 파일은 오류 메시지 및 아이콘을 포함하여 이 유형으로 레이블이 지정됩니다.
squid_exec_t
이 유형은 squid 바이너리, /usr/sbin/squid 에 사용됩니다.
squid_log_t
이 유형은 로그에 사용됩니다. 기존 파일 또는 /var/log/squid/ 또는 /var/log/squidGuard/ 에 복사된 파일은 이 유형으로 라벨을 지정해야 합니다.
squid_initrc_exec_t
이 유형은 /etc/rc.d/init.d/ squid 에 있는 squid를 시작하는 데 필요한 초기화 파일에 사용됩니다.
squid_var_run_t
이 유형은 /var/run/ 디렉터리의 파일, 특히 실행 시 Squid에 의해 생성되는 /var/run/squid.pid 라는 프로세스 ID(PID)에서 사용합니다.

19.3. 부울

SELinux는 서비스를 실행하는 데 필요한 최소 액세스 수준을 기반으로 합니다. 서비스는 다양한 방법으로 실행할 수 있으므로 서비스 실행 방법을 지정해야 합니다. 다음 부울을 사용하여 SELinux를 설정합니다.
squid_connect_any
이 부울을 사용하면 Squid가 모든 포트의 원격 호스트에 대한 연결을 시작할 수 있습니다.
squid_use_tproxy
이 부울을 사용하면 Squid가 투명한 프록시로 실행될 수 있습니다.
참고
SELinux 정책의 지속적인 개발로 인해 위의 목록에 항상 서비스와 관련된 부울이 모두 포함되지 않을 수 있습니다. 나열하려면 다음 명령을 입력합니다.
~]$ getsebool -a | grep service_name
Copy to Clipboard Toggle word wrap
특정 부울에 대한 설명을 보려면 다음 명령을 입력합니다.
~]$ sepolicy booleans -b boolean_name
Copy to Clipboard Toggle word wrap
이 명령이 작동하려면 sepolicy 유틸리티를 제공하는 추가 policycoreutils-devel 패키지가 필요합니다.

19.4. 설정 예

19.4.1. 비표준 포트에 Squiid 연결

다음 예제에서는 SELinux가 위의 부울을 강제 적용하여 Squid를 보완하고 기본적으로 특정 포트에 대한 액세스만 허용하는 방법을 보여주는 실제 데모를 제공합니다. 그러면 이 예제에서 부울을 변경하고 해당 액세스가 허용됨을 보여 줍니다.
이 예제는 SELinux가 Squid의 간단한 설정에 어떤 영향을 줄 수 있는지를 보여줍니다. Squid에 대한 포괄적인 설명서는 이 문서의 범위를 벗어납니다. 자세한 내용은 공식 Squid 설명서 를 참조하십시오. 이 예제에서는 Squid 호스트에 인터넷 액세스라는 두 개의 네트워크 인터페이스가 있고, 방화벽이 Squid가 수신 대기하는 기본 TCP 포트를 사용하는 내부 인터페이스에서 액세스를 허용하도록 구성되었다고 가정합니다(TCP 3128).
  1. squid 가 설치되었는지 확인합니다.
    ~]$ rpm -q squid
    package squid is not installed
    
    Copy to Clipboard Toggle word wrap
    패키지가 설치되지 않은 경우 yum 유틸리티를 root로 사용하여 설치합니다.
    ~]# yum install squid
    Copy to Clipboard Toggle word wrap
  2. 기본 구성 파일 /etc/squid/squid.conf 를 편집하고 cache_dir 지시문의 주석을 제거하고 다음과 유사한지 확인합니다.
    cache_dir ufs /var/spool/squid 100 16 256
    
    Copy to Clipboard Toggle word wrap
    이 줄은 이 예제에서 사용할 cache_dir 지시문의 기본 설정을 지정합니다. 이는 Squid 스토리지 형식(ufs), 캐시가 있는 시스템의 디렉터리(/var/spool/squid), 캐시에 사용할 디스크 공간 양(100) 및 마지막으로 생성되는 첫 번째 수준 및 두 번째 수준 캐시 수(각각16 )로 구성됩니다.
  3. 동일한 구성 파일에서 http_access allow localnet 지시문의 주석을 제거합니다. 이를 통해 Red Hat Enterprise Linux에 기본 Squid를 설치할 때 자동으로 구성된 localnet ACL의 트래픽이 허용됩니다. 이 간단한 예는 기존 RFC1918 네트워크의 클라이언트 시스템이 프록시를 통해 액세스할 수 있도록 합니다.
  4. 동일한 구성 파일에서 visible_hostname 지시문의 주석을 제거하고 시스템의 호스트 이름으로 구성되었는지 확인합니다. 값은 호스트의 FQDN(정규화된 도메인 이름)이어야 합니다.
    visible_hostname squid.example.com
    
    Copy to Clipboard Toggle word wrap
  5. root 로 다음 명령을 입력하여 squid 데몬을 시작합니다. 이 명령은 squid 가 처음 시작되면 이 명령은 cache_dir 지시문에서 위에 지정된 대로 캐시 디렉토리를 초기화한 다음 데몬을 시작합니다.
    ~]# systemctl start squid.service
    Copy to Clipboard Toggle word wrap
    squid 가 성공적으로 시작되었는지 확인합니다. 출력에는 아래 정보가 포함되어 있으며 타임스탬프만 다릅니다.
    ~]# systemctl status squid.service
    squid.service - Squid caching proxy
       Loaded: loaded (/usr/lib/systemd/system/squid.service; disabled)
       Active: active (running) since Thu 2014-02-06 15:00:24 CET; 6s ago
    
    Copy to Clipboard Toggle word wrap
  6. squid _var_run_t 값에 표시된 대로 squid 프로세스 ID(PID)가 제한된 서비스로 시작되었는지 확인합니다.
    ~]# ls -lZ /var/run/squid.pid 
    -rw-r--r--. root squid unconfined_u:object_r:squid_var_run_t:s0 /var/run/squid.pid
    
    Copy to Clipboard Toggle word wrap
  7. 이때 이전에 구성된 localnet ACL에 연결된 클라이언트 시스템이 이 호스트의 내부 인터페이스를 프록시로 사용할 수 있습니다. 이 설정은 모든 일반 웹 브라우저 또는 시스템 전체의 설정에서 구성할 수 있습니다. 이제 Squid가 대상 시스템의 기본 포트(TCP 3128)에서 수신 대기하지만 대상 시스템은 공통 포트를 통해 인터넷의 다른 서비스에 대한 나가는 연결만 허용합니다. 이는 SELinux 자체에서 정의한 정책입니다. SELinux는 다음 단계에 표시된 대로 비표준 포트에 대한 액세스를 거부합니다.
  8. 클라이언트가 TCP 포트 10000에서 수신 대기하는 웹 사이트와 같은 Squid 프록시를 통해 비표준 포트를 사용하여 요청하면 다음과 유사한 거부가 기록됩니다.
    SELinux is preventing the squid daemon from connecting to network port 10000
    
    Copy to Clipboard Toggle word wrap
  9. 이 액세스를 허용하려면 기본적으로 비활성화되므로 squid_connect_any 부울을 수정해야 합니다.
    ~]# setsebool -P squid_connect_any on
    Copy to Clipboard Toggle word wrap
    참고
    setsebool 변경 사항을 재부팅해도 유지하지 않으려면 -P 옵션을 사용하지 마십시오.
  10. Squid가 이제 클라이언트를 대신하여 모든 포트에 대한 연결을 시작할 수 있으므로 클라이언트는 인터넷에서 비표준 포트에 액세스할 수 있습니다.


[17] 자세한 내용은 Squid Caching Proxy 프로젝트 페이지를 참조하십시오.

20장. MariaDB(MySQL 대체)

MariaDB 데이터베이스는 MariaDB 서버 데몬(mysqld) 및 많은 클라이언트 프로그램 및 라이브러리로 구성된 다중 사용자 다중 스레드 SQL 데이터베이스 서버입니다.[18]
Red Hat Enterprise Linux에서 mariadb-server 패키지는 MariaDB를 제공합니다. 다음 명령을 입력하여 mariadb-server 패키지가 설치되어 있는지 확인합니다.
~]$ rpm -q mariadb-server
package mariadb-server is not installed
Copy to Clipboard Toggle word wrap
설치되지 않은 경우 yum 유틸리티를 root로 사용하여 설치합니다.
~]# yum install mariadb-server
Copy to Clipboard Toggle word wrap

20.1. MariaDB 및 SELinux

MariaDB가 활성화되면 기본적으로 제한된 상태로 실행됩니다. 제한된 프로세스는 자체 도메인에서 실행되며 다른 제한된 프로세스와 분리됩니다. SELinux 정책 구성에 따라 공격자가 제한된 프로세스가 손상되면 공격자가 리소스에 대한 액세스와 가능한 손상을 제한합니다. 다음 예제에서는 자체 도메인에서 실행되는 MariaDB 프로세스를 보여줍니다. 이 예제에서는 mariadb-server 패키지가 설치되어 있다고 가정합니다.
  1. getenforce 명령을 실행하여 SELinux가 강제 모드에서 실행 중인지 확인합니다.
    ~]$ getenforce
    Enforcing
    
    Copy to Clipboard Toggle word wrap
    이 명령은 SELinux가 강제 모드에서 실행되는 경우 Enforcing 을 반환합니다.
  2. 다음 명령을 root 사용자로 입력하여 mariadb 를 시작합니다.
    ~]# systemctl start mariadb.service
    Copy to Clipboard Toggle word wrap
    서비스가 실행 중인지 확인합니다. 출력에는 아래 정보가 포함되어야 합니다(시간 스탬프만 다릅니다).
    ~]# systemctl status mariadb.service
    mariadb.service - MariaDB database server
       Loaded: loaded (/usr/lib/systemd/system/mariadb.service; disabled)
       Active: active (running) since Mon 2013-08-05 11:20:11 CEST; 3h 28min ago
    
    Copy to Clipboard Toggle word wrap
  3. 다음 명령을 입력하여 mysqld 프로세스를 확인합니다.
    ~]$ ps -eZ | grep mysqld
    system_u:system_r:mysqld_safe_t:s0 12831 ?     00:00:00 mysqld_safe
    system_u:system_r:mysqld_t:s0   13014 ?        00:00:00 mysqld
    
    Copy to Clipboard Toggle word wrap
    mysqld 프로세스와 관련된 SELinux 컨텍스트는 system_u:system_r:mysqld_t:s0 입니다. 컨텍스트의 마지막 부분인 mysqld_t 는 유형입니다. 유형은 프로세스 및 파일의 유형에 대한 도메인을 정의합니다. 이 경우 mysqld 프로세스는 mysqld_t 도메인에서 실행됩니다.

20.2. 유형

고급 프로세스 격리를 제공하기 위해 SELinux 대상 정책에 사용되는 기본 권한 제어 방법은 Type Enforcement입니다. 모든 파일과 프로세스는 유형으로 레이블이 지정됩니다. type은 프로세스의 SELinux 도메인과 파일의 SELinux 유형을 정의합니다. SELinux 정책 규칙은 유형에 액세스하는 도메인이든 다른 도메인에 액세스하는 도메인이든 관계없이 유형이 서로 액세스하는 방법을 정의합니다. 액세스는 허용하는 특정 SELinux 정책 규칙이 있는 경우에만 허용됩니다.
다음 유형은 mysqld 와 함께 사용됩니다. 다양한 유형을 사용하여 유연한 액세스를 구성할 수 있습니다.
mysqld_db_t
이 유형은 MariaDB 데이터베이스의 위치에 사용됩니다. Red Hat Enterprise Linux에서 데이터베이스의 기본 위치는 /var/lib/mysql/ 디렉터리이지만 변경할 수 있습니다. MariaDB 데이터베이스의 위치가 변경되면 새 위치에 이 유형의 레이블이 지정되어야 합니다. 기본 데이터베이스 위치를 변경하는 방법과 새 섹션에 적절하게 레이블을 지정하는 방법에 대한 지침은 20.4.1절. “MariaDB 데이터베이스 위치 변경” 의 예제를 참조하십시오.
mysqld_etc_t
이 유형은 MariaDB 기본 구성 파일 /etc/my.cnf/etc/mysql/ 디렉터리에 있는 기타 구성 파일에 사용됩니다.
mysqld_exec_t
이 유형은 Red Hat Enterprise Linux의 MariaDB 바이너리의 기본 위치인 /usr/libexec/mysqld 에 있는 mysqld 바이너리에 사용됩니다. 다른 시스템은 이 유형으로 레이블이 지정되어야 하는 /usr/sbin/mysqld 에서 이 바이너리를 찾을 수 있습니다.
mysqld_unit_file_t
이 유형은 Red Hat Enterprise Linux에서 기본적으로 /usr/lib/systemd/system/ 디렉터리에 있는 실행 가능한 MariaDB 관련 파일에 사용됩니다.
mysqld_log_t
적절한 작업을 위해서는 MariaDB의 로그에 이 유형으로 레이블이 지정되어야 합니다. mysql.* 와일드카드와 일치하는 /var/log/ 디렉터리의 모든 로그 파일은 이 유형으로 레이블이 지정되어야 합니다.
mysqld_var_run_t
이 유형은 /var/run/mariadb/ 디렉터리, 특히 mysqld 데몬에서 생성되는 /var/run/mariadb/mariadb.pid 라는 이름의 프로세스 ID(PID)에서 사용합니다. 이 유형은 /var/lib/mysql/mysql.sock 과 같은 관련 소켓 파일에도 사용됩니다. 이러한 파일에는 제한된 서비스로 올바르게 작동하려면 이러한 파일에 레이블이 올바르게 지정되어야 합니다.

20.3. 부울

SELinux는 서비스를 실행하는 데 필요한 최소 액세스 수준을 기반으로 합니다. 서비스는 다양한 방법으로 실행할 수 있으므로 서비스 실행 방법을 지정해야 합니다. 다음 부울을 사용하여 SELinux를 설정합니다.
selinuxuser_mysql_connect_enabled
이 부울을 활성화하면 사용자가 로컬 MariaDB 서버에 연결할 수 있습니다.
exim_can_connect_db
이 부울을 사용하면 exim mailer가 데이터베이스 서버에 대한 연결을 시작할 수 있습니다.
ftpd_connect_db
이 부울을 사용하면 ftp 데몬이 데이터베이스 서버에 대한 연결을 시작할 수 있습니다.
httpd_can_network_connect_db
이 부울을 활성화하려면 웹 서버가 데이터베이스 서버와 통신하는 데 필요합니다.
참고
SELinux 정책의 지속적인 개발로 인해 위의 목록에 항상 서비스와 관련된 부울이 모두 포함되지 않을 수 있습니다. 나열하려면 다음 명령을 입력합니다.
~]$ getsebool -a | grep service_name
Copy to Clipboard Toggle word wrap
특정 부울에 대한 설명을 보려면 다음 명령을 입력합니다.
~]$ sepolicy booleans -b boolean_name
Copy to Clipboard Toggle word wrap
이 명령이 작동하려면 sepolicy 유틸리티를 제공하는 추가 policycoreutils-devel 패키지가 필요합니다.

20.4. 설정 예

20.4.1. MariaDB 데이터베이스 위치 변경

Red Hat Enterprise Linux를 사용하는 경우 데이터베이스를 저장하는 MariaDB의 기본 위치는 /var/lib/mysql/ 입니다. SELinux는 기본적으로 SELinux가 될 것으로 예상하므로 이 영역은 이미 mysqld_db_t 유형을 사용하여 적절하게 레이블이 지정됩니다.
데이터베이스가 저장되는 위치는 개별 환경 요구 사항 또는 기본 설정에 따라 변경할 수 있지만 SELinux는 이 새 위치를 인식하는 것이 중요합니다. 이 레이블은 적절하게 레이블이 지정됩니다. 이 예제에서는 MariaDB 데이터베이스의 위치를 변경한 다음 SELinux가 해당 콘텐츠를 기반으로 새 영역에 계속 보호 메커니즘을 제공할 수 있도록 새 위치에 레이블을 지정하는 방법을 설명합니다.
이 예제는 SELinux가 MariaDB에 미치는 영향을 보여줍니다. MariaDB에 대한 포괄적인 설명서는 이 문서의 범위를 벗어납니다. 자세한 내용은 공식 MariaDB 설명서 를 참조하십시오. 이 예에서는 mariadb-serversetroubleshoot-server 패키지가 설치되어 있고 auditd 서비스가 실행 중이고 /var/lib/mysql/ 의 기본 위치에 유효한 데이터베이스가 있다고 가정합니다.
  1. mysql 에 대한 기본 데이터베이스 위치의 SELinux 컨텍스트 보기:
    ~]# ls -lZ /var/lib/mysql
    drwx------. mysql mysql system_u:object_r:mysqld_db_t:s0 mysql
    
    Copy to Clipboard Toggle word wrap
    데이터베이스 파일의 위치에 대한 기본 컨텍스트 요소인 mysqld_db_t 가 표시됩니다. 이 컨텍스트가 제대로 작동하려면 이 예제에서 사용할 새 데이터베이스 위치에 수동으로 적용해야 합니다.
  2. 다음 명령을 입력하고 mysqld root 암호를 입력하여 사용 가능한 데이터베이스를 표시합니다.
    ~]# mysqlshow -u root -p
    Enter password: *******
    +--------------------+
    |     Databases      |
    +--------------------+
    | information_schema |
    | mysql              |
    | test               |
    | wikidb             |
    +--------------------+
    
    Copy to Clipboard Toggle word wrap
  3. mariadb.service 서비스를 중지합니다.
    ~]# systemctl stop mariadb.service
    Copy to Clipboard Toggle word wrap
  4. 데이터베이스의 새 위치에 대한 새 디렉터리를 만듭니다. 이 예에서는 /mysql/ 이 사용됩니다.
    ~]# mkdir -p /mysql
    Copy to Clipboard Toggle word wrap
  5. 이전 위치의 데이터베이스 파일을 새 위치로 복사합니다.
    ~]# cp -R /var/lib/mysql/* /mysql/
    Copy to Clipboard Toggle word wrap
  6. mysql 사용자 및 그룹의 액세스를 허용하도록 이 위치의 소유권을 변경합니다. 이렇게 하면 SELinux가 계속 관찰할 기존 Unix 권한이 설정됩니다.
    ~]# chown -R mysql:mysql /mysql
    Copy to Clipboard Toggle word wrap
  7. 다음 명령을 입력하여 새 디렉터리의 초기 컨텍스트를 확인합니다.
    ~]# ls -lZ /mysql
    drwxr-xr-x. mysql mysql unconfined_u:object_r:usr_t:s0   mysql
    
    Copy to Clipboard Toggle word wrap
    새로 생성된 이 디렉터리의 컨텍스트 usr_t 는 현재 SELinux에 MariaDB 데이터베이스 파일의 위치로 적합하지 않습니다. 컨텍스트가 변경되면 MariaDB가 이 영역에서 제대로 작동할 수 있습니다.
  8. 텍스트 편집기로 기본 MariaDB 구성 파일 /etc/my.cnf 를 열고 새 위치를 참조하도록 datadir 옵션을 수정합니다. 이 예에서 입력해야 하는 값은 /mysql:입니다.
    [mysqld]
    datadir=/mysql
    
    Copy to Clipboard Toggle word wrap
    이 파일을 저장하고 종료합니다.
  9. mariadb.service 를 시작합니다. 서비스가 시작되지 않아야 하며 거부 메시지가 /var/log/messages 파일에 기록됩니다.
    ~]# systemctl start mariadb.service
    Job for mariadb.service failed. See 'systemctl status mariadb.service' and 'journalctl -xn' for details.
    
    Copy to Clipboard Toggle word wrap
    그러나 감사 데몬이 setroubleshoot 서비스와 함께 실행되는 경우 거부는 대신 /var/log/audit/audit.log 파일에 기록됩니다.
    SELinux is preventing /usr/libexec/mysqld "write" access on /mysql. For complete SELinux messages. run sealert -l b3f01aff-7fa6-4ebe-ad46-abaef6f8ad71
    
    Copy to Clipboard Toggle word wrap
    이 거부의 이유는 MariaDB 데이터 파일에 대해 /mysql/ 레이블이 올바르게 레이블이 지정되지 않기 때문입니다. SELinux는 MariaDB가 usr_t 로 레이블이 지정된 콘텐츠에 액세스하지 못하도록 합니다. 이 문제를 해결하려면 다음 단계를 수행하십시오.
  10. 다음 명령을 입력하여 /mysql/ 에 대한 컨텍스트 매핑을 추가합니다. semanage 유틸리티는 기본적으로 설치되지 않습니다. 시스템에 누락된 경우 policycoreutils-python 패키지를 설치합니다.
    ~]# semanage fcontext -a -t mysqld_db_t "/mysql(/.*)?"
    Copy to Clipboard Toggle word wrap
  11. 이 매핑은 /etc/selinux/targeted/contexts/files/file_contexts.local 파일에 작성됩니다.
    ~]# grep -i mysql /etc/selinux/targeted/contexts/files/file_contexts.local
    
    /mysql(/.*)?    system_u:object_r:mysqld_db_t:s0
    
    Copy to Clipboard Toggle word wrap
  12. 이제 restorecon 유틸리티를 사용하여 이 컨텍스트 매핑을 실행 중인 시스템에 적용합니다.
    ~]# restorecon -R -v /mysql
    Copy to Clipboard Toggle word wrap
  13. 이제 /mysql/ 위치에 MariaDB에 대한 올바른 컨텍스트로 레이블이 지정되었으므로 mysqld 가 시작됩니다.
    ~]# systemctl start mariadb.service
    Copy to Clipboard Toggle word wrap
  14. /mysql/: 컨텍스트가 변경되었는지 확인합니다.
    ~]$ ls -lZ /mysql
    drwxr-xr-x. mysql mysql system_u:object_r:mysqld_db_t:s0 mysql
    
    Copy to Clipboard Toggle word wrap
  15. 위치가 변경되어 레이블이 지정되었으며 mysqld 가 성공적으로 시작되었습니다. 이제 정상적인 작업을 확인하기 위해 실행 중인 모든 서비스를 테스트해야 합니다.


[18] 자세한 내용은 MariaDB 프로젝트 페이지를 참조하십시오.

21장. PostgreSQL

PostgreSQL은 DBMS(Object-Relational Database Management System)입니다.[19]
Red Hat Enterprise Linux에서 postgresql-server 패키지는 PostgreSQL을 제공합니다. 다음 명령을 입력하여 postgresql-server 패키지가 설치되어 있는지 확인합니다.
~]# rpm -q postgresql-server
Copy to Clipboard Toggle word wrap
설치되지 않은 경우 yum 유틸리티를 root로 사용하여 설치합니다.
~]# yum install postgresql-server
Copy to Clipboard Toggle word wrap

21.1. PostgreSQL 및 SELinux

PostgreSQL이 활성화되면 기본적으로 제한된 상태로 실행됩니다. 제한된 프로세스는 자체 도메인에서 실행되며 다른 제한된 프로세스와 분리됩니다. SELinux 정책 구성에 따라 공격자가 제한된 프로세스가 손상되면 공격자가 리소스에 대한 액세스와 가능한 손상을 제한합니다. 다음 예제에서는 자체 도메인에서 실행되는 PostgreSQL 프로세스를 보여줍니다. 이 예제에서는 postgresql-server 패키지가 설치되어 있다고 가정합니다.
  1. getenforce 명령을 실행하여 SELinux가 강제 모드에서 실행 중인지 확인합니다.
    ~]$ getenforce
    Enforcing
    
    Copy to Clipboard Toggle word wrap
    이 명령은 SELinux가 강제 모드에서 실행되는 경우 Enforcing 을 반환합니다.
  2. postgresql 를 시작하려면 root 사용자로 다음 명령을 입력합니다.
    ~]# systemctl start postgresql.service
    Copy to Clipboard Toggle word wrap
    서비스가 실행 중인지 확인합니다. 출력에는 아래 정보가 포함되어야 합니다(시간 스탬프만 다릅니다).
    ~]# systemctl start postgresql.service
    postgresql.service - PostgreSQL database server
       Loaded: loaded (/usr/lib/systemd/system/postgresql.service; disabled)
       Active: active (running) since Mon 2013-08-05 14:57:49 CEST; 12s
    
    Copy to Clipboard Toggle word wrap
  3. postgresql 프로세스를 보려면 다음 명령을 입력합니다.
    ~]$ ps -eZ | grep postgres
    system_u:system_r:postgresql_t:s0 395 ?    00:00:00 postmaster
    system_u:system_r:postgresql_t:s0 397 ?    00:00:00 postmaster
    system_u:system_r:postgresql_t:s0 399 ?    00:00:00 postmaster
    system_u:system_r:postgresql_t:s0 400 ?    00:00:00 postmaster
    system_u:system_r:postgresql_t:s0 401 ?    00:00:00 postmaster
    system_u:system_r:postgresql_t:s0 402 ?    00:00:00 postmaster
    
    Copy to Clipboard Toggle word wrap
    postgresql 프로세스와 관련된 SELinux 컨텍스트는 system_u:system_r:postgresql_t:s0 입니다. 컨텍스트의 마지막 부분인 postgresql_t 는 유형입니다. 유형은 프로세스 및 파일의 유형에 대한 도메인을 정의합니다. 이 경우 postgresql 프로세스는 postgresql_t 도메인에서 실행됩니다.

21.2. 유형

고급 프로세스 격리를 제공하기 위해 SELinux 대상 정책에 사용되는 기본 권한 제어 방법은 Type Enforcement입니다. 모든 파일과 프로세스는 유형으로 레이블이 지정됩니다. type은 프로세스의 SELinux 도메인과 파일의 SELinux 유형을 정의합니다. SELinux 정책 규칙은 유형에 액세스하는 도메인이든 다른 도메인에 액세스하는 도메인이든 관계없이 유형이 서로 액세스하는 방법을 정의합니다. 액세스는 허용하는 특정 SELinux 정책 규칙이 있는 경우에만 허용됩니다.
다음 유형은 postgresql 와 함께 사용됩니다. 다양한 유형을 사용하여 유연한 액세스를 구성할 수 있습니다. 아래 목록에서는 사용 가능한 전체 위치와 일치하는 몇 가지 정규 표현식을 사용합니다.
postgresql_db_t
이 유형은 여러 위치에 사용됩니다. 이 유형으로 레이블이 지정된 위치는 PostgreSQL의 데이터 파일에 사용됩니다.
  • /usr/lib/pgsql/test/regres
  • /usr/share/jonas/pgsql
  • /var/lib/pgsql/data
  • /var/lib/postgres(ql)?
postgresql_etc_t
이 유형은 /etc/postgresql/ 디렉터리의 구성 파일에 사용됩니다.
postgresql_exec_t
이 유형은 여러 위치에 사용됩니다. 이 유형으로 레이블이 지정된 위치는 PostgreSQL의 바이너리에 사용됩니다.
  • /usr/bin/initdb(.sepgsql)?
  • /usr/bin/(se)?postgres
  • /usr/lib(64)?/postgresql/bin/.*
  • /usr/lib(64)?/pgsql/test/regress/pg_regress
systemd_unit_file_t
이 유형은 /usr/lib/systemd/system/ 디렉터리에 있는 실행 가능한 PostgreSQL 관련 파일에 사용됩니다.
postgresql_log_t
이 유형은 여러 위치에 사용됩니다. 이 유형으로 레이블이 지정된 위치는 로그 파일에 사용됩니다.
  • /var/lib/pgsql/logfile
  • /var/lib/pgsql/pgstartup.log
  • /var/lib/sepgsql/pgstartup.log
  • /var/log/postgresql
  • /var/log/postgres.log.*
  • /var/log/rhdb/rhdb
  • /var/log/sepostgresql.log.*
postgresql_var_run_t
이 유형은 PostgreSQL의 런타임 파일(예: /var/run/postgresql/ 디렉터리의 프로세스 ID)에 사용됩니다.

21.3. 부울

SELinux는 서비스를 실행하는 데 필요한 최소 액세스 수준을 기반으로 합니다. 서비스는 다양한 방법으로 실행할 수 있으므로 서비스 실행 방법을 지정해야 합니다. 다음 부울을 사용하여 SELinux를 설정합니다.
selinuxuser_postgresql_connect_enabled
이 부울을 활성화하면 PostgreSQL에서 정의한 모든 사용자 도메인이 데이터베이스 서버에 연결할 수 있습니다.
참고
SELinux 정책의 지속적인 개발로 인해 위의 목록에 항상 서비스와 관련된 부울이 모두 포함되지 않을 수 있습니다. 나열하려면 다음 명령을 입력합니다.
~]$ getsebool -a | grep service_name
Copy to Clipboard Toggle word wrap
특정 부울에 대한 설명을 보려면 다음 명령을 입력합니다.
~]$ sepolicy booleans -b boolean_name
Copy to Clipboard Toggle word wrap
이 명령이 작동하려면 sepolicy 유틸리티를 제공하는 추가 policycoreutils-devel 패키지가 필요합니다.

21.4. 설정 예

21.4.1. PostgreSQL 데이터베이스 위치 변경

Red Hat Enterprise Linux를 사용하는 경우 데이터베이스를 저장할 PostgreSQL의 기본 위치는 /var/lib/pgsql/data/ 입니다. SELinux는 기본적으로 SELinux가 될 것으로 예상하므로 이 영역은 이미 postgresql_db_t 유형을 사용하여 적절하게 레이블이 지정됩니다.
데이터베이스가 있는 영역은 개별 환경 요구 사항 또는 기본 설정에 따라 변경할 수 있지만 SELinux는 이 새 위치를 인식하는 것이 중요합니다. 이 영역에 따라 레이블이 지정되어야 합니다. 이 예에서는 PostgreSQL 데이터베이스의 위치를 변경한 다음 SELinux가 해당 콘텐츠를 기반으로 새 영역에 계속 보호 메커니즘을 제공할 수 있도록 새 위치에 레이블을 지정하는 방법을 설명합니다.
이 예제는 SELinux가 PostgreSQL에 미치는 영향을 보여줍니다. PostgreSQL의 포괄적인 설명서는 이 문서의 범위를 벗어납니다. 자세한 내용은 공식 PostgreSQL 설명서 를 참조하십시오. 이 예제에서는 postgresql-server 패키지가 설치되어 있다고 가정합니다.
  1. postgresql 에 대한 기본 데이터베이스 위치의 SELinux 컨텍스트를 확인합니다.
    ~]# ls -lZ /var/lib/pgsql
    drwx------. postgres postgres system_u:object_r:postgresql_db_t:s0 data
    
    Copy to Clipboard Toggle word wrap
    데이터베이스 파일의 위치에 대한 기본 컨텍스트 요소인 postgresql_db_t 가 표시됩니다. 이 컨텍스트가 제대로 작동하려면 이 예제에서 사용할 새 데이터베이스 위치에 수동으로 적용해야 합니다.
  2. 데이터베이스의 새 위치에 대한 새 디렉터리를 만듭니다. 이 예에서는 /opt/postgresql/data/ 가 사용됩니다. 다른 위치를 사용하는 경우 다음 단계의 텍스트를 해당 위치로 바꿉니다.
    ~]# mkdir -p /opt/postgresql/data
    Copy to Clipboard Toggle word wrap
  3. 새 위치의 디렉터리 목록을 수행합니다. 새 디렉터리의 초기 컨텍스트는 usr_t 입니다. 이 컨텍스트는 SELinux가 PostgreSQL에 보호 메커니즘을 제공하는 데 충분하지 않습니다. 컨텍스트가 변경되면 새 영역에서 제대로 작동할 수 있습니다.
    ~]# ls -lZ /opt/postgresql/
    drwxr-xr-x. root root unconfined_u:object_r:usr_t:s0   data
    
    Copy to Clipboard Toggle word wrap
  4. postgres 사용자 및 그룹의 액세스를 허용하도록 새 위치의 소유권을 변경합니다. 이렇게 하면 SELinux가 계속 관찰할 기존의 Unix 권한이 설정됩니다.
    ~]# chown -R postgres:postgres /opt/postgresql
    Copy to Clipboard Toggle word wrap
  5. 텍스트 편집기로 /etc/systemd/system/postgresql.service 파일을 열고 새 위치를 가리키도록 PGDATAPGLOG 변수를 수정합니다.
    ~]# vi /etc/systemd/system/postgresql.service
    PGDATA=/opt/postgresql/data
    PGLOG=/opt/postgresql/data/pgstartup.log
    
    Copy to Clipboard Toggle word wrap
    이 파일을 저장하고 텍스트 편집기를 종료합니다.
    /etc/systemd/system/postgresql.service 파일이 없는 경우 해당 파일을 생성하고 다음 내용을 삽입합니다.
    .include /lib/systemd/system/postgresql.service
    [Service]
    
    # Location of database directory
    Environment=PGDATA=/opt/postgresql/data
    Environment=PGLOG=/opt/postgresql/data/pgstartup.log
    Copy to Clipboard Toggle word wrap
  6. 새 위치에서 데이터베이스를 초기화합니다.
    ~]$ su - postgres -c "initdb -D /opt/postgresql/data"
    Copy to Clipboard Toggle word wrap
  7. 데이터베이스 위치를 변경하면 이 시점에 서비스 시작이 실패합니다.
    ~]# systemctl start postgresql.service
    Job for postgresql.service failed. See 'systemctl status postgresql.service' and 'journalctl -xn' for details.
    
    Copy to Clipboard Toggle word wrap
    SELinux로 인해 서비스가 시작되지 않았습니다. 새 위치의 레이블이 올바르지 않기 때문입니다. 다음 단계에서는 새 위치(/opt/postgresql/)에 레이블을 지정하고 postgresql 서비스를 올바르게 시작하는 방법을 설명합니다.
  8. semanage 유틸리티를 사용하여 /opt/postgresql/ 및 그 내의 다른 디렉터리/파일에 대한 컨텍스트 매핑을 추가합니다.
    ~]# semanage fcontext -a -t postgresql_db_t "/opt/postgresql(/.*)?"
    Copy to Clipboard Toggle word wrap
  9. 이 매핑은 /etc/selinux/targeted/contexts/files/file_contexts.local 파일에 작성됩니다.
    ~]# grep -i postgresql /etc/selinux/targeted/contexts/files/file_contexts.local
    
    /opt/postgresql(/.*)?    system_u:object_r:postgresql_db_t:s0
    
    Copy to Clipboard Toggle word wrap
  10. 이제 restorecon 유틸리티를 사용하여 이 컨텍스트 매핑을 실행 중인 시스템에 적용합니다.
    ~]# restorecon -R -v /opt/postgresql
    Copy to Clipboard Toggle word wrap
  11. 이제 /opt/postgresql/ 위치에 PostgreSQL에 대한 올바른 컨텍스트로 레이블이 지정되었으므로 postgresql 서비스가 성공적으로 시작됩니다.
    ~]# systemctl start postgresql.service
    Copy to Clipboard Toggle word wrap
  12. /opt/postgresql/:에 대한 컨텍스트가 올바른지 확인합니다.
    ~]$ ls -lZ /opt
    drwxr-xr-x. root root system_u:object_r:postgresql_db_t:s0 postgresql
    
    Copy to Clipboard Toggle word wrap
  13. ps 명령을 사용하여 postgresql 프로세스에 새 위치가 표시되는지 확인합니다.
    ~]# ps aux | grep -i postmaster
    
    postgres 21564  0.3  0.3  42308  4032 ?        S    10:13   0:00 /usr/bin/postmaster -p 5432 -D /opt/postgresql/data/
    Copy to Clipboard Toggle word wrap
  14. 위치가 변경되고 레이블이 지정되었으며 postgresql 가 성공적으로 시작되었습니다. 이제 정상적인 작업을 확인하기 위해 실행 중인 모든 서비스를 테스트해야 합니다.


[19] 자세한 내용은 PostgreSQL 프로젝트 페이지를 참조하십시오.

22장. rsync

rsync 유틸리티는 빠른 파일 전송을 수행하며 시스템 간에 데이터를 동기화하는 데 사용됩니다. [20]
Red Hat Enterprise Linux를 사용하는 경우 rsync 패키지는 rsync 를 제공합니다. 다음 명령을 입력하여 rsync 패키지가 설치되어 있는지 확인합니다.
~]$ rpm -q rsync
package rsync is not installed
Copy to Clipboard Toggle word wrap
설치되지 않은 경우 yum 유틸리티를 root로 사용하여 설치합니다.
~]# yum install rsync
Copy to Clipboard Toggle word wrap

22.1. rsync 및 SELinux

SELinux에는 파일 유형을 정의하기 위해 파일에 확장된 특성이 있어야 합니다. 정책은 이러한 파일에 필요한 액세스 데몬을 제어합니다. rsync 데몬을 사용하여 파일을 공유하려면 파일 및 디렉터리에 public_content_t 유형의 레이블을 지정해야 합니다. 대부분의 서비스와 마찬가지로 SELinux가 rsync 를 통해 보호 메커니즘을 수행하려면 올바른 레이블이 필요합니다.[21]

22.2. 유형

고급 프로세스 격리를 제공하기 위해 SELinux 대상 정책에 사용되는 기본 권한 제어 방법은 Type Enforcement입니다. 모든 파일과 프로세스는 유형으로 레이블이 지정됩니다. type은 프로세스의 SELinux 도메인과 파일의 SELinux 유형을 정의합니다. SELinux 정책 규칙은 유형에 액세스하는 도메인이든 다른 도메인에 액세스하는 도메인이든 관계없이 유형이 서로 액세스하는 방법을 정의합니다. 액세스는 허용하는 특정 SELinux 정책 규칙이 있는 경우에만 허용됩니다.
다음 유형은 rsync 와 함께 사용됩니다. 유연한 액세스를 구성할 수 있는 다양한 유형:
public_content_t
rsync 를 사용하여 공유할 파일 위치(및 실제 파일)에 사용되는 일반 유형입니다. rsync 와 공유할 파일을 수용하기 위해 특수 디렉터리가 생성된 경우 디렉터리와 해당 콘텐츠가 이 라벨을 적용해야 합니다.
rsync_exec_t
이 유형은 /usr/bin/rsync 시스템 바이너리에 사용됩니다.
rsync_log_t
이 유형은 기본적으로 /var/log/ rsync.log 에 있는 rsync 로그 파일에 사용됩니다. 파일 rsync 로그의 위치를 로 변경하려면 런타임 시 rsync 명령에 --log-file=FILE 옵션을 사용합니다.
rsync_var_run_t
이 유형은 /var/run/ rsyncd.lock 에 있는 rsyncd 잠금 파일에 사용됩니다. 이 잠금 파일은 rsync 서버에서 연결 제한을 관리하는 데 사용됩니다.
rsync_data_t
이 유형은 rsync 도메인으로 사용하려는 파일 및 디렉터리에 사용되며 다른 서비스의 액세스 범위에서 분리합니다. 또한 public_content_t 는 일반 SELinux 컨텍스트 유형으로, 파일 또는 디렉터리가 여러 서비스(예: rsync 도메인으로 FTP 및 NFS 디렉토리)와 상호 작용할 때 사용할 수 있습니다.
rsync_etc_t
이 유형은 /etc 디렉토리의 rsync 관련 파일에 사용됩니다.

22.3. 부울

SELinux는 서비스를 실행하는 데 필요한 최소 액세스 수준을 기반으로 합니다. 서비스는 다양한 방법으로 실행할 수 있으므로 서비스 실행 방법을 지정해야 합니다. 다음 부울을 사용하여 SELinux를 설정합니다.
rsync_anon_write
이 부울을 활성화하면 rsync _t 도메인의 rsync가 public_content_rw_t 유형의 파일, 링크 및 디렉터리를 관리할 수 있습니다. 공용 파일 전송 서비스에 사용되는 공용 파일인 경우가 많습니다. 파일과 디렉터리에는 이 유형의 레이블이 지정되어야 합니다.
rsync_client
이 부울을 활성화하면 rsyncrsync_port_t 로 정의된 포트에 대한 연결을 시작하고 데몬에서 rsync_data_t 유형이 있는 파일, 링크 및 디렉터리를 관리할 수 있습니다. SELinux가 제어할 수 있도록 rsync _t 도메인에 있어야 합니다. 이 장의 구성 예제에서는 rsync _t 도메인에서 실행되는 rsync를 보여줍니다.
rsync_export_all_ro
이 부울을 활성화하면 rsync _t 도메인의 rsync가 클라이언트에 대한 읽기 전용 액세스 권한으로 NFS 및 CIFS 볼륨을 내보낼 수 있습니다.
참고
SELinux 정책의 지속적인 개발로 인해 위의 목록에 항상 서비스와 관련된 부울이 모두 포함되지 않을 수 있습니다. 나열하려면 다음 명령을 입력합니다.
~]$ getsebool -a | grep service_name
Copy to Clipboard Toggle word wrap
특정 부울에 대한 설명을 보려면 다음 명령을 입력합니다.
~]$ sepolicy booleans -b boolean_name
Copy to Clipboard Toggle word wrap
이 명령이 작동하려면 sepolicy 유틸리티를 제공하는 추가 policycoreutils-devel 패키지가 필요합니다.

22.4. 설정 예

22.4.1. 데몬으로 rsync

Red Hat Enterprise Linux를 사용하는 경우 rsync를 데몬으로 사용하여 여러 클라이언트가 중앙 집중식 파일을 보관하고 동기화된 상태로 유지하도록 중앙 집중식 서버로 직접 통신할 수 있습니다. 다음 예제에서는 올바른 도메인에서 네트워크 소켓을 통해 rsync를 데몬으로 실행하는 방법과 SELinux에서 이 데몬이 사전 정의된(SELinux 정책) TCP 포트에서 실행될 것으로 예상하는 방법을 보여줍니다. 그러면 비표준 포트에서 rsync 데몬이 정상적으로 실행되도록 SELinux 정책을 수정하는 방법을 보여줍니다.
이 예제는 단일 시스템에서 SELinux 정책 및 로컬 데몬 및 프로세스에 대한 제어 권한을 시연하기 위해 수행됩니다. 이 예제는 SELinux가 rsync에 어떤 영향을 미칠 수 있는지를 보여줍니다. rsync의 포괄적인 설명서는 이 문서의 범위를 벗어납니다. 자세한 내용은 공식 rsync 설명서 를 참조하십시오. 이 예제에서는 rsync,setroubleshoot-serveraudit 패키지가 설치되어 있다고 가정하고, SELinux 대상 정책이 사용되며 SELinux가 강제 모드로 실행 중이라고 가정합니다.

절차 22.1. rsync가 rsync로 시작됨_t

  1. getenforce 명령을 실행하여 SELinux가 강제 모드에서 실행 중인지 확인합니다.
    ~]$ getenforce
    Enforcing
    
    Copy to Clipboard Toggle word wrap
    이 명령은 SELinux가 강제 모드에서 실행되는 경우 Enforcing 을 반환합니다.
  2. 다음 명령을 실행하여 rsync 바이너리가 시스템 경로에 있는지 확인합니다.
    ~]$ which rsync
    /usr/bin/rsync
    
    Copy to Clipboard Toggle word wrap
  3. rsync를 데몬으로 실행하는 경우 구성 파일을 사용하고 /etc/rsyncd.conf 로 저장해야 합니다. 이 예제에서 사용되는 다음 구성 파일은 매우 간단하며 사용 가능한 모든 옵션을 나타내는 것이 아니라 rsync 데몬을 시연하는 데 충분합니다.
    log file = /var/log/rsync.log
    pid file = /var/run/rsyncd.pid
    lock file = /var/run/rsync.lock
    [files]
    	path = /srv/rsync
            comment = file area
            read only = false
            timeout = 300
    
    Copy to Clipboard Toggle word wrap
  4. 이제 rsync가 데몬 모드에서 작동하도록 간단한 구성 파일이 있으므로 다음 명령을 실행하여 시작할 수 있습니다.
    ~]# systemctl start rsyncd.service
    Copy to Clipboard Toggle word wrap
    rsyncd 가 성공적으로 시작되었는지 확인합니다(아래 출력과 유사하게 표시되어야 하며 타임 스탬프만 다릅니다).
    ~]# systemctl status rsyncd.service
    rsyncd.service - fast remote file copy program daemon
       Loaded: loaded (/usr/lib/systemd/system/rsyncd.service; disabled)
       Active: active (running) since Thu 2014-02-27 09:46:24 CET; 2s ago
     Main PID: 3220 (rsync)
       CGroup: /system.slice/rsyncd.service
               └─3220 /usr/bin/rsync --daemon --no-detach
    
    Copy to Clipboard Toggle word wrap
    이제 rsync_t 도메인에서 실행 중이므로 SELinux는 rsync 데몬을 통해 보호 메커니즘을 적용할 수 있습니다.
    ~]$ ps -eZ | grep rsync
    system_u:system_r:rsync_t:s0     3220 ?        00:00:00 rsync
    
    Copy to Clipboard Toggle word wrap
이 예에서는 rsync_t 도메인에서 rsyncd 실행을 수행하는 방법을 보여줍니다. rsync는 소켓이 활성화된 서비스로도 실행할 수 있습니다. 이 경우 클라이언트가 서비스에 연결을 시도할 때까지 rsyncd 가 실행되지 않습니다. rsyncd 가 소켓 활성화 서비스로 실행되도록 하려면 위의 단계를 따르십시오. rsyncd 를 소켓 활성화 서비스로 시작하려면 root로 다음 명령을 입력합니다.
~]# systemctl start rsyncd.socket
Copy to Clipboard Toggle word wrap
다음 예제에서는 이 데몬이 기본이 아닌 포트에서 성공적으로 실행되도록 하는 방법을 보여줍니다. 다음 예제에서는 TCP 포트 10000이 사용됩니다.

절차 22.2. 기본이 아닌 포트에서 rsync 데몬 실행

  1. /etc/rsyncd.conf 파일을 수정하고 글로벌 구성 영역에 있는 파일 상단에 port = 10000 행을 추가합니다(즉, 파일 영역을 정의하기 전에). 새 구성 파일은 다음과 같이 나타납니다.
    log file = /var/log/rsyncd.log
    pid file = /var/run/rsyncd.pid
    lock file = /var/run/rsync.lock
    port = 10000
    [files]
            path = /srv/rsync
            comment = file area
            read only = false
    	timeout = 300
    
    Copy to Clipboard Toggle word wrap
  2. 이 새 설정으로 rsync 데몬을 시작하면 다음과 유사한 거부 메시지가 SELinux에 의해 기록됩니다.
    Jul 22 10:46:59 localhost setroubleshoot: SELinux is preventing the rsync (rsync_t) from binding to port 10000. For complete SELinux messages, run sealert -l c371ab34-639e-45ae-9e42-18855b5c2de8
    
    Copy to Clipboard Toggle word wrap
  3. semanage 유틸리티를 사용하여 rsync_port_t:의 SELinux 정책에 TCP 포트 10000을 추가합니다.
    ~]# semanage port -a -t rsync_port_t -p tcp 10000
    Copy to Clipboard Toggle word wrap
  4. 이제 TCP 포트 10000이 rsync_port_t 의 SELinux 정책에 추가되었으므로rsyncd 가 이 포트에서 정상적으로 시작되고 작동합니다.
    ~]# systemctl start rsyncd.service
    Copy to Clipboard Toggle word wrap
    ~]# netstat -lnp | grep 10000
    tcp        0      0 0.0.0.0:10000   0.0.0.0:*      LISTEN      9910/rsync
    
    Copy to Clipboard Toggle word wrap
SELinux는 정책을 수정했으며 이제 rsyncd 가 TCP 포트 10000에서 작동할 수 있도록 허용합니다.


[20] 자세한 내용은 Rsync 프로젝트 페이지를 참조하십시오.
[21] rsync 및 SELinux에 대한 자세한 내용은 rsync_selinux(8) 도움말 페이지를 참조하십시오.

23장. Postfix

Postfix는 LDAP, SMTP AUTH(SASL) 및 TLS와 같은 프로토콜을 지원하는 오픈 소스MTA(메일 전송 에이전트)입니다.[22]
Red Hat Enterprise Linux에서 postfix 패키지는 Postfix를 제공합니다. 다음 명령을 입력하여 postfix 패키지가 설치되어 있는지 확인합니다.
~]$ rpm -q postfix
package postfix is not installed
Copy to Clipboard Toggle word wrap
설치되지 않은 경우 yum 유틸리티 root를 사용하여 설치합니다.
~]# yum install postfix
Copy to Clipboard Toggle word wrap

23.1. Postfix 및 SELinux

Postfix가 활성화되면 기본적으로 제한된 상태로 실행됩니다. 제한된 프로세스는 자체 도메인에서 실행되며 다른 제한된 프로세스와 분리됩니다. SELinux 정책 구성에 따라 공격자가 제한된 프로세스가 손상되면 공격자가 리소스에 대한 액세스와 가능한 손상을 제한합니다. 다음 예제에서는 자체 도메인에서 실행되는 Postfix 및 관련 프로세스를 보여줍니다. 이 예제에서는 postfix 패키지가 설치되어 있고 Postfix 서비스가 시작되었다고 가정합니다.
  1. getenforce 명령을 실행하여 SELinux가 강제 모드에서 실행 중인지 확인합니다.
    ~]$ getenforce
    Enforcing
    
    Copy to Clipboard Toggle word wrap
    이 명령은 SELinux가 강제 모드에서 실행되는 경우 Enforcing 을 반환합니다.
  2. 다음 명령을 root 사용자로 입력하여 postfix 를 시작합니다.
    ~]# systemctl start postfix.service
    Copy to Clipboard Toggle word wrap
    서비스가 실행 중인지 확인합니다. 출력에는 아래 정보가 포함되어야 합니다(시간 스탬프만 다릅니다).
    ~]# systemctl status postfix.service
    postfix.service - Postfix Mail Transport Agent
       Loaded: loaded (/usr/lib/systemd/system/postfix.service; disabled)
       Active: active (running) since Mon 2013-08-05 11:38:48 CEST; 3h 25min ago
    
    Copy to Clipboard Toggle word wrap
  3. 다음 명령을 실행하여 postfix 프로세스를 확인합니다.
    ~]$ ps -eZ | grep postfix
    system_u:system_r:postfix_master_t:s0 1651 ?   00:00:00 master
    system_u:system_r:postfix_pickup_t:s0 1662 ?   00:00:00 pickup
    system_u:system_r:postfix_qmgr_t:s0 1663 ?     00:00:00 qmgr
    
    Copy to Clipboard Toggle word wrap
    위의 출력에서 everything 마스터 프로세스와 연결된 SELinux 컨텍스트는 system_u:system_r: Cryostat_master_t:s0 입니다. 컨텍스트의 마지막 부분인 postfix_master_t 는 이 프로세스의 유형입니다. 유형은 프로세스 및 파일의 유형에 대한 도메인을 정의합니다. 이 경우 master 프로세스는 postfix_master_t 도메인에서 실행됩니다.

23.2. 유형

고급 프로세스 격리를 제공하기 위해 SELinux 대상 정책에 사용되는 기본 권한 제어 방법은 Type Enforcement입니다. 모든 파일과 프로세스는 유형으로 레이블이 지정됩니다. type은 프로세스의 SELinux 도메인과 파일의 SELinux 유형을 정의합니다. SELinux 정책 규칙은 유형에 액세스하는 도메인이든 다른 도메인에 액세스하는 도메인이든 관계없이 유형이 서로 액세스하는 방법을 정의합니다. 액세스는 허용하는 특정 SELinux 정책 규칙이 있는 경우에만 허용됩니다.
다음 유형은 Postfix와 함께 사용됩니다. 유연한 액세스를 구성할 수 있는 다양한 유형:
postfix_etc_t
이 유형은 /etc/ Cryostat/ 디렉터리에 있는 Cryostat의 구성 파일에 사용됩니다.
postfix_data_t
이 유형은 /var/lib/ Cryostat/ 디렉터리의 Cryostat 데이터 파일에 사용됩니다.
postfix_var_run_t
이 유형은 /run/ 디렉터리에 저장된 Cryostat 파일에 사용됩니다.
postfix_initrc_exec_t
CloudEvent 실행 파일의 레이블은 postfix_initrc_exec_t 유형으로 지정됩니다. 실행하면 postfix_initrc_t 도메인으로 전환됩니다.
postfix_spool_t
이 유형은 /var/spool/ 디렉터리에 저장된 Cryostat 파일에 사용됩니다.
참고
전체 파일 목록과 Postfix의 유형을 보려면 다음 명령을 입력합니다.
~]$ grep postfix /etc/selinux/targeted/contexts/files/file_contexts
Copy to Clipboard Toggle word wrap

23.3. 부울

SELinux는 서비스를 실행하는 데 필요한 최소 액세스 수준을 기반으로 합니다. 서비스는 다양한 방법으로 실행할 수 있으므로 서비스 실행 방법을 지정해야 합니다. 다음 부울을 사용하여 SELinux를 설정합니다.
postfix_local_write_mail_spool
이 부울을 활성화하면 Postfix가 시스템의 로컬 메일 스풀에 쓸 수 있습니다. 로컬 스풀을 사용하는 경우 정상적인 작업에 이 부울을 활성화해야 합니다.
참고
SELinux 정책의 지속적인 개발로 인해 위의 목록에 항상 서비스와 관련된 부울이 모두 포함되지 않을 수 있습니다. 나열하려면 다음 명령을 입력합니다.
~]$ getsebool -a | grep service_name
Copy to Clipboard Toggle word wrap
특정 부울에 대한 설명을 보려면 다음 명령을 입력합니다.
~]$ sepolicy booleans -b boolean_name
Copy to Clipboard Toggle word wrap
이 명령이 작동하려면 sepolicy 유틸리티를 제공하는 추가 policycoreutils-devel 패키지가 필요합니다.

23.4. 설정 예

23.4.1. SpamAssassin 및 Postfix

SpamAssasin은 수신 이메일에서 원하지 않는 이메일(스왑 메시지)을 필터링하는 방법을 제공하는 오픈 소스 메일 필터입니다.[23]
Red Hat Enterprise Linux를 사용하는 경우 스파스ass in 패키지는 SpamAssassin을 제공합니다. 다음 명령을 입력하여 스파스assin 패키지가 설치되어 있는지 확인합니다.
~]$ rpm -q spamassassin
package spamassassin is not installed
Copy to Clipboard Toggle word wrap
설치되지 않은 경우 yum 유틸리티를 root로 사용하여 설치합니다.
~]# yum install spamassassin
Copy to Clipboard Toggle word wrap
SpamAssassin은 스팸 필터링 기능을 제공하기 위해 Postfix와 같은 메일러와 함께 작동합니다. SpamAssassin이 메일을 효과적으로 가로채기, 분석 및 필터링하려면 네트워크 인터페이스에서 수신 대기해야 합니다. SpamAssassin의 기본 포트는 TCP/783이지만 변경할 수 있습니다. 다음 예제에서는 SELinux가 기본적으로 특정 포트에 대한 액세스만 허용하여 SpamAssassin을 보완하는 방법을 보여주는 실제 데모를 제공합니다. 이 예제에서는 포트를 변경하는 방법을 보여주며 기본이 아닌 포트에서 SpamAssassin이 작동하도록 합니다.
이 예제는 SELinux가 SpamAssassin의 간단한 설정에 어떤 영향을 줄 수 있는지를 보여줍니다. SpamAssassin에 대한 포괄적인 설명서는 이 문서의 범위를 벗어납니다. 자세한 내용은 공식 SpamAssassin 설명서 를 참조하십시오. 이 예제에서는 스파스 키언이 설치되어 있다고 가정하고, 사용 중인 포트에 대한 액세스를 허용하도록 방화벽이 구성되었다고 가정하고, SELinux 대상 정책이 사용 중이며 SELinux가 강제 모드로 실행 중이라고 가정합니다.

절차 23.1. 기본이 아닌 포트에서 SpamAssassin 실행

  1. semanage 유틸리티를 root로 사용하여 SELinux에서 기본적으로 spamd 데몬이 수신 대기할 수 있는 포트를 표시합니다.
    ~]# semanage port -l | grep spamd
    spamd_port_t		tcp	783
    
    Copy to Clipboard Toggle word wrap
    이 출력은 TCP/783이 작동하는 SpamAssassin의 포트로 spamd_port_t 에 정의되어 있음을 보여줍니다.
  2. /etc/sysconfig/spamassassin 구성 파일을 편집하고 예제 TCP/10000에서 SpamAssassin을 시작하도록 수정합니다.
    # Options to spamd
    SPAMDOPTIONS="-d -p 10000 -c m5 -H"
    
    Copy to Clipboard Toggle word wrap
    이 행은 이제 SpamAssassin이 포트 10000에서 작동하도록 지정합니다. 이 예제의 나머지 부분은 이 소켓을 열 수 있도록 SELinux 정책을 수정하는 방법을 보여줍니다.
  3. 시작 SpamAssassin 및 다음과 유사한 오류 메시지가 나타납니다.
    ~]# systemctl start spamassassin.service
    Job for spamassassin.service failed. See 'systemctl status spamassassin.service' and 'journalctl -xn' for details.
    
    Copy to Clipboard Toggle word wrap
    이 출력은 SELinux가 이 포트에 대한 액세스를 차단했음을 의미합니다.
  4. 다음과 유사한 거부 메시지가 SELinux에 의해 기록됩니다.
    SELinux is preventing the spamd (spamd_t) from binding to port 10000.
    
    Copy to Clipboard Toggle word wrap
  5. root 로 semanage 를 실행하여 SpamAssassin이 예제 포트(TCP/10000)에서 작동할 수 있도록 SELinux 정책을 수정합니다.
    ~]# semanage port -a -t spamd_port_t -p tcp 10000
    Copy to Clipboard Toggle word wrap
  6. 이제 SpamAssassin이 TCP 포트 10000에서 시작되고 작동하는지 확인합니다.
    ~]# systemctl start spamassassin.service
    
    ~]# netstat -lnp | grep 10000
    tcp	0	0 127.0.0.1:10000	0.0.0.0:*	LISTEN	2224/spamd.pid
    
    Copy to Clipboard Toggle word wrap
  7. 이 시점에서 spamd 는 SELinux 정책에서 해당 포트에 액세스할 수 있으므로 TCP 포트 10000에서 올바르게 작동합니다.

24장. DHCP

dhcpd 데몬은 Red Hat Enterprise Linux에서 클라이언트에 대한 계층 3 TCP/IP 세부 정보를 동적으로 제공하고 구성하는 데 사용됩니다.
dhcp 패키지는 DHCP 서버와 dhcpd 데몬을 제공합니다. 다음 명령을 입력하여 dhcp 패키지가 설치되어 있는지 확인합니다.
~]# rpm -q dhcp
package dhcp is not installed
Copy to Clipboard Toggle word wrap
설치되지 않은 경우 yum 유틸리티를 root로 사용하여 설치합니다.
~]# yum install dhcp
Copy to Clipboard Toggle word wrap

24.1. DHCP 및 SELinux

dhcpd 가 활성화되면 기본적으로 제한됩니다. 제한된 프로세스는 자체 도메인에서 실행되며 다른 제한된 프로세스와 분리됩니다. SELinux 정책 구성에 따라 공격자가 제한된 프로세스가 손상되면 공격자가 리소스에 대한 액세스와 가능한 손상을 제한합니다. 다음 예제에서는 dhcpd 및 자체 도메인에서 실행되는 관련 프로세스를 보여줍니다. 이 예제에서는 dhcp 패키지가 설치되어 있고 dhcpd 서비스가 시작되었다고 가정합니다.
  1. getenforce 명령을 실행하여 SELinux가 강제 모드에서 실행 중인지 확인합니다.
    ~]$ getenforce
    Enforcing
    
    Copy to Clipboard Toggle word wrap
    이 명령은 SELinux가 강제 모드에서 실행되는 경우 Enforcing 을 반환합니다.
  2. root 사용자로 다음 명령을 입력하여 dhcpd:을 시작합니다.
    ~]# systemctl start dhcpd.service
    Copy to Clipboard Toggle word wrap
    서비스가 실행 중인지 확인합니다. 출력에는 아래 정보가 포함되어야 합니다(시간 스탬프만 다릅니다).
    ~]# systemctl status dhcpd.service
    dhcpd.service - DHCPv4 Server Daemon
       Loaded: loaded (/usr/lib/systemd/system/dhcpd.service; disabled)
       Active: active (running) since Mon 2013-08-05 11:49:07 CEST; 3h 20min ago
    Copy to Clipboard Toggle word wrap
  3. 다음 명령을 실행하여 dhcpd 프로세스를 확인합니다.
    ~]$ ps -eZ | grep dhcpd
    system_u:system_r:dhcpd_t:s0 5483 ?        00:00:00 dhcpd
    
    Copy to Clipboard Toggle word wrap
    dhcpd 프로세스와 관련된 SELinux 컨텍스트는 system_u:system_r:dhcpd_t:s0 입니다.

24.2. 유형

고급 프로세스 격리를 제공하기 위해 SELinux 대상 정책에 사용되는 기본 권한 제어 방법은 Type Enforcement입니다. 모든 파일과 프로세스는 유형으로 레이블이 지정됩니다. type은 프로세스의 SELinux 도메인과 파일의 SELinux 유형을 정의합니다. SELinux 정책 규칙은 유형에 액세스하는 도메인이든 다른 도메인에 액세스하는 도메인이든 관계없이 유형이 서로 액세스하는 방법을 정의합니다. 액세스는 허용하는 특정 SELinux 정책 규칙이 있는 경우에만 허용됩니다.
DHCP와 함께 다음 유형이 사용됩니다.
dhcp_etc_t
이 유형은 주로 구성 파일을 포함하여 /etc 디렉토리의 파일에 사용됩니다.
dhcpd_var_run_t
이 유형은 dhcpd 의 PID 파일에 /var/run/ 디렉터리에 사용됩니다.
dhcpd_exec_t
이 유형은 DHCP 실행 파일을 dhcpd_t 도메인으로 전환하는 데 사용됩니다.
dhcpd_initrc_exec_t
이 유형은 DHCP 실행 파일을 dhcpd_initrc_t 도메인으로 전환하는 데 사용됩니다.
참고
dhcpd 의 전체 파일 목록과 해당 유형을 보려면 다음 명령을 입력합니다.
~]$ grep dhcp /etc/selinux/targeted/contexts/files/file_contexts
Copy to Clipboard Toggle word wrap

25장. Red Hat의 OpenShift

Red Hat의 OpenShift는 개발자가 웹 애플리케이션을 빌드하고 배포할 수 있는 PaaS(서비스로서의 플랫폼)입니다. OpenShift는 Java, Ruby 및 PHP를 비롯한 다양한 프로그래밍 언어 및 프레임워크를 제공합니다. 또한 Eclipse 통합, JBoss Developer Studio 및 Jenkins를 비롯한 애플리케이션 라이프사이클을 지원하는 통합 개발자 툴도 제공합니다. OpenShift는 오픈 소스 에코시스템을 사용하여 모바일 애플리케이션, 데이터베이스 서비스 등을 위한 플랫폼을 제공합니다. [24]
Red Hat Enterprise Linux에서 openshift-clients 패키지는 OpenShift 클라이언트 툴을 제공합니다. 다음 명령을 입력하여 해당 명령이 설치되었는지 확인합니다.
~]$ rpm -q openshift-clients
package openshift-clients is not installed
Copy to Clipboard Toggle word wrap
중요
이전에는 rhc 패키지에서 OpenShift 클라이언트 툴을 제공했습니다. 최신 OpenShift 버전에서는 이 패키지가 더 이상 사용되지 않으며 Red Hat에서 더 이상 지원되지 않습니다. 따라서 OpenShift 버전 2 이후에 rhc 패키지는 지원되는 OpenShift 버전에 사용되는 OpenShift 클라이언트 툴을 제공하는 openshift-clients 패키지로 교체됩니다.

25.1. OpenShift 및 SELinux

SELinux는 모든 프로세스가 SELinux 정책에 따라 레이블이 지정되므로 OpenShift를 사용하는 애플리케이션에 대해 더 나은 보안 제어를 제공합니다. 따라서 SELinux는 동일한 노드에서 실행되는 다양한 기어 내에서 가능한 악의적인 공격으로부터 OpenShift를 보호합니다.
SELinux 및 OpenShift에 대한 자세한 내용은 Dan Walsh의 프레젠테이션을 참조하십시오.

25.2. 유형

고급 프로세스 격리를 제공하기 위해 SELinux 대상 정책에 사용되는 기본 권한 제어 방법은 Type Enforcement입니다. 모든 파일과 프로세스는 유형으로 레이블이 지정됩니다. type은 프로세스의 SELinux 도메인과 파일의 SELinux 유형을 정의합니다. SELinux 정책 규칙은 유형에 액세스하는 도메인이든 다른 도메인에 액세스하는 도메인이든 관계없이 유형이 서로 액세스하는 방법을 정의합니다. 액세스는 허용하는 특정 SELinux 정책 규칙이 있는 경우에만 허용됩니다.
다음 유형은 OpenShift와 함께 사용됩니다. 다양한 유형을 사용하여 유연한 액세스를 구성할 수 있습니다.

프로세스 유형

openshift_t
OpenShift 프로세스는 openshift_t SELinux 유형과 연결되어 있습니다.

실행 파일 유형

openshift_cgroup_read_exec_t
SELinux를 사용하면 이 유형의 파일이 실행 파일을 openshift_cgroup_read_t 도메인으로 전환할 수 있습니다.
openshift_cron_exec_t
SELinux를 사용하면 이 유형의 파일이 실행 파일을 openshift_cron_t 도메인으로 전환할 수 있습니다.
openshift_initrc_exec_t
SELinux를 사용하면 이 유형의 파일이 실행 파일을 openshift_initrc_t 도메인으로 전환할 수 있습니다.

쓰기 가능한 유형

openshift_cgroup_read_tmp_t
이 유형을 사용하면 OpenShift 제어 그룹(cgroup)이 /tmp 디렉터리의 임시 파일을 읽고 액세스할 수 있습니다.
openshift_cron_tmp_t
이 유형을 사용하면 OpenShift cron 작업의 임시 파일을 /tmp 에 저장할 수 있습니다.
openshift_initrc_tmp_t
이 유형을 사용하면 OpenShift initrc 임시 파일을 /tmp 에 저장할 수 있습니다.
openshift_log_t
이 유형의 파일은 OpenShift 로그 데이터로 취급되며 일반적으로 /var/log/ 디렉터리에 저장됩니다.
openshift_rw_file_t
OpenShift는 이 유형으로 레이블이 지정된 파일에 읽고 쓸 수 있는 권한을 갖습니다.
openshift_tmp_t
이 유형은 OpenShift 임시 파일을 /tmp 에 저장하는 데 사용됩니다.
openshift_tmpfs_t
이 유형을 사용하면 OpenShift 데이터를 tmpfs 파일 시스템에 저장할 수 있습니다.
openshift_var_lib_t
이 유형을 사용하면 OpenShift 파일을 /var/lib/ 디렉터리에 저장할 수 있습니다.
openshift_var_run_t
이 유형을 사용하면 OpenShift 파일을 /run/ 또는 /var/run/ 디렉터리에 저장할 수 있습니다.

25.3. 부울

SELinux는 서비스를 실행하는 데 필요한 최소 액세스 수준을 기반으로 합니다. 서비스는 다양한 방법으로 실행할 수 있으므로 서비스 실행 방법을 지정해야 합니다. 다음 부울을 사용하여 SELinux를 설정합니다.
openshift_use_nfs
이 부울을 활성화하면 NFS 공유에 OpenShift를 설치할 수 있습니다.
참고
SELinux 정책의 지속적인 개발로 인해 위의 목록에 항상 서비스와 관련된 부울이 모두 포함되지 않을 수 있습니다. 나열하려면 다음 명령을 입력합니다.
~]$ getsebool -a | grep service_name
Copy to Clipboard Toggle word wrap
특정 부울에 대한 설명을 보려면 다음 명령을 입력합니다.
~]$ sepolicy booleans -b boolean_name
Copy to Clipboard Toggle word wrap
이 명령이 작동하려면 sepolicy 유틸리티를 제공하는 추가 policycoreutils-devel 패키지가 필요합니다.

25.4. 설정 예

25.4.1. 기본 OpenShift 디렉터리 변경

기본적으로 OpenShift는 해당 데이터를 openshift_var_lib_t SELinux 유형으로 레이블이 지정된 /var/lib/openshift/ 디렉터리에 저장합니다. OpenShift가 다른 디렉터리에 데이터를 저장할 수 있도록 하려면 새 디렉터리의 레이블을 적절한 SELinux 컨텍스트로 지정합니다.
다음 절차에서는 데이터를 /srv/openshift/:에 저장하기 위해 기본 OpenShift 디렉터리를 변경하는 방법을 보여줍니다.

절차 25.1. 데이터 저장을 위한 기본 OpenShift 디렉터리 변경

  1. root 로서 /srv 디렉터리에 새 openshift/ 디렉터리를 만듭니다. 새 디렉터리는 var_t 유형으로 레이블이 지정됩니다.
    ~]# mkdir /srv/openshift
    Copy to Clipboard Toggle word wrap
    ~]$ ls -Zd /srv/openshift
    drwxr-xr-x. root root unconfined_u:object_r:var_t:s0   openshift/
    
    Copy to Clipboard Toggle word wrap
  2. root 로 semanage 유틸리티를 사용하여 /srv/openshift/ 를 적절한 SELinux 컨텍스트에 매핑합니다.
    ~]# semanage fcontext -a -e /var/lib/openshift /srv/openshift
    Copy to Clipboard Toggle word wrap
  3. 그런 다음 restorecon 유틸리티를 root로 사용하여 변경 사항을 적용합니다.
    ~]# restorecon -R -v /srv/openshift
    Copy to Clipboard Toggle word wrap
  4. 이제 /srv/openshift/ 디렉터리에 올바른 openshift_var_lib_t 유형으로 레이블이 지정됩니다.
    ~]$ ls -Zd /srv/openshift
    drwxr-xr-x. root root unconfined_u:object_r:openshift_var_lib_t:s0   openshift/
    
    Copy to Clipboard Toggle word wrap

26장. IdM (Identity Management)

IdM(Identity Management)은 PAM, LDAP, Kerberos, DNS, NTP, 인증서 서비스를 비롯한 표준 정의 일반 네트워크 서비스를 위한 통합 환경을 제공합니다. IdM 을 사용하면 Red Hat Enterprise Linux 시스템이 도메인 컨트롤러 역할을 할 수 있습니다.[25]
Red Hat Enterprise Linux에서 ipa-server 패키지는 IdM 서버를 제공합니다. 다음 명령을 입력하여 ipa-server 패키지가 설치되어 있는지 확인합니다.
~]$ rpm -q ipa-server
package ipa-server is not installed
Copy to Clipboard Toggle word wrap
설치되지 않은 경우 root 사용자로 다음 명령을 입력하여 설치합니다.
~]# yum install ipa-server
Copy to Clipboard Toggle word wrap

26.1. ID 관리 및 SELinux

ID 관리는 IdM 사용자가 IdM 액세스 권한에 대한 SELinux 컨텍스트를 지정할 수 있도록 호스트당 SELinux 역할을 구성하도록 매핑할 수 있습니다. 사용자 로그인 프로세스 중에SSSD(System Security Services Daemon)는 특정 IdM 사용자에 대해 정의된 액세스 권한을 쿼리합니다. 그런 다음 pam_selinux 모듈은 IdM 액세스 권한에 따라 적절한 SELinux 컨텍스트로 사용자 프로세스를 시작하기 위해 커널에 요청을 보냅니다(예: guest_u:guest_r:guest_t:s0 ).
ID 관리 및 SELinux에 대한 자세한 내용은 Red Hat Enterprise Linux 7용 Linux 도메인, ID, 인증 및 정책 가이드를 참조하십시오.

26.1.1. Active Directory 도메인 신뢰

이전 버전의 Red Hat Enterprise Linux에서는 Identity Management를 사용하여AD(Active Directory) 도메인의 사용자가 IdM 도메인에 저장된 데이터에 액세스할 수 있도록 WinSync 유틸리티를 사용했습니다. 이를 위해 WinSync 는 AD 서버에서 로컬 서버로 사용자 및 그룹 데이터를 복제하고 데이터를 동기화된 상태로 유지해야 했습니다.
Red Hat Enterprise Linux 7에서 SSSD 데몬은 AD 및 사용자와 함께 작동하도록 향상되었습니다. IdM과 AD 도메인 간에 신뢰할 수 있는 관계를 생성할 수 있습니다. 사용자 및 그룹 데이터는 AD 서버에서 직접 읽습니다. 또한 AD 및 IdM 도메인 간에SSO(Single Sign-On) 인증을 허용하는 Kerberos 교차 영역 신뢰도 제공됩니다. SSO가 설정된 경우 AD 도메인의 사용자는 암호 없이 IdM 도메인에 저장된 Kerberos로 보호되는 데이터에 액세스할 수 있습니다.
이 기능은 기본적으로 설치되지 않습니다. 이를 사용하려면 추가 ipa-server-trust-ad 패키지를 설치합니다.

26.2. 설정 예

26.2.1. IdM 사용자에게 SELinux 사용자를 매핑

다음 절차에서는 새 SELinux 매핑을 생성하는 방법과 이 매핑에 새 IdM 사용자를 추가하는 방법을 보여줍니다.

절차 26.1. SELinux 맵핑에 사용자 추가 방법

  1. 새 SELinux 매핑을 만들려면 다음 명령을 입력합니다. 여기서 SELinux_mapping 은 새 SELinux 매핑의 이름이며 --selinuxuser 옵션은 특정 SELinux 사용자를 지정합니다.
    ~]$ ipa selinuxusermap-add SELinux_mapping --selinuxuser=staff_u:s0-s0:c0.c1023
    Copy to Clipboard Toggle word wrap
  2. 다음 명령을 입력하여 tuser 사용자 이름이 있는 IdM 사용자를 SELinux 매핑에 추가합니다.
    ~]$ ipa selinuxusermap-add-user --users=tuser SELinux_mapping
    Copy to Clipboard Toggle word wrap
  3. ipaclient.example.com 이라는 새 호스트를 SELinux 매핑에 추가하려면 다음 명령을 입력합니다.
    ~]$ ipa selinuxusermap-add-host --hosts=ipaclient.example.com SELinux_mapping
    Copy to Clipboard Toggle word wrap
  4. ipaclient.example.com 호스트에 로그인할 때 tuser 사용자는 staff_u:s0-s0:c0.c1023 레이블을 가져옵니다.
    [tuser@ipa-client]$ id -Z
    staff_u:staff_r:staff_t:s0-s0:c0.c1023
    
    Copy to Clipboard Toggle word wrap


[25] ID 관리에 대한 자세한 내용은 Red Hat Enterprise Linux 7용 Linux 도메인, ID, 인증 및 정책 가이드를 참조하십시오.

27장. Red Hat Gluster Storage

Red Hat Gluster Storage 는 기업에 유연하고 경제적인 비구조적 데이터 스토리지를 제공합니다. Gluster의 주요 구성 요소인 GlusterFS 는 스택 가능한 사용자 공간 설계를 기반으로 하며 다양한 스토리지 서버를 네트워크를 통해 집계하고 이를 하나의 대형 병렬 네트워크 파일 시스템으로 상호 연결합니다. XFS 파일 시스템 형식을 사용하여 디스크에 데이터를 저장하는 POSIX 호환 GlusterFS 서버는 NFS 및 CIFS를 포함한 업계 표준 액세스 프로토콜을 사용하여 액세스할 수 있습니다.
자세한 내용은 제품 설명서에서 Red Hat Gluster Storage 컬렉션 가이드를 참조하십시오.
glusterfs-server 패키지는 Red Hat Gluster Storage를 제공합니다. 설치 프로세스에 대한 자세한 내용은 Red Hat Gluster Storage 설치 가이드를 참조하십시오.

27.1. Red Hat Gluster Storage 및 SELinux

활성화된 경우 SELinux는 Red Hat Gluster Storage의 일부로 glusterd (GlusterFS Management Service) 및 glusterfsd (NFS 서버) 프로세스에 대해 유연한 필수 액세스 제어를 제공하여 추가 보안 계층 역할을 합니다. 이러한 프로세스에는 glusterd_t SELinux 유형으로 고급 프로세스 격리가 바인딩되지 않습니다.

27.2. 유형

고급 프로세스 격리를 제공하기 위해 SELinux 대상 정책에 사용되는 기본 권한 제어 방법은 Type Enforcement입니다. 모든 파일과 프로세스는 유형으로 레이블이 지정됩니다. type은 프로세스의 SELinux 도메인과 파일의 SELinux 유형을 정의합니다. SELinux 정책 규칙은 유형에 액세스하는 도메인이든 다른 도메인에 액세스하는 도메인이든 관계없이 유형이 서로 액세스하는 방법을 정의합니다. 액세스는 허용하는 특정 SELinux 정책 규칙이 있는 경우에만 허용됩니다.
Red Hat Gluster Storage와 함께 다음 유형을 사용합니다. 다양한 유형을 사용하여 유연한 액세스를 구성할 수 있습니다.

프로세스 유형

glusterd_t
Gluster 프로세스는 glusterd_t SELinux 유형과 연결됩니다.

실행 파일 유형

glusterd_initrc_exec_t
Gluster init 스크립트 파일의 SELinux별 스크립트 유형 컨텍스트입니다.
glusterd_exec_t
Gluster 실행 파일의 SELinux 특정 실행 파일 유형 컨텍스트입니다.

포트 유형

gluster_port_t
이 유형은 glusterd 에 대해 정의됩니다. 기본적으로 glusterd 는 204007-24027 및 38465-38469 TCP 포트를 사용합니다.

파일 문맥

glusterd_brick_t
이 유형은 glusterd brick 데이터로 위협된 파일에 사용됩니다.
glusterd_conf_t
이 유형은 glusterd 구성 데이터와 연결되며 일반적으로 /etc 디렉토리에 저장됩니다.
glusterd_log_t
이 유형의 파일은 glusterd 로그 데이터로 취급되며 일반적으로 /var/log/ 디렉터리에 저장됩니다.
glusterd_tmp_t
이 유형은 /tmp 디렉터리에 glusterd 임시 파일을 저장하는 데 사용됩니다.
glusterd_var_lib_t
이 유형을 사용하면 /var/lib/ 디렉터리에 glusterd 파일을 저장할 수 있습니다.
glusterd_var_run_t
이 유형을 사용하면 /run/ 또는 /var /run/ 디렉터리에 glusterd 파일을 저장할 수 있습니다.

27.3. 부울

SELinux는 서비스를 실행하는 데 필요한 최소 액세스 수준을 기반으로 합니다. 서비스는 다양한 방법으로 실행할 수 있으므로 서비스 실행 방법을 지정해야 합니다. 다음 부울을 사용하여 SELinux를 설정합니다.
gluster_export_all_ro
이 부울을 사용하면 glusterfsd 에서 파일과 디렉터리를 읽기 전용으로 공유할 수 있습니다. 이 부울은 기본적으로 비활성화되어 있습니다.
gluster_export_all_rw
이 부울을 활성화하면 glusterfsd 에서 읽기 및 쓰기 액세스 권한이 있는 파일 및 디렉터리를 공유할 수 있습니다. 이 부울은 기본적으로 활성화되어 있습니다.
gluster_anon_write
이 부울을 활성화하면 glusterfsd 에서 public_content_rw_t SELinux 유형으로 레이블이 지정된 공용 파일을 수정할 수 있습니다.
참고
SELinux 정책의 지속적인 개발로 인해 위의 목록에 항상 서비스와 관련된 부울이 모두 포함되지 않을 수 있습니다. 나열하려면 다음 명령을 입력합니다.
~]$ getsebool -a | grep service_name
Copy to Clipboard Toggle word wrap
특정 부울에 대한 설명을 보려면 다음 명령을 입력합니다.
~]$ sepolicy booleans -b boolean_name
Copy to Clipboard Toggle word wrap
이 명령이 작동하려면 sepolicy 유틸리티를 제공하는 추가 policycoreutils-devel 패키지가 필요합니다.

27.4. 설정 예

27.4.1. Gluster brick에 레이블 지정

Gluster brick은 신뢰할 수 있는 스토리지 풀에 있는 서버의 내보내기 디렉터리입니다. brick이 올바른 SELinux 컨텍스트인 glusterd_brick_t 로 레이블이 지정되지 않은 경우 SELinux는 특정 파일 액세스 작업을 거부하고 다양한 AVC 메시지를 생성합니다.
다음 절차에서는 Gluster brick에 올바른 SELinux 컨텍스트로 레이블을 지정하는 방법을 보여줍니다. 이 절차에서는 이전에 논리 볼륨을 생성하고 포맷한 것으로 가정합니다(예: /dev/rhgs/gluster )는 Gluster brick으로 사용됩니다.
Gluster brick에 대한 자세한 내용은 Red Hat Gluster Storage 관리 가이드 의 Red Hat Gluster Storage 볼륨 장을 참조하십시오.

절차 27.1. Gluster Brick에 레이블을 지정하는 방법

  1. 디렉터리를 만들어 이전에 포맷한 논리 볼륨을 마운트합니다. 예를 들어 다음과 같습니다.
    ~]# mkdir /mnt/brick1
    Copy to Clipboard Toggle word wrap
  2. 논리 볼륨(이 경우 /dev/vg-group/gluster )을 이전 단계에서 생성한 /mnt/brick1/ 디렉터리에 마운트합니다.
    ~]# mount /dev/vg-group/gluster /mnt/brick1/
    Copy to Clipboard Toggle word wrap
    mount 명령은 장치를 일시적으로만 마운트합니다. 장치를 영구적으로 마운트하려면 다음 항목과 유사한 항목을 /etc/fstab 파일에 추가합니다.
    /dev/vg-group/gluster    /mnt/brick1  xfs rw,inode64,noatime,nouuid      1 2
    Copy to Clipboard Toggle word wrap
    자세한 내용은 fstab(5) 도움말 페이지를 참조하십시오.
  3. /mnt/brick1/ 의 SELinux 컨텍스트를 확인합니다.
    ~]$ ls -lZd /mnt/brick1/
    drwxr-xr-x. root root system_u:object_r:unlabeled_t:s0 /mnt/brick1/
    Copy to Clipboard Toggle word wrap
    디렉터리에 레이블이 지정되지 않은 _t SELinux 유형으로 레이블이 지정됩니다.
  4. /mnt/brick1/ 의 SELinux 유형을 glusterd_brick_t SELinux 유형으로 변경합니다.
    ~]# semanage fcontext -a -t glusterd_brick_t "/mnt/brick1(/.*)?"
    Copy to Clipboard Toggle word wrap
  5. restorecon 유틸리티를 사용하여 변경 사항을 적용합니다.
    ~]# restorecon -Rv /mnt/brick1
    Copy to Clipboard Toggle word wrap
  6. 마지막으로 컨텍스트가 성공적으로 변경되었는지 확인합니다.
    ~]$ ls -lZd /mnt/brick1
    drwxr-xr-x. root root system_u:object_r:glusterd_brick_t:s0 /mnt/brick1/
    Copy to Clipboard Toggle word wrap

28장. 참고 자료

다음 참조는 SELinux와 관련이 있지만 본 가이드의 범위를 벗어난 추가 정보에 대한 포인터입니다. SELinux의 신속한 개발로 인해 이 자료 중 일부는 Red Hat Enterprise Linux의 특정 릴리스에만 적용될 수 있습니다.

서적

예제별 SELinux
Mayer, MacMillan 및 Caplan
Pcurrentice Hall, 2007년
SELinux: NSA의 오픈 소스 보안 강화 Linux
Bill Mcty
O'Reilly Media Inc., 2004

튜토리얼 및 도움말

Russell Coker의 튜토리얼 및 대화
Dan Walsh's Journal
Red Hat Knowledgebase

메일링 리스트

Fedora SELinux 메일링 리스트

커뮤니티

SELinux 프로젝트 Wiki
SELinux 커뮤니티 페이지
IRC
iRC.freenode.net, #selinux

부록 A. 개정 내역

고친 과정
고침 0.3-06Fri Aug 9 2019Mirek Jahoda
7.7 GA 게시 버전.
고침 0.3-05Sat Oct 20 2018Mirek Jahoda
7.6 GA 게시 버전.
고침 0.3-03Tue Apr 3 2018Mirek Jahoda
7.5 GA 게시 버전.
고침 0.3-01Thu Jul 13 2017Mirek Jahoda
7.4 GA 게시 버전.
고침 0.2-18Wed Nov 2 2016Mirek Jahoda
7.3 GA 게시 버전.
고침 0.2-11Sun Jun 26 2016Mirek Jahoda
수정 사항이 포함된 Async 릴리스.
고침 0.2-10Sun Feb 14 2016Robert Krátký
수정 사항이 포함된 Async 릴리스.
고침 0.2-9Thu Dec 10 2015Barbora Ančincová
Red Hat Gluster Storage 장이 추가되었습니다.
고침 0.2-8Thu Nov 11 2015Barbora Ančincová
Red Hat Enterprise Linux 7.2 GA GA 릴리스.
고침 0.2-7Thu Aug 13 2015Barbora Ančincová
Red Hat Enterprise Linux 7.2 베타 릴리스.
고침 0.2-6Wed Feb 18 2015Barbora Ančincová
Red Hat Enterprise Linux 7.1 GA 릴리스, 이 책.
고침 0.2-5Fri Dec 05 2014Barbora Ančincová
Red Hat 고객 포털에서 주문을 정렬하도록 업데이트.
고침 0.2-4Thu Dec 04 2014Barbora Ančincová
Red Hat Enterprise Linux 7.1 베타 버전의 설명서 릴리스.
고침 0.1-41Tue May 20 2014Tomáš Čapek
스타일 변경에 대해 다시 빌드합니다.
고침 0.1-1Tue Jan 17 2013Tomáš Čapek
Red Hat Enterprise Linux 7에 대한 책 초기 작성

법적 공지

Copyright © 2019 Red Hat, Inc.
이 문서는 Red Hat이 Creative Commons Attribution-ShareAlike 3.0 Unported License 에 따라 라이센스가 부여됩니다. 이 문서 또는 수정된 버전을 배포하는 경우 Red Hat, Inc.에 attribution을 제공하고 원본 버전에 대한 링크를 제공해야 합니다. 문서가 수정되면 모든 Red Hat 상표를 제거해야 합니다.
Red Hat은 이 문서의 라이센스 제공자로서 관련 법률이 허용하는 한도 내에서 CC-BY-SA의 섹션 4d를 시행할 권리를 포기하며 이를 주장하지 않을 것에 동의합니다.
Red Hat, Red Hat Enterprise Linux, Shadowman 로고, Red Hat 로고, JBoss, OpenShift, Fedora, Infinity 로고 및 RHCE는 미국 및 기타 국가에 등록된 Red Hat, Inc.의 상표입니다.
Linux® 는 미국 및 기타 국가에서 Linus Torvalds의 등록 상표입니다.
Java® 는 Oracle 및/또는 그 계열사의 등록 상표입니다.
XFS® 는 미국 및/또는 기타 국가에 있는 Silicon Graphics International Corp. 또는 그 자회사의 상표입니다.
MySQL® 은 미국, 유럽 연합 및 기타 국가에 있는 MySQL AB의 등록 상표입니다.
Node.js® 는 Joyent의 공식 상표입니다. Red Hat은 공식 Joyent Node.js 오픈 소스 또는 상용 프로젝트에 의해 공식적으로 관련이 있거나 보증되지 않습니다.
OpenStack® Word 마크 및 OpenStack 로고는 미국 및 기타 국가에서 OpenStack Foundation의 등록 상표/서비스 마크 또는 상표/서비스 마크이며 OpenStack Foundation의 권한과 함께 사용됩니다. 당사는 OpenStack Foundation 또는 OpenStack 커뮤니티와 제휴 관계가 아니며 보증 또는 후원을 받지 않습니다.
기타 모든 상표는 각각 해당 소유자의 자산입니다.
맨 위로 이동
Red Hat logoGithubredditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

Red Hat을 사용하는 고객은 신뢰할 수 있는 콘텐츠가 포함된 제품과 서비스를 통해 혁신하고 목표를 달성할 수 있습니다. 최신 업데이트를 확인하세요.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

Theme

© 2025 Red Hat