GNU/Linux >> Linux の 問題 >  >> Linux

SELinuxのトラブルシューティングと落とし穴

あなたの失敗にあなたを定義させることはできません。あなたはあなたの失敗にあなたに教えさせなければなりません―バラク・オバマ

特にサードパーティのソリューションプロバイダーとの大きな戦いの1つは、サーバーのセキュリティを維持することです。多くの場合、課題は、アプリケーションをスムーズに実行できるようにSELinuxを無効にする要求です。幸いなことに、それはますます少なくなっています。

これらのほとんどの場合、適切なトラブルシューティングまたは回避策を見つけるには、分析で十分です。

SELinuxはラベリングシステムです 、これは、システム内の各ファイル、ディレクトリ、またはオブジェクトに対応するラベルがあることを示しています。 。ポリシーは、これらの要素間の相互作用を制御します。カーネルはこれらのルールを適用します。

最も重要な2つの概念は、ラベル付けです。 (ファイル、プロセス、ポートなど)および Type Enforcement (タイプに応じてプロセスを相互に分離します)。

ラベルで使用される形式は次のとおりです。user:role:type:level (オプション)。

現在の構成を確認するには、getenforceを実行します およびsestatus コマンド:

# getenforce
Enforcing
# sestatus
SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   enforcing
Mode from config file:          enforcing
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Memory protection checking:     actual (secure)
Max kernel policy version:      32

ベストプラクティスによると、新しいサードパーティアプリケーションをテストするときは、SELinuxをパーミッシブモードで一時的に構成する必要があります。 どのポリシーまたはブール値(動作を変更する単純な文字列)が必要かを判断するため。コマンドを実行します:

# setenforce 0

ログを調べると、アプリケーションが正しく機能するためにSELinuxが必要とするものを見つけることができます。

SELinuxは私に何を伝えようとしているのですか?

SELinuxでアラートを生成するエラーの主な原因は4つだけです:

  1. ラベリング。
  2. SELinuxは知る必要があります。
  3. SELinuxポリシーおよび/またはアプリケーションにバグがある可能性があります。
  4. あなたの情報が危険にさらされる可能性があります。

最後のケースは、脆弱性を攻撃したり、アクティビティの追跡を回避したりするために行われた変更によるものですが、どちらの場合も、これらのアラートを確認することが不可欠です。実用上の理由から、現時点では、将来投稿される可能性があるまで、それらに対処しません。

ラベリング

ラベル付けの問題/srv/myweb内のファイル 正しくラベル付けされておらず、アクセスできません。

SELinuxは、同じサービスに関係する各要素にラベルを割り当てます:

  • バイナリファイル:/ usr / sbin/httpd→httpd_exec_t
  • 構成ファイル:/ etc/httpd→httpd_config_t
  • ログファイル:/ var / log/httpd→httpd_log_t
  • コンテンツディレクトリ:/ var / www/html→httpd_sys_content_t
  • 起動スクリプト:/usr/lib/systemd/system/httpd.service→ httpd_unit_file_t
  • プロセス:/ usr / sbin/httpd→httpd_t
  • ポート:80 / tcp、443/tcp→httpd_t およびhttpd_port_t

Webサーバーで、 httpd_tで実行されているプロセス コンテキスト httpd_something_tのオブジェクトとのみ対話できます ラベル

解決策 :ファイルに正しくラベルを付けます。

正しいラベルがわかっている場合は、次を実行します:

# semanage fcontext -a -t httpd_sys_content_t '/srv/myweb(/.*)?'

同等のラベルのファイルがわかっている場合は、次のコマンドを実行します。

# semanage fcontext -a -e /srv/myweb /var/www

どちらの場合も、ファイルのデフォルトのコンテキストを復元します。

# restorecon -vR /srv/myweb

ラベル付けの問題 :ファイルを移動しても、コピーされるのではなく、元のラベルが保持されます。

$ mv index.html /var/www/html/

解決策 :ファイルに正しくラベルを付けます。

コンテキストを正しいラベルに変更します:

# chcon -t httpd_system_content_t /var/www/html/index.html

参照ラベルを使用してコンテキストを変更する:

# chcon --reference /var/www/html/ /var/www/html/index.html

どちらの場合も、ファイルのデフォルトのコンテキストを復元します。

# restorecon -vR /var/www/html/

[次のこともお勧めします:SELinuxポリシードキュメントへのアクセス]

SELinuxは知る必要があります

サービスのカスタマイズ :Webサーバーはポート8585でリクエストをリッスンします。

目的のポートをコンテキストに追加するには、次を実行します。

# semanage port -a -t http_port_t -p tcp 8585

サービスへの機能の追加 :ウェブサーバーはメールを送信できるようになります。

メール送信機能を有効にするには、ブール値をオンにして、次のコマンドを実行します。

# setsebool -P httpd_can_sendmail 1

-P フラグは、ブール値で変更を永続的にします。

すべてのブール値を取得するには、次を実行します:

# getsebool -a

ブール値のステータスを確認するには、次を実行します:

# semanage boolean -l

ポリシーのトラブルシューティング

一部のサービスには、SELinuxを操作するために必要な十分な権限を含む特定のポリシーが作成されていません。これらの権限が何であるかを判断するには、許可モードを設定し、ログにアクセスエラーがないかどうかを調べる必要があります。

サービスが機能しない :ワイヤレス接続を処理するために、NetworkManagerサービスの代わりにwicdが使用されます。

audit.logを検査する アクセス拒否のファイル:

# grep denied audit.log | cut -d{ -f2 | sort -n | uniq -u
 create } for  pid=2670 comm="wicd" scontext=system_u:system_r:NetworkManager_t:s0 tcontext=system_u:system_r:NetworkManager_t:s0 tclass=appletalk_socket permissive=1
 create } for  pid=2670 comm="wicd" scontext=system_u:system_r:NetworkManager_t:s0 tcontext=system_u:system_r:NetworkManager_t:s0 tclass=ax25_socket permissive=1
 ioctl } for  pid=2670 comm="wicd" path="socket:[52681]" dev="sockfs" ino=52681 ioctlcmd=0x8b01 scontext=system_u:system_r:NetworkManager_t:s0 tcontext=system_u:system_r:NetworkManager_t:s0 tclass=ax25_socket permissive=1
 ioctl } for  pid=2670 comm="wicd" path="socket:[52684]" dev="sockfs" ino=52684 ioctlcmd=0x8b01 scontext=system_u:system_r:NetworkManager_t:s0 tcontext=system_u:system_r:NetworkManager_t:s0 tclass=appletalk_socket permissive=1
 setattr } for  pid=2214 comm="wicd" name="dhclient.conf.template" dev="dm-0" ino=437068 scontext=system_u:system_r:NetworkManager_t:s0 tcontext=unconfined_u:object_r:etc_t:s0 tclass=file permissive=0

コンテキストNetworkManager_tに関係するいくつかの要素に注意してください およびetc_t さまざまなファイルやソケットを作成するための権限とアクセス権が必要です。

タイプエンフォースメントを作成します (.te)ポリシーに必要な権限を持つファイル:

# vi my_wicd.te
module my_wicd 1.0;
 
require {
        type NetworkManager_t;
        type etc_t;
        class ipx_socket create;
        class ax25_socket { create ioctl };
        class appletalk_socket { create ioctl };
        class file setattr;
}
 
#============= NetworkManager_t ==============
allow NetworkManager_t etc_t:file setattr;
allow NetworkManager_t self:appletalk_socket { create ioctl };
allow NetworkManager_t self:ax25_socket { create ioctl };
allow NetworkManager_t self:ipx_socket create;

ポリシーをコンパイルするには、パッケージselinux-policy-develをインストールします ポリシーパッケージを生成します:

# make -f /usr/share/selinux/devel/Makefile my_wicd.pp

新しく生成されたモジュールをアクティブ化するには、次を実行します:

# semodule -i my_wicd.pp

ポリシーエラーメッセージ :自分のWebサイトにアクセスしようとすると、ログにSELinuxエラーが見つかります。

SELinuxエラーメッセージのトラブルシューティングでよくある落とし穴の1つは、見つかったすべてのエラーメッセージに従ってポリシーを作成することです。ほとんどの場合、setroubleshoot パッケージがインストールされている場合、同じアラートにより、最良から最小まで、考えられるすべての回避策オプションが提供されます。

setroubleshootを確認するには 今日生成されたアラート、実行:

# journalctl -t setroubleshoot --since today
Dec 08 13:08:33 lab.example.com setroubleshoot[12013]: failed to retrieve rpm info for /var/www/html/index.html
Dec 08 13:08:34 lab.example.com setroubleshoot[12013]: SELinux is preventing /usr/sbin/httpd from getattr access on the file /var/www/html/index.html. For complete SELinux messages run: sealert -l 011df984-4eb6-4079-98ab-cba173c4342e
Dec 08 13:08:34 lab.example.com setroubleshoot[12013]: SELinux is preventing /usr/sbin/httpd from getattr access on the file /var/www/html/index.html.
                                                               
 *****  Plugin restorecon (99.5 confidence) suggests   ************************
                                                               
 If you want to fix the label
 /var/www/html/index.html default label should be httpd_sys_content_t.
 Then you can run restorecon. The access attempt may have been stopped due to insufficient permissions to access a parent directory, in which case try to change the following command accordingly.
 Do
 # /sbin/restorecon -v /var/www/html/index.html
                                                               
 *****  Plugin catchall (1.49 confidence) suggests   **************************
                                                               
 If you believe that httpd should be allowed getattr access on the index.html file by default.
 Then you should report this as a bug.
 You can generate a local policy module to allow this access.
 Do
 allow this access for now by executing:
 # ausearch -c 'httpd' --raw | audit2allow -M my-httpd
 # semodule -X 300 -i my-httpd.pp

この場合、考えられる最善の解決策は、ファイルのラベルを修正することです。

[この役立つガイドを使用して、SELinuxの管理と使用のスキルを向上させてください。 ]

まとめ

SELinuxはトラブルシューティングが難しい場合がありますが、ここに記載されている概念を適用し、サービスのコンポーネントを理解することで、SELinuxが投げかけるあらゆる課題に対処できます。

覚えておいてください:


Linux
  1. cronジョブのトラブルシューティング

  2. Cut / Grep And Df -h?

  3. Grep And Tail -f?

  1. PthreadとVfork?

  2. 方法:MTR –ネットワーク接続の理解とトラブルシューティング

  3. 基本的なNginxのトラブルシューティング

  1. ログローテーションの設定とトラブルシューティングの例

  2. SELinux ユーザーとは何か、および Linux ユーザーを SELinux ユーザーにマップする方法

  3. SELinux ファイルのラベル付けと SELinux コンテキストについて