第3章 SELinux コンテキスト

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

Login Name                SELinux User              MLS/MCS Range

__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 (複数レベルセキュリティー) と MCS (複数カテゴリセキュリティー) が使用するレベルです。
role
SELinux の一部は RBAC (ロールベースアクセス制御) であり、ロールは RBAC の属性です。SELinux ユーザーはロールに対する権限を有しており、ロールはドメインに対する権限を持っています。ロールは、ドメインと SELinux ユーザーの媒介として機能します。入力可能なロールは、入力可能なドメインを決定し、最終的には、これがどのオブジェクトタイプがアクセス可能かを制御します。これが、権限のあるエスカレーション攻撃における脆弱性の低減に役立ちます。
type
タイプは、Type Enforcement の属性です。タイプはプロセスのドメインを定義し、ファイルのタイプを定義します。SELinux ポリシールールは、ドメインがタイプにアクセスする場合でも、ドメインが別のドメインにアクセスする場合でも、タイプ同士がアクセスする方法を定義します。アクセスは、アクセスを許可する特定の SELinux ポリシールールが存在する場合にのみ、許可されます。
level
レベルは、MLS および MCS の属性です。MLS 範囲は、レベルが異なる場合は lowlevel-highlevel、レベルが同一の場合は lowlevel と書かれる、一対のレベルです (s0-s0s0 と同じものです)。各レベルは、秘密度-カテゴリのペアで、カテゴリはオプションです。カテゴリがある場合、レベルは秘密度:カテゴリのセット と書かれます。カテゴリがない場合は、秘密度 と書かれます。
カテゴリセットは連続したもので、短縮が可能です。例えば、c0.c3c0,c1,c2,c3 と同じことです。/etc/selinux/targeted/setrans.conf ファイルは、レベル (s0:c0) をヒューマンリーダブルな形式にマッピングしています (すなわち、CompanyConfidential)。setrans.conf はテキストエディターで編集せず、semanage コマンドを使って変更してください。詳細については、 semanage(8) man ページを参照してください。Red Hat Enterprise Linux では、対象ポリシーは MCSを強制し、MCS には s0 の秘密度しかありません。Red Hat Enterprise Linux の MCS は、c0 から c1023 までの 1024 の異なるカテゴリをサポートします。s0-s0:c0.c1023 は秘密度 s0 で、全カテゴリに対する権限が与えられています。
MLS は、Bell-La Padula 必須アクセスモデルを強制し、LSPP (Labeled Security Protection Profile) 環境で使用されます。MLS の制限を使用するには、selinux-policy-mls パッケージをインストールし、MLS がデフォルトの SELinux ポリシーになるように設定します。Red Hat Enterprise Linux と出荷される MLS ポリシーは、評価済み設定の一部となっていないプログラムドメインの多くを省略するので、デスクトップワークステーション上の MLS は使用できません (X Window System ではサポートなし)。しかし、upstream SELinux Reference Policy からの MLS ポリシーは構築が可能で、これにはすべてのプログラムドメインが含まれます。MLS 設定の詳細については、「マルチレベルのセキュリティー (MLS)」 を参照してください。

3.1. ドメイン移行

あるドメインのプロセスは、移行先のドメインの entrypoint タイプがあるアプリケーションを実行することで、別のドメインに移行できます。entrypoint パーミッションは SELinux ポリシーで使用され、ドメインに入るためにどのアプリケーションを使用するかを制御します。以下にドメイン移行の例を示します。
  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 ドメインには passwd_exec_t タイプへの entrypoint パーミッションがあるとしています。
  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_tshadow_t タイプといったラベルが付けられたファイルのみです。これにより、passwd アプリケーションがだまされて任意のファイルを読み取り/書き込みすることを防ぎます。