概要
SELinux (Security-Enhanced Linux) は、システムにアクセスできるユーザーを管理者がより詳細に制御できるようにする Linux® システム 用のセキュリティ・アーキテクチャです。もともとは、Linux Security Modules (LSM) を使用した Linux カーネルへの一連のパッチとして、アメリカ国家安全保障局 (NSA) によって開発されました。
SELinux は 2000 年にオープンソース・コミュニティにリリースされ、2003 年にアップストリームの Linux カーネルに統合されました。
セキュリティおよびコンプライアンスに対する Red Hat のアプローチ (動画)
SELinux の仕組み
SELinux は、システム上のアプリケーション、プロセス、ファイルのアクセス制御を定義します。アクセス制御にはセキュリティポリシーを使用します。セキュリティポリシーは一連のルールで構成されており、アクセス可能なものとそうでないものを SELinux が識別できるようにします。
アプリケーションやプロセス (「サブジェクト」) がファイルなどのオブジェクトへのアクセスをリクエストすると、SELinux はアクセス・ベクター・キャッシュ (AVC) でパーミッションを確認します。AVC には、サブジェクトとオブジェクトに関するパーミッション情報がキャッシュされています。
キャッシュされたパーミッションでアクセス可否を判断できない場合、SELinux はセキュリティサーバーにリクエストを送信します。セキュリティサーバーは、アプリケーションまたはプロセスとファイルのセキュリティコンテキストを確認します。セキュリティコンテキストが SELinux ポリシーデータベースから適用され、パーミッションを付与するか拒否するかが決まります。
パーミッションが拒否された場合、/var/log.messages に「avc: denied」というメッセージが記録されます。
SELinux の構成方法
SELinux を構成してシステムを保護する方法はたくさんあります。最も一般的な方法は、ターゲットポリシーまたはマルチレベルセキュリティ (MLS) です。
ターゲットポリシーはデフォルトのオプションであり、さまざまなプロセス、タスク、サービスに対応します。MLS は非常に複雑になる場合があり、通常は政府機関でのみ使用されます。
システムの設定は /etc/sysconfig/selinux ファイルで確認できます。このファイルには、SELinux が permissive、enforcing、disabled のうちのどのモードにあるか、そしてどのポリシーがロードされるかを示すセクションがあります。
SELinux のラベリングと Type Enforcement
Type Enforcement (TE) とラベリングは、SELinux の最も重要な概念です。
SELinux はラベリングシステムとして機能します。つまり、システム内のあらゆるファイル、プロセス、ポートのそれぞれに、1 つの SELinux ラベルが関連付けられています。ラベルによって、論理的な方法でグループ化することができます。カーネルは、ブート中にラベルを管理します。
ラベルの形式は、user:role:type:level (level はオプション) です。user、role、level は、SELinux のより高度な実装 (MLS など) で使用されます。ラベルタイプは、ターゲットポリシーにとって最も重要です。
SELinux は、TE を使用して、システムで定義されているポリシーを適用します。TE は SELinux ポリシーの一部であり、特定のタイプで実行されているプロセスが特定のタイプにラベリングされたファイルにアクセスできるかどうかを定義します。
SELinux の有効化
SELinux が無効になっている環境では、/etc/selinux/config を編集して SELINUX=permissive を設定すると、SELinux を有効化できます。無効だった SELinux を即座に enforcing モードで実行することは望ましくありません。それは、システム内にラベリングの不適切なオブジェクトによりシステムが起動できない可能性があるからです。
ルートディレクトリに .autorelabel という名前の空のファイルを作成してから再起動すれば、システム内で自動的にファイルシステムの再ラベリングをすることができます。システムで大量のエラーが発生する場合、システムブートを成功させるためには、まず permissive モードで再起動します。すべての再ラベリングが完了したら、/etc/selinux/config で enforcing に設定して再起動するか、setenforce 1 を実行して SELinux を有効化します。
コマンドラインにあまり精通していないシステム管理者でも SELinux を管理できるよう、グラフィックツールも用意されています。
SELinux は Linux ディストリビューションに組み込まれており、システムに追加のセキュリティレイヤーを提供します。危険にさらされた場合にもシステムを保護できるよう、SELinux は常に有効のままにしておく必要があります。
任意アクセス制御 (DAC) と強制アクセス制御 (MAC)
Linux システムと UNIX システムでは旧来から DAC が使用されてきました。SELinux は、Linux 用の MAC システムの一例です。
DAC では、ファイルやプロセスには所有者が存在します。ファイルの所有者にはユーザー、グループ、その他のユーザーがなることができます。「その他のユーザー」とは、ユーザーとグループで指定されている以外のあらゆるユーザーです。ユーザーは、自分のファイルのパーミッションを変更することが可能です。
DAC システムでは、root ユーザーは完全なアクセス制御権を持ちます。つまり、root アクセス権があれば、他のあらゆるユーザーのファイルにアクセスし、システム上であらゆる操作を実行できてしまいます。
しかし、SELinux のような MAC システムでは、アクセスはポリシーで管理されます。たとえホームディレクトリの DAC 設定が変更されても、SELinux ポリシーにより別のユーザーやプロセスはディレクトリにアクセスできないため、システムの安全が維持されます。
SELinux ポリシーを使うと、詳細な設定を多数のプロセスに適用できます。SELinux で変更を加えて、ユーザー、ファイル、ディレクトリなどの間のアクセスを制限できます。
SELinux エラーへの対処
SELinux でエラーが発生する場合、何らかの対処が必要であることを示しています。ほとんどの場合、そうした問題は次の 4 つのいずれかに分類できます。
- ラベルが正しくない:ラベリングが正しくない場合は、ラベル修正ツールで修正できます。
- ポリシーを修正する必要がある:これは、行った変更を SELinux が認識していないか、または、ポリシーの調整が必要かもしれないことを意味します。ブール値やポリシーモジュールを使用して修正できます。
- ポリシーにバグがある:対処が必要なバグがポリシーに存在する可能性があります。
- システムに侵入された:SELinux はさまざまな状況でシステムを保護することができますが、システムが危険にさらされる可能性は依然として存在します。システムへの侵入が疑われる場合は、迅速な対処が必要です。
ブール値とは
ブール値は、SELinux の機能をオン/オフに設定するための値です。SELinux 機能のオン/オフを指定する数百の設定があり、その多くはすでに事前定義されています。getsebool -a を実行すると、システムですでに設定されているブール値を確認できます。
Red Hat が提供できるサポート
Red Hat Enterprise Linux は世界有数のオープンソース Linux プラットフォームです。リスクの緩和、セキュリティ構成とポリシーの適用、コンプライアンス戦略の最適化の実現を支援します。
Red Hat Enterprise Linux システムロールは、サポートされている Ansible® ロールのコレクションであり、一貫したワークフローを提供し、手動タスクの実行を最適化します。システムロールは、セキュリティのワークフローを自動化し、それらを一定期間、大規模に、また最小限のリソースで維持するのに役立ち、ガバナンスとコンプライアンス要件を最適化します。SELinux システムロールを使って、SELinux のデプロイメントと管理を自動化できます。 これには、以下が含まれます。
- enforcing または permissive モードで SELinux を有効にし、制御の一貫性を確保する。
- SELinux ポリシーのブール値、ファイルのコンテキスト、ポートおよびログインをカスタマイズして要件に対応する。
- システムロールを使用し、指定したファイルまたはディレクトリのファイルのコンテキストを調整する。