Linux에서 SELinux 또는 AppArmor를 사용하여 필수 액세스 제어 구현
표준 ugo/rwx
권한 및 액세스 제어 목록의 한계를 극복하고 이를 통해 제공되는 보안 메커니즘을 강화하기 위해 미국 국가 안보국(NSA)은 유연한 < SELinux(Security Enhanced Linux의 약어)로 알려진 Strong>필수 액세스 제어(MAC) 방법으로 프로세스의 기능을 다음과 같이 제한합니다. 가능한 최소한의 권한으로 시스템 개체(예: 파일, 디렉터리, 네트워크 포트 등)에 액세스하거나 다른 작업을 수행하는 동시에 나중에 이 모델을 수정할 수 있도록 허용합니다.
인기 있고 널리 사용되는 또 다른 MAC는 SELinux에서 제공하는 기능 외에도 시스템이 '학습할 수 있는 학습 모드를 포함하는 AppArmor입니다. Strong> ”특정 애플리케이션이 어떻게 작동하는지, 그리고 안전한 애플리케이션 사용을 위해 프로필을 구성하여 제한을 설정합니다.
CentOS 7에서는 SELinux가 커널 자체에 통합되어 기본적으로 적용 모드에서 활성화됩니다(자세한 내용은 다음 섹션에서 설명). AppArmor를 사용하는 openSUSE 및 Ubuntu와 반대입니다.
이 기사에서는 SELinux 및 AppArmor의 필수 사항과 선택한 배포판에 따라 이러한 도구 중 하나를 사용하는 방법을 설명합니다.
SELinux 소개 및 CentOS 7에서 사용하는 방법
보안 강화 Linux는 두 가지 방식으로 작동할 수 있습니다.
- 강제: SELinux는 보안 엔진을 제어하는 일련의 지침인 SELinux 정책 규칙을 기반으로 액세스를 거부합니다.
- 허용: SELinux는 액세스를 거부하지 않지만 시행 모드에서 실행 중이라면 거부되었을 작업에 대한 거부가 기록됩니다.
SELinux를 비활성화할 수도 있습니다. 작동 모드 자체는 아니지만 여전히 옵션입니다. 하지만 이 도구를 사용하는 방법을 배우는 것이 그냥 무시하는 것보다 낫습니다. 명심 해!
SELinux의 현재 모드를 표시하려면 getenforce
를 사용하세요. 작업 모드를 전환하려면 setenforce 0
(허용으로 설정) 또는 setenforce 1
(강제 )을 사용하세요. 강하다).
이 변경 사항은 재부팅 후에도 유지되지 않으므로 /etc/selinux/config 파일을 편집하고 SELINUX 변수를 다음 중 하나로 설정해야 합니다. 재부팅 시 지속성을 확보하기 위해 적용
, 허용
또는 비활성화
:
참고로, getenforce
가 비활성화를 반환하면 원하는 작동 모드로 /etc/selinux/config를 편집하고 재부팅해야 합니다. 그렇지 않으면 setenforce
를 사용하여 작업 모드를 설정(또는 전환)할 수 없습니다.
setenforce
의 일반적인 용도 중 하나는 다음과 같은 애플리케이션 문제를 해결하기 위해 SELinux 모드(강제에서 허용 또는 그 반대 모드) 간을 전환하는 것입니다. 오작동하거나 예상대로 작동하지 않습니다. SELinux를 허용 모드로 설정한 후에 작동한다면 SELinux 권한 문제가 발생한 것이라고 확신할 수 있습니다.
SELinux를 처리해야 할 가능성이 가장 높은 두 가지 전형적인 사례는 다음과 같습니다.
- 데몬이 수신 대기하는 기본 포트를 변경합니다.
- /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를 살펴보면 sshd가 9999 포트에서 시작되지 못하는 것을 볼 수 있습니다. 이는 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 및 관리자 가이드를 참조하세요.