Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

第2章 SELinux コンテキスト

プロセスとファイルには、SELinux ユーザー、ロール、タイプ、オプションでレベルなどの追加情報が含まれる SELinux コンテキストでラベルが付けられます。SELinux の実行時には、すべての情報はアクセス制御の決定に使用されます。Red Hat Enterprise Linux では、SELinux はロールベースアクセス制御 (RBAC)、Type Enforcement(TE)、およびオプションで Multi-Level Security(MLS) の組み合わせを提供します。
以下は、SELinux コンテキストを示しています。SELinux コンテキストは、SELinux を実行する Linux オペレーティングシステムの、プロセス、Linux ユーザー、およびファイルで使用されます。以下のコマンドを使用して、ファイルおよびディレクトリーの SELinux コンテキストを表示します。
~]$ ls -Z file1
-rwxrw-r--  user1 group1 unconfined_u:object_r:user_home_t:s0      file1
SELinux コンテキストは、SELinux user:role:type:level 構文に従います。各フィールドは、以下のとおりです。
SELinux ユーザー
SELinux ユーザー ID は、特定のロールセットと特定の MLS/MCS 範囲に対して承認されるポリシーに既知の ID です。各 Linux ユーザーは、SELinux ポリシーを使用して SELinux ユーザーにマッピングされます。これにより、Linux ユーザーは SELinux ユーザーの制限を継承できます。マップされた SELinux ユーザー ID は、開始できるロールとレベルを定義するために、そのセッションのプロセスに対して SELinux コンテキストで使用されます。root で以下のコマンドを入力して、SELinux と Linux ユーザーアカウントのマッピングの一覧を表示します (policycoreutils-pythonパッケージがインストールされている必要があります)。
~]# semanage login -l
Login Name           SELinux User         MLS/MCS Range        Service

__default__          unconfined_u         s0-s0:c0.c1023       *
root                 unconfined_u         s0-s0:c0.c1023       *
system_u             system_u             s0-s0:c0.c1023       *
出力は、システムごとにわずかに異なる場合があります
  • Login Name 列には、Linux ユーザーが一覧表示されます。
  • SELinux User 列には、Linux ユーザーがマッピングされている SELinux ユーザーが一覧表示されます。プロセスの場合、SELinux ユーザーはアクセス可能なロールとレベルを制限します。
  • MLS/MCS Range 列は、MLS(Multi-Level Security) および Multi-Category Security(MCS) で使用されるレベルです。
  • Service 列は、Linux ユーザーがシステムにログインする予定の正しい SELinux コンテキストを決定します。デフォルトでは、任意のサービスを表すアスタリスク (*) 文字が使用されます。
role
SELinux の一部は、ロールベースのアクセス制御 (RBAC) セキュリティーモデルです。ロールは RBAC の属性です。SELinux ユーザーはロールに対して許可され、ロールはドメインに対して承認されます。このロールは、ドメインと SELinux ユーザーの仲介として機能します。入力可能なロールによって入力できるドメインが決まります。最終的には、アクセス可能なオブジェクトタイプを制御します。これにより、権限昇格攻撃への脆弱性が軽減されます。
type
タイプは、Type Enforcement の属性です。タイプは、プロセスのドメインとファイルのタイプを定義します。SELinux ポリシールールは、タイプにアクセスするドメインであるか、別のドメインにアクセスするドメインであるかにかかわらず、タイプが相互にアクセスできる方法を定義します。アクセスは、それを許可する特定の SELinux ポリシールールが存在する場合にのみ許可されます。
level
このレベルは MLS と MCS の属性です。MLS の範囲はレベルのペアで、レベルが異なる場合は lowlevel-highlevel と記述され、レベルが同一である場合は lowlevel と記述されます (s0-s0s0と同じ)。各レベルは機密カテゴリーのペアで、カテゴリーはオプションになります。カテゴリーがある場合、レベルは sensitivity:category-set として記述されます。カテゴリーがない場合は、sensitivity と記述されます。
カテゴリーセットが連続したシリーズの場合は、省略できます。たとえば、c0.c3c0,c1,c2,c3 と同じです。/etc/selinux/targeted/setrans.conf ファイルはレベル (s0:c0) を人間が判読できる形式 (CompanyConfidential) にマップします。Red Hat Enterprise Linux では、Targeted ポリシーが MCS を強制し、MCS では 1 つの機密レベル (s0) があります。Red Hat Enterprise Linux の MCS は、1024 の異なるカテゴリー (c0 から c1023 まで) に対応しています。s0-s0:c0.c1023 は機密レベル s0 で、すべてのカテゴリーの権限が承認されます。
MLS は Bell-La Padula Mandatory Access Model を強制し、LSPP(Labeled Security Protection Profile) 環境で使用されます。MLS の制限を使用するには、selinux-policy-mls パッケージをインストールし、MLS がデフォルトの SELinux ポリシーになるように設定します。Red Hat Enterprise Linux に同梱される MLS ポリシーは、評価された設定に含まれなかった多くのプログラムドメインを省略するため、デスクトップワークステーションの MLS は使用できません (X Window System へのサポートなし)。ただし、アップストリームの SELinux 参照ポリシー から、すべてのプログラムドメインを含む MLS ポリシーを構築することができます。MLS 設定の詳細は、「Multi-Level Security (MLS)」 を参照してください。

2.1. ドメインの移行

あるドメインのプロセスは、新規ドメインの entrypoint タイプを持つアプリケーションを実行することにより、別のドメインに移行します。entrypoint パーミッションは、SELinux ポリシーで使用され、どのアプリケーションがドメインに入るために使用できるかを制御します。以下の例は、ドメイン移行を示しています。

手順2.1 ドメイン移行の例

  1. ユーザーがパスワードを変更したい。これを実行するには、passwd ユーティリティーを実行します。/usr/bin/passwd 実行可能ファイルには、passwd_exec_t タイプのラベルが付けられます。
    ~]$ ls -Z /usr/bin/passwd
    -rwsr-xr-x  root root system_u:object_r:passwd_exec_t:s0 /usr/bin/passwd
    
    passwd ユーティリティーは、shadow_t タイプのラベルが付けられた /etc/shadow にアクセスします。
    ~]$ ls -Z /etc/shadow
    -r--------. root root system_u:object_r:shadow_t:s0    /etc/shadow
    
  2. SELinux ポリシールールでは、passwd_t ドメインで実行しているプロセスが、shadow_t タイプのラベルが付けられたファイルに読み取りと書き込みが許可されていることを示しています。shadow_t タイプは、パスワードの変更に必要なファイルにのみ適用されます。これには、/etc/gshadow/etc/shadow、およびバックアップファイルが含まれます。
  3. SELinux ポリシールールは、passwd_t ドメインの entrypoint パーミッションが passwd_exec_t タイプに設定されていることを示しています。
  4. ユーザーが passwd ユーティリティーを実行すると、ユーザーのシェルプロセスは passwd_t ドメインに移行します。SELinux では、デフォルトのアクションは否定することで、passwd_t ドメインで実行しているアプリケーションが shadow_t タイプでラベル付けされたファイルにアクセスできるようにするルールが存在するため、passwd アプリケーションは /etc/shadow にアクセスし、ユーザーのパスワードを更新します。
この例は網羅的なものではなく、ドメイン移行を説明する基本的な例として使用されます。passwd_t ドメインで実行しているサブジェクトが shadow_t ファイルタイプでラベル付けされたオブジェクトにアクセスできるようにする実際のルールがありますが、サブジェクトが新しいドメインに移行する前に、その他の SELinux ポリシールールを満たす必要があります。この例では、Type Enforcement により以下が確保されます。
  • passwd_t ドメインを入力できるのは、passwd_exec_t タイプのラベルが付けられたアプリケーションを実行する場合のみです。これは、lib_t タイプなどの承認された共有ライブラリーからのみ実行でき、他のアプリケーションは実行できません。
  • passwd_t などの承認されたドメインのみが、shadow_t タイプのラベルが付けられたファイルに書き込みできます。他のプロセスがスーパーユーザー権限で実行されている場合でも、これらのプロセスは passwd_t ドメインで実行されていないため、shadow_t タイプのラベルが付けられたファイルに書き込みできません。
  • 承認されたドメインのみが passwd_t ドメインに移行できます。たとえば、sendmail_t ドメインで実行する sendmail プロセスには passwd を実行する適切な理由がないため、passwd_t ドメインに移行することはできません。
  • passwd_t ドメインで実行しているプロセスは、etc_t または shadow_t タイプのラベルが付けられたファイルなど、承認されたタイプに対する読み書きのみが可能です。これにより、passwd アプリケーションが任意のファイルの読み書きを行うのを防ぎます。