에 따르면 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 on
SELinux에 관한 한 이것이 의미 하고 항상 동일합니까? 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에 포트를 추가하면 해당 포트에만 연결할 수 있지만 수신/바인딩할 수는 없습니다.