第2章 はじめに
SELinux (Security-Enhanced Linux) は Linux カーネルに MAC (Mandatory Access Control) を追加するもので、標準の Discretionary Access Controls (DAC: 任意アクセス制御) がチェックされた後で許可された操作をチェックします。これは米国国家安全保障局 (National Security Agency) が開発したもので、定義されたポリシーを基に Linx システム内のファイルやプロセスおよびその他のアクションにルールを強制できます。
SELinux を使用すると、ディレクトリーやデバイスを含むファイルはオブジェクトとして参照されます。ユーザーによるコマンドや Mozilla Firefox アプリケーションなどの実行といったプロセスは、サブジェクトとして参照されます。ほとんどのオペレーティングシステムでは DAC (任意アクセス制御) が使われており、これはサブジェクトとオブジェクト、およびサブジェクト同士の情報交換方法を制御するものです。DAC を使用するオペレーティングシステムでは、ユーザーは自身が所有するファイルのパーミッション (オブジェクト) を制御します。例えば、Linux オペレーティングシステム上では、ユーザーは自身のホームディレクトリーを全ユーザー読み取り可能にすることができ、この望ましくないアクションに追加の保護を加えることなく、ユーザーおよびプロセス (サブジェクト) に秘密度の高い可能性のある情報へのアクセスを与えることになります。
DAC メカニズムのみへの依存は、強力なシステムセキュリティーとしては基本的に不十分です。DAC のアクセスに関する決定は、ユーザー ID と所有権にのみ基づいており、ユーザーのロールやプログラムの機能および信頼性、データの秘密度および整合性といったその他のセキュリティー関連情報を無視しています。各ユーザーは通常、自身のファイルに対して完全な裁量権を有しており、システム全体にわたるセキュリティーポリシーの強制を困難にしています。さらに、ユーザーが実行するプログラムはすべて、そのユーザーに許可された全パーミッションを継承していて、ユーザーのファイルへのアクセスを変更することは自由にできます。このため、悪意のあるソフトウェアに対する保護は最低限のものしか与えられていません。システムサービスおよび権限が与えられているプログラムは、要件をはるかに超える粒度の荒い権限で実行されているため、プログラムのうちのどれかに欠点があると、システムへのさらなるアクセスを取得するために利用されかねません。[1]
以下は、SELinux を実行していない Linux オペレーティングシステムで使われているパーミッションの例です。システムによっては、パーミッションおよび出力はこの例とは多少異なる場合があります。
ls -l
コマンドを使って、ファイルパーミッションを表示させます。
~]$ ls -l file1
-rwxrw-r-- 1 user1 group1 0 2009-08-30 11:03 file1
この例では、パーミッションの最初の 3 ビットである
rwx
が、Linux user1
ユーザー (この例では所有者) の file1
へのアクセスを制御します。次の 3 ビット rw-
は、Linux group1
グループの file1
へのアクセスを制御します。最後の 3 ビット r--
は、その他全員の file1
へのアクセスを制御し、これには全ユーザーとプロセスが含まれます。
SELinux は Linux カーネルに MAC を追加するもので、Red Hat Enterprise Linux ではデフォルトで有効になっています。一般目的の MAC アーキテクチャーは、システム内のすべてのプロセスとファイルに対して多種多様のセキュリティー関連情報を含むラベルを決定土台とする、管理者が設定したセキュリティポリシーを強制する能力を必要とします。適切に実装すると、システムは十分にシステム自身を保護でき、安全なアプリケーションの悪用や回避に対する保護により、アプリケーションのセキュリティーに必須のサポートを提供します。MAC は、信頼性の低いアプリケーションの安全な実行を許可する、強力なアプリケーションの分離を提供します。プロセス実行に関する権限を制限する能力により、アプリケーションおよびシステムサービスの脆弱性の悪用から発生する可能性のある損害の領域を制限します。MAC の使用により、限定的な権限を持つ正規ユーザーや不正なアプリケーションを知らずに実行してしまった、権限を持つユーザーから情報を保護することができます。[2]
以下は、SELinux を実行する Linux オペレーティングシステム上でプロセス、Linux ユーザー、ファイルに対して使用されるセキュリティー関連情報を含むラベルの例です。この情報は、SELinux コンテキスト と呼ばれ、
ls -Z
コマンドで表示させます。
~]$ ls -Z file1
-rwxrw-r-- user1 group1 unconfined_u:object_r:user_home_t:s0 file1
この例では、SELinux はユーザー (
unconfined_u
)、ロール (object_r
)、タイプ (user_home_t
)、レベル (s0
) を提供します。この情報は、アクセス制御の決定に使われます。DAC では、アクセスは Linux ユーザーおよびグループの ID のみに基づいて制御されます。SELinux ポリシールールは、DAC ルールの 後で チェックされることを覚えておいてください。DAC ルールが最初にアクセスを拒否すると、SELinux ポリシールールは使用されません。
注記
SELinux を実行する Linux オペレーティングシステム上には、Linux ユーザーと SELinux ユーザーがいます。SELinux ユーザーは、SELinux ポリシーの一部です。Linux ユーザーは SELinux ユーザーにマッピングされています。混乱を避けるために本ガイドでは、「Linux ユーザー」 と 「SELinux ユーザー」 という用語で区別することにします。
2.1. SELinux を実行する利点
- プロセスおよびファイルがすべて、タイプでラベル付けされています。タイプはプロセスのドメインを定義し、ファイルのタイプもあります。プロセスはそれぞれのドメインで実行することで互いに分離しており、SELinux ポリシールールはプロセスがファイルと対話する方法と、プロセス同士が対話する方法を定義します。アクセスは、明確にアクセスを許可するSELinux ポリシールールが存在する場合にのみ、許可されます。
- 粒度の細かいアクセス制御。ユーザーの判断に任され、Linux ユーザーおよびグループ ID に基づいて制御されている従来の UNIX パーミッションにとどまらず、SELinux のアクセス決定は、SELinux ユーザーやロール、タイプ、さらにはオプションとしてレベルなどの利用可能なすべての情報に基づいて行われます。
- SELinux ポリシーは管理者が定義し、システム全体にわたって強制されるもので、ユーザーの判断で設定されるものではありません。
- 権限のあるエスカレーション攻撃での脆弱性が低減されます。一例を挙げると、プロセスがドメイン内で実行されるのでそれぞれ分離され、かつ SELinux ポリシールールがプロセスによるファイルおよび他のプロセスへのアクセス方法を定義することから、あるプロセスが危険にさらされても、攻撃者がアクセスできるのはそのプロセスの通常の機能とそのプロセスがアクセス権を持つ設定になっているファイルのみになります。例えば、Apache HTTP サーバーが危険にさらされても、特定の SELinux ポリシールールがユーザーのホームディレクトリーにあるファイルへのアクセスを許可するように追加・設定されていなければ、攻撃者はそのファイルを読み出すプロセスを使うことはできません。
- SELinux は、データの秘密性と整合性を強化し、プロセスを信頼できない入力から守るために使用できます。
しかし、SELinux は以下のものではありません。
- アンチウィルスソフトウェア
- パスワードやファイアウォール、その他のセキュリティーシステムなどに取って代わるもの
- オールインワンのセキュリティーソリューション
SELinux は既存のセキュリティーソリューションを強化する設計になっており、これらに代わるものではありません。SELinux の実行中でも、ソフトウェアを最新のもの更新したり、分かりにくいパスワードやファイアウォールを使うなどのすぐれたセキュリティー対策を継続することが重要です。