第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-s0
はs0
と同じものです)。各レベルは、秘密度-カテゴリのペアで、カテゴリはオプションです。カテゴリがある場合、レベルは秘密度:カテゴリのセット と書かれます。カテゴリがない場合は、秘密度 と書かれます。カテゴリセットは連続したもので、短縮が可能です。例えば、c0.c3
はc0,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 ポリシーで使用され、ドメインに入るためにどのアプリケーションを使用するかを制御します。以下にドメイン移行の例を示します。
- ユーザーはパスワードの変更を希望しています。これを行うには、
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/passwdpasswd アプリケーションは、shadow_t
タイプのラベルが付けられている/etc/shadow
ファイルにアクセスします。~]$
ls -Z /etc/shadow
-r--------. root root system_u:object_r:shadow_t:s0 /etc/shadow - SELinux ポリシールールでは、
passwd_t
ドメインで実行中のプロセスによるshadow_t
タイプのラベルが付けられたファイルの読み取り/書き込みを許可するとしています。このshadow_t
タイプはパスワード変更に必要なファイルにのみ適用されます。これには、/etc/gshadow
と/etc/shadow
ファイル、およびこれらのバックアップファイルが含まれます。 - SELinux ポリシールールでは、
passwd_t
ドメインにはpasswd_exec_t
タイプへのentrypoint
パーミッションがあるとしています。 - ユーザーが
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 アプリケーションがだまされて任意のファイルを読み取り/書き込みすることを防ぎます。