本ページでは、SELinuxの概要について説明します。
SELinuxの概要
SELinuxとは、米国国家安全保障局(NSA: National Security Agenc)が開発したLinuxカーネルのセキュリティモジュールです。ユーザやプロセスごとにきめ細かなアクセス制御を提供します。SELinuxはあくまでもLinuxカーネルのモジュールなので、そういった名前のLinuxディストリビューションが存在するわけではありません。
また、近年はスマートフォンのAndroid OSにも搭載されていたりします。
Linuxアクセス制御の仕組み
Linuxのアクセス制御には、DAC、MACという方式が存在します。
Linux標準ではDACのみサポートされており、SELinuxを導入することでMACが実現できます。
DAC(Discretionary Access Control)
DACは任意アクセス制御とも呼ばれ、ユーザが自分自身でアクセス制御の設定を行います。
アクセス権限を持っていないユーザが対象オブジェクトへアクセスすることは防げますが、アクセス権限を持っているユーザが勝手に対象オブジェクトの権限を変更することができるという問題があります。
MAC(Mandatory Access Control)
MACは強制アクセス制御とも呼ばれ、管理者が強制的にアクセス制御の設定を行います。ここで言う管理者はLinuxのrootユーザとは異なる概念です。
MACを導入することで、DACのように、ユーザが勝手にファイルやディレクトリの権限を変更することができなくなります。
SELinuxのコンテキスト
SELinuxを有効化した状態では、OS上で扱うリソース(ファイルやディレクトリ、プロセス)に対してコンテキストと呼ばれる属性が付与されます。
コンテキストには、:(コロン)で区切られた以下4つの属性があります。
- SELinux user (Linuxユーザとは異なる概念です)
- role
- type(対象がプロセスの場合はdomain)
- level
コンテキストは、ls
やps
コマンドにオプション-Z
を付けることで表示できます。
### ディレクトリのコンテキストを表示
# ls -dZ /var
drwxr-xr-x. root root system_u:object_r:var_t:s0 /var/
### /varの直下にファイルを作成
# cd /var/
# touch test
### ファイルのコンテキストを表示
# ls -Z test
-rw-r--r--. root root unconfined_u:object_r:var_t:s0 test
### 現在のユーザ(root)のプロセスを表示
# ps -Z
LABEL PID TTY TIME CMD
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 2558 pts/0 00:00:00 sudo
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 2562 pts/0 00:00:00 bash
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 2601 pts/0 00:00:00 ps
たとえば、上記表示例の一番最初の/varディレクトリの表示結果からは、同ディレクトリは以下の属性を持っていることがわかります。
属性 | 値 |
---|---|
SELinux user | system_u |
role | object_r |
type | var_t |
level | s0 |
SELinuxのアクセス制御モデル
SELinuxには、アクセス制御のコントロールをするためにアクセス制御モデルという概念があります。
アクセス制御モデルには、以下4種類が存在します。
- TE(Type Enforcement)
- RBAC(Role Based Access Control)
- MCS(Mucti Category Security)
- MLS(Multi Level Security)
TE(Type Enforcement)
TE(Type Enforcement)はSELinuxのアクセス制御モデルで一番よく使われます。プロセスがリソースにアクセスする権限をアクセスルールに定義して制御します。
アクセスルールは、前述のコンテキストの中から、プロセスに定義されたrole
と、リソースに定義されたtype
を指定し、2つの属性の組み合わせて定義します。
アクセスルールはセキュリティポリシーファイルとして保存されます。
RBAC(Role Based Access Control)
RBAC(Role Based Access Control)は、SELinuxユーザに対して権限の集合体となるRole(役割)を付与するアクセス制御モデルです。
MLS(Multi Level Security)
MLS(Multi Level Security)は、軍事レベルの機密管理を行うためのアクセス制御モデルです。SELinuxユーザやリソースに対して個別の機密レベルを付与して、アクセスできる対象を制御しています。
設定が複雑なため、あまり利用されることはありません。
MCS(Mucti Category Security)
MCS(Mucti Category Security)は、MLS(Multi Level Security)を簡素化し、機密レベルの代わりに機密カテゴリを使用したアクセス制御モデルです。設定が複雑なため、あまり利用されることはありません。
SELinuxの動作モード
SELinuxには3つのモードが存在します。これらのモードは、SELinuxによる強制アクセス制御を行うかどうかの動作を表しています。
Enforcing
SELinuxのポリシーが強制され、ポリシールールに基づいてアクセスを拒否します。
Permissive
ポリシールールによるアクセス拒否は行われませんが、監査ログにポリシールール違反の警告が出力されます。
Disabled
SELinux自体が無効化されます。
SELinuxは無効化すべきか
最後に、SELinuxの有効化、無効化の考え方について。
色々なところで議論されていますが、筆者は以下のように考えています。最終的には、構築・運用共にSELinuxの事を考慮しているシステムか否かで判断します。SELinuxを考慮されていないシステムで無理やり運用しても稼働負荷が増えるだけなので、そういった現場のシステムでは無効化してしまうのも一つの手です。
SELinuxを有効化すべき場合
- セキュリティ要件として、どのようなアプリケーションがどのような振る舞いをすべきか明確に定まっている
- システム構築部門がSELinuxのアクセス制御を考慮した上で設計を実施している
- システム運用部門がSELinuxを運用できるリソース(人員、運用スキーム)を持っている
SELinuxを無効化すべき場合
- システムのセキュリティ要件で詳細なアクセス制御が定まっていない
- システム構築部門