Selinux

SELinux 的監聽連接是否相同?

  • May 10, 2017

根據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 可以連接到的埠列表中。

就 SELinux 而言,這是否意味著listening on並且始終相同?connecting to或者是否有一些規則將埠列表關聯爲入口、出口或兩者?如果是這樣,我在哪裡可以在我的作業系統中找到這些資訊以及如何修改它?

就 SELinux 而言,“監聽”和“連接到”不是一回事。這是兩件不同的事情,並且要能夠做任何一件事情,程序都需要擁有正確的權限。在綁定到埠和連接到埠的情況下,這些權限分別是name_bindname_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. 現在看看 haproxy 對 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 } ;

這向我們展示了 haproxy 具有 name_bind 和 name_connect 權限。因此,無論您添加到 http_port_t 的哪個埠,都將允許 haproxy 綁定並連接到該埠(但是,使用 http_port_t 的所有其他類型也將能夠在該埠上使用它們各自的權限!例如,openvpn 將能夠接收並發送消息,並綁定和連接)。

如果 haproxy 不是 http_port_t,而是為每個權限使用特定類型,例如分別具有 name_connect 和 name_bind 權限的 haproxy_connect_port_t 和 haproxy_bind_port_t,那麼如果您將埠添加到僅 haproxy_connect_port_t,它將只能連接到所述埠,不能偵聽/綁定到它。

引用自:https://unix.stackexchange.com/questions/363879