SELinux 태그 가져오기

SELinux 태그 가져오기

방금 또 다른 SELinux 관련 문제가 발생했습니다. haproxy백엔드에 대한 TCP 연결을 열 수 없는 것 같습니다 . Google을 사용하여 빠르게 수정할 수 있습니다. 이제 SELinux 사용법을 정말로 알고 있다면 이 문제를 어떻게 해결할 수 있을지 궁금합니다.

질문

haproxy를 사용하여 공개적으로 액세스 가능한 포트 5000을 127.0.0.1:5601로 전달하고 싶습니다. 그에 따라 haproxy를 구성했고 systemctl restart haproxy즉시 시스템 로그에서 다음을 확인했습니다.

May  9 09:38:45 localhost haproxy[2900]: Server kibana/app1 is DOWN, reason: Layer4 connection problem, info: "General socket error (Permission denied)", check duration: 0ms. 0 active and 0 backup servers left. 0 sessions active, 0 requeued, 0 remaining in queue.

permission denied --> SELinuxLinux 문제를 해결할 때 나의 지배적인 단락 평가가 되었습니다. 나는 수년 동안 결코 실망한 적이 없습니다!

해결책

Serverfault의 친구가 소개한 이 문제에 대한 솔루션에 따르면

semanage port --add --type http_port_t --proto tcp 5601

왜냐하면

SELinux에서는 웹 서버가 제한된 포트 집합에 대한 아웃바운드 연결만 허용합니다.

분명히 이 semanage명령은 목록에 포트 5601을 추가합니다. 이것이 효과가 있었고 이제 내 haproxy가 Kibana를 제공합니다. 엄청난!

이해가 안 돼요/모르겠어요

haproxy를 볼 때 ps fauxZ컨텍스트는 입니다 system_u:system_r:haproxy_t:s0. Linux에서 사용 가능한 명령을 통해 haproxy가 연결된 포트에 의해 제한된다는 것을 어떻게 알 수 있습니까 http_port_t?

답변1

SELinux는 모호하다는 평판을 갖고 있으며, 저는 그럴 자격이 있다고 생각합니다.

내가 이해하는 바에 따르면, 실행 중인 프로그램의 컨텍스트는 현재 정책이 액세스하거나 수행할 수 있도록 허용하는 내용을 정의합니다. 따라서 짐작할 수 있듯이 haproxy_t 유형에는 http_port_t 유형을 기반으로 일부 권한이 허용됩니다.

이제 실제로 이 관계를 찾는 방법을 알아내도록 하겠습니다.

SELinux 태그 가져오기

아시다시피 ps -eZ실행 중인 프로세스의 SELinux 레이블이 나열됩니다. 즉, haproxy의 user:role:type:sensitivity경우 system_u:system_r:haproxy_t:s0. 중요한 것은 유형(이 경우 haproxy_t)입니다.

권한

이제 해당 유형에 어떤 권한이 있는지 알아보려면 search[1]을 사용할 수 있습니다.

sesearch -d -A -s haproxy_t
  • -d직접적인 결과만 표시 - 이 결과를 생략하면 seinfo --type=haproxy_t -x!의 모든 개체도 표시됩니다.
  • -A허용 규칙 검색
  • -s haproxy_t소스 유형을 haproxy_t로 정의

이제 다양한 세분화된 권한이 정의되어 있기 때문에 꽤 많은 결과(CentOS 7 VM에서 106개 결과)를 얻었습니다. 이 시점에서는 권한이 적용되는 클래스, 대상 유형 또는 권한 이름 자체 등 검색 대상에 대해 더 자세히 알아야 합니다.

카테고리로 검색

먼저 클래스를 살펴보겠습니다. 따라서 소스 유형이 이고 haproxy_t클래스가 인터넷과 관련되어 있다고 생각하므로 tcp_socket일 가능성이 높습니다.

sesearch -d -A -s haproxy_t -c tcp_socket

그러면 tcp_socket과 관련된 소스 유형 haproxy_t에 대해 허용되는 모든 규칙이 나열됩니다. 이로 인해 필드가 상당히 좁아지지만 그 중 어느 것이 우리가 찾고 있는 것인지 여전히 추측할 수 있습니다.

특정 권한으로 검색

다음으로 권한을 사용해 보겠습니다. 특정 포트를 바인딩하고 연결하려면 haproxy가 필요하다는 것을 알고 있습니다. 그래서 우리는 name_bind 및 name_connect 권한을 시도합니다.

sesearch -d -A -s haproxy_t -p "name_bind, name_connect"

Found 4 semantic av rules:
    allow haproxy_t http_cache_port_t : tcp_socket { name_bind name_connect } ;
    allow haproxy_t commplex_main_port_t : tcp_socket { name_bind name_connect } ;
    allow haproxy_t http_port_t : tcp_socket { name_bind name_connect } ;
    allow haproxy_t port_type : tcp_socket name_bind ;

이는 4개의 결과만 표시하며 그 중 3개만이 범인일 수 있습니다! SELinux에 관한 한 이러한 결과는 haproxy_t 컨텍스트가 있는 모든 프로세스가 바인딩할 수 있는 유일한 포트입니다.

대상 유형으로 검색

이것은 약간의 속임수입니다. 이 경우 실제로 대상 유형을 찾고 있기 때문입니다! 그러나 완전성을 위해 예를 들어 haproxy_t가 http_port_t에서 어떤 권한을 받는지 확인하려는 경우 다음을 사용할 수 있습니다.

sesearch -d -A -s haproxy_t -t http_port_t

Found 1 semantic av rules:
    allow haproxy_t http_port_t : tcp_socket { name_bind name_connect } ;

물론 이는 결과와 해당 권한만 제공합니다.

포트

이제 대상 객체와 해당 객체가 어떤 포트인지 알았으므로 객체에 포함된 포트가 무엇인지 정확히 알 수 있습니다. 글쎄요, 알아봅시다:

semanage port -l | grep -E 'http_cache_port_t|commplex_main_port_t|http_port_t'

commplex_main_port_t        tcp    5000
commplex_main_port_t        udp    5000
http_cache_port_t           tcp    8080, 8118, 8123, 10001-10010
http_cache_port_t           upd    3130
http_port_t                 tcp    80, 81, 443, 488, 8008, 8009, 8443, 9000
pegasus_http_port_t         tcp    5988

따라서 TCP 포트 5601이 목록에 없음을 알 수 있습니다. 이제 SELinux에 관한 한 명령을 사용하여 이러한 유형에 포트를 추가하면 semanage port --add --type XXX --proto tcp 5601작동합니다. 하지만 이는 http를 서비스하고 있기 때문에 http_port_t가 가장 적합한 유형인 것 같습니다.

이것이 조금 이해가 되기를 바랍니다.

[1] settools-console 패키지에서 사용 가능합니다.

답변2

어떤 SELinux 설정을 구성해야 할지 확실하지 않은 경우 다음을 수행하세요.

다음 패키지를 설치하십시오.

yum install setroubleshoot-server

그런 다음 다음을 실행하십시오.

sealert -l /var/log/auditd..

지침/권장사항을 따르세요.

관련 정보