Linux에서 SELinux 또는 AppArmor를 사용하여 필수 액세스 제어 구현
표준 ugo/rwx
권한 및 액세스 제어 목록이 제공하는 보안 메커니즘의 한계를 극복하고 강화하기 위해 미국 NSA (National Security Agency)는 알려진 유연한 필수 액세스 제어 (MAC) 방법을 고안했습니다. SELinux (Security Enhanced Linux의 약자)와 같이 시스템 개체 (파일, 디렉터리, 네트워크 포트 등)에 대한 다른 작업에 액세스하거나 수행하는 프로세스의 능력을 가능한 최소한의 권한으로 제한하는 동시에 나중에이 모델을 수정할 수 있습니다.

널리 사용되고 널리 사용되는 또 다른 MAC은 SELinux에서 제공하는 기능 외에도 시스템이 특정 애플리케이션의 작동 방식을 \"학습\"하고 안전한 애플리케이션 사용을위한 프로필을 구성하여 제한을 설정할 수있는 학습 모드를 포함하는 AppArmor입니다.
CentOS 7에서 SELinux는 커널 자체에 통합되며 AppArmor를 사용하는 openSUSE 및 Ubuntu와 달리 기본적으로 적용 모드에서 활성화됩니다 (다음 섹션에서 자세히 설명).
이 기사에서는 SELinux 및 AppArmor의 필수 사항과 선택한 배포에 따라 이러한 도구 중 하나를 사용하는 방법에 대해 설명합니다.
SELinux 소개 및 CentOS 7에서 사용하는 방법
보안 강화 Linux는 두 가지 방식으로 작동 할 수 있습니다.
- Enforcing: SELinux denies access based on SELinux policy rules, a set of guidelines that control the security engine.
- Permissive: SELinux does not deny access, but denials are logged for actions that would have been denied if running in enforcing mode.
SELinux도 비활성화 할 수 있습니다. 작동 모드 자체는 아니지만 여전히 옵션입니다. 그러나이 도구를 사용하는 방법을 배우는 것은 단순히 무시하는 것보다 낫습니다. 명심 해!
SELinux의 현재 모드를 표시하려면 getenforce
를 사용하세요. 작동 모드를 전환하려면 setenforce 0
(허용으로 설정) 또는 setenforce 1
(시행)을 사용하십시오.
이 변경 사항은 재부팅 후에도 유지되지 않으므로/etc/selinux/config 파일을 편집하고 SELINUX 변수를 enforcing
, permissive
또는 disabled
:

참고로 getenforce
가 Disabled를 반환하면 원하는 작동 모드로/etc/selinux/config를 편집하고 재부팅해야합니다. 그렇지 않으면 setenforce
로 작동 모드를 설정 (또는 토글) 할 수 없습니다.
setenforce
의 일반적인 용도 중 하나는 SELinux 모드 (강제에서 허용으로 또는 반대 방향으로)간에 전환하여 오작동하거나 예상대로 작동하지 않는 애플리케이션 문제를 해결하는 것입니다. SELinux를 허용 모드로 설정 한 후에도 작동하면 SELinux 권한 문제를보고 있다고 확신 할 수 있습니다.
SELinux를 다루어야 할 두 가지 고전적인 경우는 다음과 같습니다.
- Changing the default port where a daemon listens on.
- Setting the DocumentRoot directive for a virtual host outside of /var/www/html.
다음 예를 사용하여이 두 가지 사례를 살펴 보겠습니다.
대부분의 시스템 관리자가 서버를 보호하기 위해 가장 먼저 수행하는 작업 중 하나는 SSH 데몬이 수신하는 포트를 변경하여 주로 포트 스캐너와 외부 공격자를 막는 것입니다. 이를 위해/etc/ssh/sshd_config의 Port 지시문을 사용하고 다음과 같이 새 포트 번호를 사용합니다 (이 경우에는 포트 9999를 사용합니다).
Port 9999
서비스를 다시 시작하고 상태를 확인한 후 시작에 실패했음을 알 수 있습니다.
# systemctl restart sshd # systemctl status sshd

/var/log/audit/audit.log를 살펴보면 sshd가 JBoss Management 서비스 용으로 예약 된 포트이기 때문에 SELinux에 의해 포트 9999에서 시작되지 못함을 알 수 있습니다 (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를 사용하여 서비스에 연결할 수 있습니다.이 변경 사항은 재부팅 후에도 유지됩니다.
/ var/www/html 이외의 디렉토리를 DocumentRoot로 사용하여 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 및 관리자 안내서를 참조하십시오.