웹사이트 검색

Linux에서 SELinux 또는 AppArmor를 사용하여 필수 액세스 제어 구현


표준 ugo/rwx 권한 및 액세스 제어 목록의 한계를 극복하고 이를 통해 제공되는 보안 메커니즘을 강화하기 위해 미국 국가 안보국(NSA)은 유연한 < SELinux(Security Enhanced Linux의 약어)로 알려진 Strong>필수 액세스 제어(MAC) 방법으로 프로세스의 기능을 다음과 같이 제한합니다. 가능한 최소한의 권한으로 시스템 개체(예: 파일, 디렉터리, 네트워크 포트 등)에 액세스하거나 다른 작업을 수행하는 동시에 나중에 이 모델을 수정할 수 있도록 허용합니다.

인기 있고 널리 사용되는 또 다른 MAC는 SELinux에서 제공하는 기능 외에도 시스템이 '학습할 수 있는 학습 모드를 포함하는 AppArmor입니다. Strong> ”특정 애플리케이션이 어떻게 작동하는지, 그리고 안전한 애플리케이션 사용을 위해 프로필을 구성하여 제한을 설정합니다.

CentOS 7에서는 SELinux가 커널 자체에 통합되어 기본적으로 적용 모드에서 활성화됩니다(자세한 내용은 다음 섹션에서 설명). AppArmor를 사용하는 openSUSEUbuntu와 반대입니다.

이 기사에서는 SELinux 및 AppArmor의 필수 사항과 선택한 배포판에 따라 이러한 도구 중 하나를 사용하는 방법을 설명합니다.

SELinux 소개 및 CentOS 7에서 사용하는 방법

보안 강화 Linux는 두 가지 방식으로 작동할 수 있습니다.

  1. 강제: SELinux는 보안 엔진을 제어하는 일련의 지침인 SELinux 정책 규칙을 기반으로 액세스를 거부합니다.
  2. 허용: SELinux는 액세스를 거부하지 않지만 시행 모드에서 실행 중이라면 거부되었을 작업에 대한 거부가 기록됩니다.

SELinux를 비활성화할 수도 있습니다. 작동 모드 자체는 아니지만 여전히 옵션입니다. 하지만 이 도구를 사용하는 방법을 배우는 것이 그냥 무시하는 것보다 낫습니다. 명심 해!

SELinux의 현재 모드를 표시하려면 getenforce를 사용하세요. 작업 모드를 전환하려면 setenforce 0(허용으로 설정) 또는 setenforce 1(강제 )을 사용하세요. 강하다).

이 변경 사항은 재부팅 후에도 유지되지 않으므로 /etc/selinux/config 파일을 편집하고 SELINUX 변수를 다음 중 하나로 설정해야 합니다. 재부팅 시 지속성을 확보하기 위해 적용, 허용 또는 비활성화:

참고로, getenforce가 비활성화를 반환하면 원하는 작동 모드로 /etc/selinux/config를 편집하고 재부팅해야 합니다. 그렇지 않으면 setenforce를 사용하여 작업 모드를 설정(또는 전환)할 수 없습니다.

setenforce의 일반적인 용도 중 하나는 다음과 같은 애플리케이션 문제를 해결하기 위해 SELinux 모드(강제에서 허용 또는 그 반대 모드) 간을 전환하는 것입니다. 오작동하거나 예상대로 작동하지 않습니다. SELinux를 허용 모드로 설정한 후에 작동한다면 SELinux 권한 문제가 발생한 것이라고 확신할 수 있습니다.

SELinux를 처리해야 할 가능성이 가장 높은 두 가지 전형적인 사례는 다음과 같습니다.

  1. 데몬이 수신 대기하는 기본 포트를 변경합니다.
  2. /var/www/html 외부의 가상 호스트에 대한 DocumentRoot 지시문을 설정합니다.

다음 예를 통해 이 두 가지 사례를 살펴보겠습니다.

예 1: sshd 데몬의 기본 포트 변경

대부분의 시스템 관리자가 서버를 보호하기 위해 가장 먼저 수행하는 작업 중 하나는 SSH 데몬이 수신 대기하는 포트를 변경하는 것입니다. 이는 주로 포트 스캐너와 외부 공격자를 방지하기 위한 것입니다. 이를 위해 /etc/ssh/sshd_config의 Port 지시어와 다음과 같이 새 포트 번호를 사용합니다(이 경우 포트 9999 사용).


Port 9999

서비스를 다시 시작하려고 시도하고 상태를 확인한 후에는 시작하지 못한 것을 확인할 수 있습니다.


systemctl restart sshd
systemctl status sshd

/var/log/audit/audit.log를 살펴보면 sshd9999 포트에서 시작되지 못하는 것을 볼 수 있습니다. 이는 JBoss 관리 서비스용으로 예약된 포트이기 때문에 SELinux에 의해 생성됩니다(SELinux 로그 메시지에는 “AVC”라는 단어가 포함되어 있어 쉽게 다른 메시지에서 식별됨):


cat /var/log/audit/audit.log | grep AVC | tail -1

이 시점에서 대부분의 사람들은 아마도 SELinux를 비활성화하겠지만 우리는 그렇게 하지 않을 것입니다. 우리는 SELinux와 다른 포트에서 수신 대기 중인 sshd가 함께 조화를 이룰 수 있는 방법이 있다는 것을 알게 될 것입니다. policycoreutils-python 패키지가 설치되어 있는지 확인하고 다음을 실행하세요.


yum install policycoreutils-python

SELinux가 sshd가 수신 대기하도록 허용하는 포트 목록을 보려면 다음 이미지에서는 9999 포트가 다른 서비스용으로 예약되어 있어 당분간 다른 서비스를 실행하는 데 사용할 수 없음을 확인할 수 있습니다.


semanage port -l | grep ssh

물론 SSH용으로 다른 포트를 선택할 수도 있지만 JBoss 관련 서비스에 이 특정 시스템을 사용할 필요가 없다고 확신하는 경우 기존 SELinux 규칙을 수정하고 대신 해당 포트를 SSH에 할당할 수 있습니다.


semanage port -m -t ssh_port_t -p tcp 9999

그런 다음 첫 번째 semanage 명령을 사용하여 포트가 올바르게 할당되었는지 확인하거나 -lC 옵션(list custom의 약자)을 사용할 수 있습니다.


semanage port -lC
semanage port -l | grep ssh

이제 SSH를 다시 시작하고 포트 9999를 사용하여 서비스에 연결할 수 있습니다. 이 변경 사항은 재부팅 후에도 유지됩니다.

예 2: 가상 호스트에 대해 /var/www/html 외부에서 DocumentRoot 선택

DocumentRoot/var/www/html 이외의 디렉토리를 사용하여 Apache 가상 호스트를 설정해야 하는 경우(예: /websrv/sites) /gabriel/public_html):


DocumentRoot “/websrv/sites/gabriel/public_html”

index.html이 Apache가 액세스할 수 없는 default_t SELinux 유형으로 라벨이 지정되어 있으므로 Apache는 콘텐츠 제공을 거부합니다.


wget http://localhost/index.html
ls -lZ /websrv/sites/gabriel/public_html/index.html

이전 예와 마찬가지로 다음 명령을 사용하여 이것이 실제로 SELinux 관련 문제인지 확인할 수 있습니다.


cat /var/log/audit/audit.log | grep AVC | tail -1

/websrv/sites/gabriel/public_html의 레이블을 httpd_sys_content_t로 반복적으로 변경하려면 다음을 수행하십시오.


semanage fcontext -a -t httpd_sys_content_t "/websrv/sites/gabriel/public_html(/.*)?"

위 명령은 해당 디렉토리와 해당 내용에 대한 Apache 읽기 전용 액세스 권한을 부여합니다.

마지막으로 정책을 적용하고 라벨 변경 사항을 즉시 적용하려면 다음을 수행합니다.


restorecon -R -v /websrv/sites/gabriel/public_html

이제 디렉터리에 액세스할 수 있습니다.


wget http://localhost/index.html

SELinux에 대한 자세한 내용은 Fedora 22 SELinux 및 관리자 가이드를 참조하세요.