第1章 はじめに

SELinux (Security-Enhanced Linux) は Linux カーネルに MAC (Mandatory Access Control) を実装するもので、標準の Discretionary Access Controls (DAC: 任意アクセス制御) を確認した後で許可される操作をチェックします。SELinux は、定義されたポリシーを基に Linux システム内のファイルやプロセスおよびその他のアクションにルールを強制できます。
SELinux を使用すると、ファイル (ディレクトリーやデバイスを含む) はオブジェクトとして参照されます。ユーザーによるコマンドや Mozilla Firefox アプリケーションなどの実行といったプロセスは、サブジェクトとして参照されます。ほとんどのオペレーティングシステムでは DAC (任意アクセス制御) が使われており、これはサブジェクトとオブジェクト、およびサブジェクト同士の情報交換方法を制御するものです。DAC を使用するオペレーティングシステムでは、ユーザーは自身が所有するファイルのパーミッション (オブジェクト) を制御します。例えば、Linux オペレーティングシステム上では、ユーザーは自身のホームディレクトリーを全ユーザー読み取り可能にすることができ、このような望ましくないアクションに対して新たな保護を加えることなく、ユーザーおよびプロセス (サブジェクト) に機密性の高い可能性のある情報へのアクセスを与えることができます。
DAC メカニズムにのみ依存することは、強固なシステムセキュリティーとしては基本的に不十分です。DAC のアクセスに関する決定は、ユーザー ID と所有権にのみ基づいており、ユーザーのロールやプログラムの機能および信頼性、データの機密性および整合性といったその他のセキュリティー関連情報を考慮していません。各ユーザーは通常、自身のファイルに対して完全な裁量権を有しており、システム全体にセキュリティーポリシーを強制することが困難になっています。さらに、ユーザーが実行するプログラムはすべて、そのユーザーに許可された全パーミッションを継承していて、ユーザーのファイルへのアクセスを変更することは自由にできます。このため、悪意のあるソフトウェアに対する保護は最低限のものしか与えられていません。多くのシステムサービスおよび権限が与えられているプログラムは、要件をはるかに超える雑な権限で実行されているため、プログラムのうちのどれかに欠点があると悪用されて、システムへのさらなるアクセスが取得される可能性があります[1]
以下は、SELinux を実行していない Linux オペレーティングシステムで使われているパーミッションの例です。システムによっては、パーミッションおよび出力はこの例とは多少異なる場合があります。ファイルパーミッションを表示するには、以下のコマンドを実行します。
~]$ 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 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 とグループ ID のみに基づいて制御されます。SELinux ポリシールールは、DAC ルールの でチェックされることを覚えておくことが重要です。DAC ルールが最初にアクセスを拒否すると、SELinux ポリシールールは使用されません。

注記

SELinux を実行する Linux オペレーティングシステム上には、Linux ユーザーと SELinux ユーザーがいます。SELinux ユーザーは、SELinux ポリシーの一部です。Linux ユーザーは SELinux ユーザーにマッピングされています。混乱を避けるために本ガイドでは、Linux ユーザーSELinux ユーザーという用語で区別します。

1.1. SELinux の利点

  • プロセスおよびファイルがすべて、タイプでラベル付けられます。タイプはプロセスのドメインを定義し、ファイルのタイプもあります。プロセスはそれぞれのドメインで実行することで互いに分離しており、SELinux ポリシールールはプロセスがファイルと対話する方法と、プロセス同士が対話する方法を定義します。アクセスは、明確にアクセスを許可するSELinux ポリシールールが存在する場合にのみ、許可されます。
  • 粒度の細かいアクセス制御。ユーザーの判断に任され、Linux ユーザーおよびグループ ID に基づいて制御されている従来の UNIX パーミッションにとどまらず、SELinux のアクセス決定は、SELinux ユーザーやロール、タイプ、さらにはオプションとしてレベルなどの利用可能なすべての情報に基づいて判断されます。
  • SELinux ポリシーは管理者が定義し、システム全体にわたって強制されるもので、ユーザーの判断で設定されるものではありません。
  • 権限のあるエスカレーション攻撃に対する脆弱性が低減されます。プロセスはドメイン内で実行されるので、それぞれが分離されます。SELinux ポリシールールは、プロセスがファイルおよび他のプロセスにアクセスする方法を定義します。あるプロセスが危険にさらされても、攻撃者がアクセスできるのはそのプロセスの通常の機能とそのプロセスがアクセス権を持つ設定になっているファイルのみになります。例えば、Apache HTTP サーバーが危険にさらされても、特定の SELinux ポリシールールでユーザーのホームディレクトリーにあるファイルを読み取る許可が追加されているかそのような設定になっていなければ、攻撃者はそのプロセスを使ってホームディレクトリーにあるファイルを読み取ることはできません。
  • SELinux を使用すると、データの秘密性と整合性が強化され、プロセスを信頼できない入力から保護します。
ただし、SELinux は以下のものではありません。
  • アンチウィルスソフトウェア
  • パスワードやファイアウォール、その他のセキュリティーシステムなどの代わりとなるもの
  • オールインワンのセキュリティーソリューション
SELinux は既存のセキュリティーソリューションを強化するように設計されており、これらに代わるものではありません。SELinux の実行中でも、ソフトウェアを最新のもの更新したり、分かりにくいパスワードやファイアウォールを使うなどのすぐれたセキュリティー対策を継続することが重要です。


[1] Peter Loscocco および Stephen Smalley 著「Integrating Flexible Support for Security Policies into the Linux Operating System」: この論文は当初、国家安全保障局向けに書かれましたが、現在は公開されています。詳細および初回リリースの文書については、オリジナル論文 を参照してください。編集および変更は、Murray McAllister 氏が行っています。
[2] Peter Loscocco および Stephen Smalley 著「Meeting Critical Security Objectives with Security-Enhanced Linux」: この論文は当初、国家安全保障局向けに書かれましたが、現在は公開されています。詳細および初回リリースの文書については、オリジナル論文 を参照してください。編集および変更は、Murray McAllister 氏が行っています。