Selinux

哪些 SELinux 策略適用於 haproxy?

  • April 4, 2021

我剛剛遇到了另一個與 SELinux 相關的問題。似乎haproxy不允許我打開到後端的 TCP 連接,我可以使用 Google 快速修復它。現在,我想知道如果有人真的知道如何使用 SELinux,將如何解決這個問題?

問題

我想使用 haproxy 將我的可公開訪問的埠 5000 轉發到 127.0.0.1:5601。我相應地配置了 haproxy,並systemctl restart haproxy立即在 syslog 中獲得了這種美感:

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 --> SELinux已成為我解決 Linux 問題的主要短路評估。多年來沒有讓我失望!

解決方案

根據我們在 Serverfault 的朋友的說法,這個問題的解決方案

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

因為

SELinux 只允許

$$ s $$Web 伺服器與一組有限的埠建立出站連接

顯然該semanage命令將埠 5601 添加到該列表中。這有效,現在我的 haproxy 為我服務 Kibana。偉大的!

我不明白/不知道的

當我ps fauxZ看到 haproxy 的上下文是system_u:system_r:haproxy_t:s0. 使用我的 Linux 上的可用命令,我怎樣才能發現 haproxy 受與相關的埠限制http_port_t

SELinux 有一點神秘的名聲——我認為這是當之無愧的。

我理解它的方式,正在執行的程序的上下文定義了目前策略將允許它訪問或執行的操作。因此,正如您所推測的,haproxy_t 類型允許基於 http_port_t 類型的一些權限。

現在讓我們試著真正弄清楚如何找到這種關係。

獲取 SELinux 標籤

如您所知,ps -eZ將列出正在執行的程序的 SELinux 標籤 - 在 haproxy 的情況下,user:role:type:sensitivitysystem_u:system_r:haproxy_t:s0. 重要的是類型,在本例中為 haproxy_t。

權限

現在要找出這種類型有哪些權限,我們可以使用搜尋

$$ 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 $$在 setools-console 包中可用。

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