SELinuxタグのインポート

SELinuxタグのインポート

別の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 --> SELinuxLinuxの問題を解決するとき、私の支配的な段落評価になりました。私は何年も決して失望したことがありません!

解決策

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 パッケージで利用可能です。

おすすめ記事