SELinux의 청취 연결이 동일합니까?

SELinux의 청취 연결이 동일합니까?

에 따르면 semanage-port(1)...

  • -a는 --add와 동일한 효과를 갖습니다.
  • -t는 --type과 동일한 효과를 갖습니다.
  • -p는 --port와 동일한 효과를 갖습니다.

그리고 명령을 내리다

 semanage port -a -t http_port_t -p tcp 81

Apache가 포트 81에서 수신 대기하도록 허용합니다.

여태까지는 그런대로 잘됐다. 하지만이것은 haproxy 관련 문제에 대한 해결책입니다이 명령을 말해줘

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

haproxy가 연결할 수 있는 포트 목록에 포트를 추가합니다.

listening onSELinux에 관한 한 이것이 의미 하고 항상 동일합니까? connecting to아니면 포트 목록을 수신, 송신 또는 둘 다로 연결하는 규칙이 있습니까? 그렇다면 운영 체제에서 이 정보를 어디에서 찾을 수 있으며 어떻게 수정할 수 있습니까?

답변1

SELinux에 관한 한 "듣기"와 "연결"은아니요같은 것. 이는 서로 다른 두 가지 작업이며, 둘 중 하나를 수행하려면 프로세스에 올바른 권한이 있어야 합니다. 포트에 바인딩하고 포트에 연결하는 경우 이러한 권한은 name_bind및 입니다 name_connect.

이 경우 우리는 클래스 권한에 관심이 있습니다. 그러나 일반적인 SELinux의 경우와 마찬가지로 한 가지 정보가 누락되었습니다. 즉, 어떤 클래스의 권한입니까? 이것을 찾는 더 좋은 방법이 있을 것 같지만 실제로는 아직 발견하지 못했습니다. 그럼 우리가 알고 있는 것을 활용해 봅시다:

sesearch -d -A -t http_port_t
Found 81 semantic av rules:
    allow cloud_init_t http_port_t : tcp_socket name_connect ;
    ...

그러면 http_port_t를 대상으로 허용되는 모든 규칙이 표시됩니다. 고맙게도 우리는 그것들이 모두 동일한 클래스인 tcp_socket에서 실행된다는 것을 알 수 있습니다. 이것은 의미가 있습니다. 이제 tcp_socket 클래스가 갖고 있는 모든 권한을 확인해 보겠습니다(내가 아는 한 이는 정책 자체에 정의되어 있습니다).

seinfo -ctcp_socket -x
  • -c객체 클래스를 인쇄합니다(플래그와 이름 사이에 공백이 있어서는 안 됩니다).
  • -x더 많은 정보 표시(이 경우 실제로 우리가 관심 있는 것 - 권한!)

그러면 tcp_socket 클래스에 적용되는 모든 권한이 나열됩니다. 그 중 name_bind 및 name_connect는 질문에서 LISTEN ON 및 CONNECT TO의 의미입니다.

haproxy를 사용한다고 가정합니다. haproxy의 SELinux 유형은 다음과 같습니다 haproxy_t. 이제 http_port_t에 정의된 포트에 대해 haproxy가 가지고 있는 권한을 확인하세요.

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 } ;

이는 haproxy에 name_bind 및 name_connect 권한이 있음을 나타냅니다. 따라서 http_port_t에 어떤 포트를 추가하든 haproxy가 해당 포트에 바인딩하고 연결할 수 있습니다(그러나 http_port_t를 사용하는 다른 모든 유형도 해당 포트에 대한 해당 권한을 사용할 수 있습니다! 예를 들어 openvpn은 메시지를 수신하고 보낼 수 있습니다) , 바인딩 및 연결).

http_port_t 대신 haproxy가 각 권한에 대해 특정 유형을 사용하는 경우(예: haproxy_connect_port_t 및 haproxy_bind_port_t가 각각 name_connect 및 name_bind 권한을 갖고 있는 경우) haproxy_connect_port_t에 포트를 추가하면 해당 포트에만 연결할 수 있지만 수신/바인딩할 수는 없습니다.

관련 정보