5.3. 분석된 SELinux 거부 수정
대부분의 경우 sealert
툴에서 제공하는 제안 사항은 SELinux 정책과 관련된 문제를 해결하는 방법에 대한 올바른 지침을 제공합니다. sealert
를 사용하여 SELinux 거부를 분석하는 방법은 Analyzing SELinux denial 메시지를 참조하십시오.
툴에서 구성 변경에 audit2allow
툴 사용을 제안하는 경우 주의하십시오. SELinux 거부가 표시될 때 audit2allow
를 사용하여 로컬 정책 모듈을 첫 번째 옵션으로 생성해서는 안 됩니다. 문제 해결은 레이블 문제가 있는지 확인하여 시작해야 합니다. 두 번째 경우는 프로세스 구성을 변경했으며 SELinux에 대해 알리는 것을 잊어 버렸습니다.
라벨 문제
레이블 지정 문제의 일반적인 원인은 비표준 디렉터리가 서비스에 사용되는 경우입니다. 예를 들어, 웹 사이트에 /var/www/html/
를 사용하는 대신 관리자는 /srv/myweb/
.를 사용할 수 있습니다. Red Hat Enterprise Linux에서 /srv
디렉터리는 var_t
유형으로 레이블이 지정됩니다. /srv
에서 생성된 파일 및 디렉터리는 이 유형을 상속합니다. 또한 최상위 디렉토리에서 새로 생성된 오브젝트(예: /myserver
)는 default_t
유형으로 레이블을 지정할 수 있습니다. SELinux는 Apache HTTP Server(httpd
)가 이러한 유형에 모두 액세스하지 못하도록 합니다. 액세스를 허용하려면 SELinux에서 httpd
:를 통해 /srv/myweb/
의 파일에 액세스할 수 있는지 알아야 합니다.
# semanage fcontext -a -t httpd_sys_content_t "/srv/myweb(/.*)?"
이 semanage
명령은 /srv/myweb/
디렉터리 및 그 아래의 모든 파일 및 디렉터리에 대한 컨텍스트를 SELinux file-context 구성에 추가합니다. semanage
유틸리티는 컨텍스트를 변경하지 않습니다. root로 restorecon
유틸리티를 사용하여 변경 사항을 적용합니다.
# restorecon -R -v /srv/myweb
잘못된 컨텍스트
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
이 예에서 index.html
및 page1.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
디렉터리에 있는 모든 파일의 컨텍스트를 복원하려면 -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
비표준 방식으로 구성된 제한된 애플리케이션
서비스는 다양한 방식으로 실행될 수 있습니다. 이를 위해서는 서비스 실행 방법을 지정해야 합니다. SELinux 부울을 통해 SELinux 정책의 일부를 런타임 시 변경할 수 있습니다. 이렇게 하면 SELinux 정책을 다시 로드하거나 다시 컴파일하지 않고도 NFS 볼륨에 대한 서비스 액세스 허용과 같은 변경이 가능합니다. 또한 기본이 아닌 포트 번호에서 서비스를 실행하려면 semanage
명령을 사용하여 업데이트하는 정책 구성이 필요합니다.
예를 들어 Apache HTTP 서버가 MariaDB와 통신하도록 허용하려면 httpd_can_network_connect_db
부울을 활성화합니다.
# setsebool -P httpd_can_network_connect_db on
-P
옵션을 사용하면 시스템을 재부팅해도 설정이 지속됩니다.
특정 서비스에 대해 액세스가 거부되면 getsebool
및 grep
유틸리티를 사용하여 액세스를 허용하는 부울을 사용할 수 있는지 확인합니다. 예를 들어 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
부울 목록을 가져오고 활성화되어 있는지 확인하려면 getsebool -a
명령을 사용합니다. 의미와 같은 부울 목록을 가져오고 해당 의미가 활성화되어 있는지 확인하려면 selinux-policy-devel
패키지를 설치하고 semanage boolean -l
명령을 root로 사용합니다.
포트 번호
정책 구성에 따라 특정 포트 번호에서만 서비스를 실행할 수 있습니다. 정책을 변경하지 않고 서비스가 실행되는 포트를 변경하면 서비스가 시작되지 않을 수 있습니다. 예를 들어 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
http_port_t
포트 유형은 포트 Apache HTTP Server가 수신할 수 있는 포트를 정의합니다. 이 경우 TCP 포트 80, 443, 488, 8008, 8009 및 8443입니다. 관리자가 httpd
가 포트 9876(List 9876 )에서 수신 대기하도록 httpd.conf
를 구성하지만 이를 반영하도록 정책이 업데이트되지 않으면 다음 명령이 실패합니다.
# systemctl start httpd.service Job for httpd.service failed. See 'systemctl status httpd.service' and 'journalctl -xn' for details. # 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)
다음과 유사한 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
httpd
가 http_port_t
포트 유형에 대해 나열되지 않은 포트에서 수신 대기하도록 허용하려면 semanage port
명령을 사용하여 다른 레이블을 포트에 할당합니다.
# semanage port -a -t http_port_t -p tcp 9876
a 옵션은 새 레코드를 추가합니다. -t
옵션은 유형을 정의하고 -p
옵션은 프로토콜을 정의합니다. 마지막 인수는 추가할 포트 번호입니다.
코너 케이스, 진화되거나 손상된 애플리케이션, 손상된 시스템
애플리케이션에는 SELinux가 액세스를 거부하도록 하는 버그가 포함될 수 있습니다. 또한 SELinux 규칙이 진화하고 있습니다. SELinux는 애플리케이션이 예상대로 작동하는 경우에도 특정 방식으로 실행되는 애플리케이션이 표시되지 않을 수 있습니다. 예를 들어 PostgreSQL의 새 버전이 릴리스되면 현재 정책이 고려하지 않는 작업을 수행할 수 있으므로 액세스가 허용되어야 하는 경우에도 액세스가 거부됩니다.
이러한 경우 액세스가 거부된 후 audit2allow
유틸리티를 사용하여 액세스를 허용하는 사용자 지정 정책 모듈을 생성합니다. Red Hat Bugzilla 의 SELinux 정책에서 누락된 규칙을 보고할 수 있습니다. Red Hat Enterprise Linux 9의 경우 Red Hat Enterprise Linux 9
제품에 대한 버그를 생성하고 selinux-policy
구성 요소를 선택합니다. 이러한 버그 보고서에 audit2allow -w -a
및 audit2allow -a
명령의 출력을 포함합니다.
애플리케이션에서 주요 보안 권한을 요청하면 애플리케이션이 손상되는 신호일 수 있습니다. 침입 탐지 도구를 사용하여 이러한 의심 스러운 동작을 검사합니다.
Red Hat 고객 포털의 솔루션 엔진은 또한 사용자가 가진 동일한 또는 매우 유사한 문제에 대한 가능한 솔루션이 포함된 문서 형태로 지침을 제공할 수 있습니다. 관련 제품 및 버전을 선택하고 selinux 또는 avc 와 같은 SELinux 관련 키워드를 사용하여 차단된 서비스 또는 애플리케이션 이름(예: selinux samba
)을 사용합니다.