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 可以連接到的埠列表中。
就 SELinux 而言,這是否意味著
listening on
並且始終相同?connecting to
或者是否有一些規則將埠列表關聯爲入口、出口或兩者?如果是這樣,我在哪裡可以在我的作業系統中找到這些資訊以及如何修改它?
就 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
. 現在看看 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,它將只能連接到所述埠,不能偵聽/綁定到它。