別のSELinux関連の問題が発生しました。haproxy
バックエンドへのTCP接続を開くことができないようです。 Google を使用してすばやく編集できます。今SELinuxの使い方を本当に知っていれば、この問題をどのように解決できるか疑問に思います。
質問
haproxyを使用して、公的にアクセス可能なポート5000を127.0.0.1:5601に転送したいと思います。それに応じてhaproxyを設定し、systemctl restart haproxy
すぐにシステムログで次のことを確認しました。
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では、Webサーバーは限られたポートセットへのアウトバウンド接続のみを許可します。
明らかに、このsemanage
コマンドはリストにポート5601を追加します。これはうまくいき、今私のhaproxyはKibanaを提供します。すごい!
理解できません/わかりません。
haproxyを見るときのps fauxZ
コンテキストはですsystem_u:system_r:haproxy_t:s0
。 Linuxで利用可能なコマンドは、haproxyが接続されているポートによって制限されることをどのように理解できますかhttp_port_t
?
答え1
SELinuxはあいまいだという評判を持っており、私はその資格があると思います。
私が理解しているように、実行中のプログラムのコンテキストは、現在のポリシーがアクセスまたは実行できるようにする内容を定義します。したがって、推測できるように、haproxy_t型はhttp_port_t型に基づいていくつかの権限を受け入れます。
さて、実際にこの関係を見つける方法を見つけましょう。
SELinuxタグのインポート
ご存知のように、ps -eZ
実行中のプロセスのSELinuxラベルが一覧表示されます。つまり、haproxyのuser:role:type:sensitivity
場合system_u:system_r:haproxy_t:s0
。重要なのは型(この場合はhaproxy_t)です。
特権
これで、そのタイプにどの権限があるかを調べるには、search[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] settools-console パッケージで利用可能です。
答え2
どの SELinux 設定を構成すべきかわからない場合は、次の手順を実行します。
次のパッケージをインストールします。
yum install setroubleshoot-server
次に、次を実行します。
sealert -l /var/log/auditd..
指示/推奨事項に従ってください。