5.3. 분석된 SELinux 거부 수정
대부분의 경우 sealert
툴에서 제공하는 제안은 SELinux 정책과 관련된 문제를 해결하는 방법에 대한 올바른 지침을 제공합니다. sealert
를 사용하여 SELinux 거부를 분석하는 방법에 대한 정보는 SELinux 거부 메시지 분석을 참조하십시오.
툴에서 구성 변경에 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 파일 컨텍스트 구성에 추가합니다. 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(Listen 9
를 구성하는 경우 다음 명령이 실패합니다.
876)
에서 수신 대기하지만
이를 반영하도록 정책이 업데이트되지 않도록 관리자가 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 8의 경우 Red Hat Enterprise Linux 8
제품에 대한 버그를 생성하고 selinux-policy
구성 요소를 선택합니다. 이러한 버그 보고서에 audit2allow -w -a
및 audit2allow -a
명령의 출력을 포함합니다.
애플리케이션에서 주요 보안 권한을 요청하는 경우 애플리케이션이 손상되었다는 신호일 수 있습니다. 침입 탐지 툴을 사용하여 이러한 의심스러운 동작을 검사합니다.
Red Hat 고객 포털의 솔루션 엔진은 기존과 동일하거나 매우 유사한 문제에 대해 가능한 솔루션을 포함하는 문서 형태로 지침을 제공할 수도 있습니다. 관련 제품 및 버전을 선택하고 selinux 또는 avc 와 같은 SELinux 관련 키워드를 차단된 서비스 또는 애플리케이션의 이름과 함께 사용합니다(예: selinux samba
).