8.2. 強制アクセス制御
8.2.1. アクセス制御の概念と強制アクセス制御(MAC)
任意アクセス制御 (DAC) と強制アクセス制御 (MAC)
ほとんどの主流のOSのセキュリティシステムはDACと呼ばれる所有権によりセキュリティを強制する任意アクセス制御(DAC)に基づいている。
DACではユーザーがファイルを所有している場合、そのファイルに対する読み取り、書き込み、および実行のアクセス許可を設定できる。
つまりユーザの裁量でデータを制御するのがDACと呼べる。
Linuxにおいてはrootアカウントによりもたらされる危険性、具体的に言えばすべてのファイルとプロセスを制御する権限を持っているため、root アカウント、またはその権限で実行されるプロセスが侵害されると、攻撃者がシステムとそのデータを制御する可能性がある。
MAC(強制アクセス制御)はrootアカウントの必要性が制限される、または排除され、権限がユーザアカウントからシステムの所有者に移される。
MACではセキュリティポリシの適用を強制する。なおセキュリティポリシーは、システム所有者が設定し、システム管理者またはセキュリティ管理者が実装できる。
これらのポリシーが設定されると、たとえ root 権限を持っていたとしても、ユーザーはポリシーを上書きできない。そのためMACではファイルとプロセスの保護は所有者から独立しているといえる。
Linuxにおけるアクセス制御の処理順序
Linuxにおいてプロセスがファイルアクセスをする際、DAC => MACの順に処理される。
この際、DACとMAC両方許可されたときのみファイルアクセスに成功する。
なお、アクセス先がファイルではない場合、DACは関係なく、MACのみ処理される。
また、SELinuxでエラーが発生したときは監査ログ(/var/log/audit/audit.log)に記述される。
その他の強制アクセス制御システム
SELinux以外のMACツールには以下のようなものがある。
- AppArmor- UbuntuやSUSE Linuxで使用されているセキュリティモジュール
- プロファイルと呼ばれるセキュリティポリシーを使用して、アプリケーション単位のアクセス権を設定することができる
- AppArmorはファイルパスで保持するため、ファイルシステムを選ばずに利用できるという利点がある
- SELinuxよりも管理が容易
- inode番号ではなくファイルパスにタイプを割り当てる
- モード:EnforcementとComplainの2つ
- aa-genprofと- aa-logpro fコマンド(ポリシ作成に使用)がある
 
- Smack- 設定がシンプルなセキュリティモジュール
- カーネルモジュール、起動スクリプト、GNUセキュリティパッケージ用のパッチセット、の三つで構成される
- カーネルにコンパイルする必要がある
- ラベルの割り当てに拡張ファイル属性を使用
- -ZSELinux のようなフラグを使用
- chsmackコマンドをラベル情報のクエリと設定に使用する
 
8.2.2. SELinux (Security-Enhanced Linux) の基礎と機能
SELinuxの概要
SELinux(Security-Enhanced Linux)は管理者がシステムにアクセスできるユーザーをより詳細に制御できるようにするLinuxアーキテクチャのこと。
米国のNSAにより開発された。
SELinuxは、システム上のアプリケーション、プロセス、ファイルのアクセス制御を定義する。
これはSELinux にアクセスできるものとできないものを指示する一連のルールであるセキュリティポリシーを使用して、ポリシーによって許可されたアクセスを強制する。
アプリケーションまたはプロセスがファイルなどのオブジェクトへのアクセス要求(サブジェクトと呼ばれる)を行うとSELinux はサブジェクトとオブジェクトのアクセス許可がキャッシュされているアクセスベクターキャッシュ (AVC) を使用してチェックする。
SELinux がキャッシュされたアクセス許可に基づいてアクセスを決定できない場合、リクエストをセキュリティサーバーに送信する。
セキュリティサーバーは、アプリまたはプロセスとファイルのセキュリティコンテキストをチェックする。セキュリティコンテキストは SELinux ポリシーデータベースから適用され、その後、許可が付与または拒否される。
なおアクセス許可が拒否された場合、avc: deniedと/var/log.messagesに表示される。
SELinuxの主要な機能と概念の理解
SELinuxの主要な機能
SELinuxには以下のような機能がある。
- TE(Type Enforcement)- プロセスやリソースに対する操作権限を制限する
- プロセスには「ドメイン」、ファイルやディレクトリなどのリソースには「タイプ」というラベルを付与することにより、細かなアクセス制御を実現する
 
- ドメイン遷移- 子プロセスを、親プロセスとは異なるドメインに遷移させる
- 子プロセスを親プロセスと異なるドメインに遷移させる事により、親プロセスの持つ権限を引き継がず個別に権限を制御できる
 
- RBAC(Role Based Access Control)- 従来のLinuxにおいてrootユーザが持っていた絶対的な権限を分散し、「システム管理者」や「Web管理者」といったロール(役割)をユーザに割り当てる
 
SELinuxの設定
SELinux を構成するに様々な方法があるが、一般的な方法には対象を絞ったポリシーまたは**マルチレベルセキュリティ (MLS)**がある。
- 対象を絞ったポリシー … デフォルト設定。さまざまなプロセス、タスク、サービスをカバーする
- MLS … 通常は政府機関の機器で使用される設定
8.2.3. SELinuxの動作モードと設定管理
動作モードの理解と確認
SELinuxの動作モード
SELinuxの動作は/etc/sysconfig/selinuxファイルの確認で可能。
このファイルにはSELinuxが許容モード、強制モード、または無効のいずれであるか、またはどのポリシーがロードされることになっているかが保存される。
cat /etc/sysconfig/selinux- Disabled … SELinuxが無効の状態
- Enforcing … SELinuxが有効でアクセス違反は拒否する
- Permissive … SELinuxが有効でアクセス違反は許可されるが、ログに記録する
SELinuxの動作モード確認
SELinuxはデフォルトで有効になっており、デフォルトモードであるEnforceモードで動作している。
確認にはsestatusコマンドで確認できる。
sestatusまたSELinuxポリシーの一部をクエリするにはseinfoコマンドで行える。
seinfoまたapolと呼ばれるGUI SELinux ポリシー分析ツールではsesinfoコマンドと同様の機能をGUIで提供する。
利用にはsetools-uiパッケージをインストールする必要がある。
SELinuxの永続的な有効化/無効化
SELinuxの永続設定は/etc/selinux/configファイルの編集にて行う。
再起動後に設定が反映される。
# 有効化
SELINUX=enforcing
# 無効化
SELINUX=disabledSELinuxの一次的な有効化/無効化
getenforceコマンドで可能。
getenforceまたsetenforceコマンドはSELinuxのステータスを設定するコマンド。
設定できるパラメータは以下の通り。
- Disabled … SELinuxの無効化
- Permissive … ポリシを強制する代わりに警告表示。アクセス制限は無効。
- Enforcing … セキュリティポリシの強制。アクセス制御が有効。
# 無効化
setenforce 0
# 有効化
setenforce 1SELinuxセキュリティコンテキスト
セキュリティコンテキスト
セキュリティコンテキストの書式は以下の通り。
ユーザ識別子:ロール識別子:対応識別子[:MLS]
# 例
system_u:object_r:lib_t:s0- ユーザ識別子 … SELinuxユーザ
- ロール識別子 … ユーザに割り当てるロールを表す
- タイプ識別子 … TEで使用するドメインまたはタイプを表す
- MLS … 情報の機密性を表す
| ユーザ識別子 | 説明 | 
|---|---|
| root | システム管理者用 | 
| system_u | プロセスなどを使用するユーザ用 | 
| user_u | 一般ユーザ用 | 
| ロール識別子 | 説明 | 
|---|---|
| object_r | ファイルなどロールが不要なものに付与 | 
| staff_r | 一般ユーザが使用(sysadm_rに変更可能) | 
| user_r | 一般ユーザが使用(sysadm_rに利用不可能) | 
| sysadm_r | システム管理者が使用 | 
| system_r | プロセスが使用 | 
| webmaster_r | Webサーバコンテンツ管理者が使用 | 
| タイプ識別子 | 説明 | 
|---|---|
| sshd_t | SSH接続時に使用 | 
| sysdam_t | システム管理者が使用 | 
セキュリティコンテキストの確認
セキュリティコンテキストの確認は以下コマンドで行える。
- プロセス … ps Zコマンド
- ファイル/ディレクトリ … ls -Zコマンド
Bool値(Boolean)によるポリシー設定
Bool値を使用すると、SELinuxポリシの作成に関する知識がなくても実行時に、SELinuxのポリシ一部を変更できる。
これはSELinuxのポリシのリロード、再コンパイルを行わずに、サービスによるNFSボリュームへのアクセス許可などの変更が可能になることを意味する。
またBool値を設定/表示するコマンドは以下の通り。
| コマンド | 説明 | 
|---|---|
| getsebool | コマンドはBool値をリストするコマンド | 
| setsebool | ブール値を有効または無効にするコマンド | 
# SELinuxの論理パラメータのON/OFFすべてを表示
getsebool -a
# 論理パラメータを再起動後にも有効となるようにする
setsebool -P httpd_enable_cgi on8.2.4. SELinuxの関連コマンド
| 操作系コマンド | 説明 | 
|---|---|
| getenforce | 現在の動作モード表示 | 
| setenforce | 動作モードの一時的変更 | 
| selinuxenabled | SELinuxが有効か数値で返す | 
| chcon | ファイルやディレクトリのセキュリティコンテキストを変更 | 
| secon | ファイルやプロセスに設定されたセキュリティコンテキストを表示 | 
| restorecon | セキュリティコンテキストの復元 | 
| runcon | 指定されたセキュリティコンテキストでコマンドを実行 | 
| fixfiles | SELinuxの設定ファイルに従いすべてのファイルにラベルを付与 | 
| setfiles | 指定した設定ファイルに従ってファイルにラベルを付与 | 
| sestatus | SELinuxの現状を表示 | 
| seinfo | SELinuxのロールやドメインなど各種情報を表示 | 
| newrole | 指定したロールに変更してシェルを起動 | 
| getsebool | Bool値で示されるポリシーの状態取得 | 
| setsebool | Bool値で示されるポリシーの設定 | 
| togglesebool | Bool値で示されるポリシーの値変更 | 
| semanage | SELinuxに関する各種操作 | 
8.2.5. ファイルラベルとコンテキスト、ロールの管理ユーティリティ
ファイルのラベル付けと復元
restoreconコマンド
ファイルの SELinux コンテキストを以前のタイプに復元するコマンド。
-vオプションで変更内容を表示する。
restorecon -v file1fixfilesコマンド
restoreconコマンドと同じ機能を提供するコマンド。
restoreconsetfilesコマンド
SELinux ファイルのセキュリティコンテキストを設定するために使用できるコマンド。
setfilesコンテキストの変更とテスト
SELinux の一部には、Role-Based Access Control (RBAC) セキュリティモデルが実装されている。
ロールは RBAC の属性となる。
SELinux ユーザーにはロールが承認され、ロールはドメインに対して承認される。
この役割はドメインと SELinux ユーザーの間の仲介者として機能する
これは、権限昇格攻撃に対する脆弱性を軽減するのに役立つ。
chconコマンド
chconコマンドはファイル/ディレクトリのセキュリティコンテキストを変更するコマンド。
ただし、このchconコマンドで行われた変更は、ファイルシステムのラベルを変更したり、restoreconコマンドを実行したりしても保持されない。
# ファイルタイプの変更
chcon -t httpd_sys_content_t file-name
# ファイルタイプと内容の再帰的変更
chcon -R -t httpd_sys_content_t directory-namenewroleコマンド
新しいコンテキストで新しいシェルを実行するコマンド。
newrolerunconコマンド
指定された SELinux コンテキストでコマンドを実行するコマンド。
runcon汎用的なポリシー管理
semanageコマンド
ポリシーソースの変更や再コンパイルを必要とせずに、SELinux ポリシーの特定の要素を構成するために使用されるコマンド。
semanage <引数>| オプション | 説明 | 
|---|---|
| -a | 設定の追加 | 
| -d | 設定の削除 | 
| -l | 設定のリスト表示 | 
| -m | 設定の修正 | 
| -s [ユーザ] | 指定したSELinuxユーザを対象にする | 
| -t [タイプ] | 指定したタイプのオブジェクトを対象にする | 
| 引数 | 説明 | 
|---|---|
| import | ローカルのカスタマイズをインポート | 
| export | ローカルのカスタマイズを出力 | 
| login | Linux ユーザーと SELinux 制限付きユーザーの間のログイン マッピングを管理する | 
| user | SELinux 制限付きユーザーの管理 (SELinux ユーザーの役割とレベル) | 
| port | ネットワークポートタイプ定義の管理 | 
| interface | ネットワークインターフェースタイプの定義を管理する | 
| module | SELinux ポリシーモジュールの管理 | 
| nodenetwork | ノード タイプの定義を管理する | 
| fcontext | ファイルコンテキストマッピング定義の管理 | 
| boolean | ブール値を管理して機能を選択的に有効にする | 
| permissive | プロセスタイプ強制モードの管理 | 
| dontaudit | ポリシー内の dontaudit ルールを無効/有効にする | 
| ibpkey | infiniband pkey タイプ定義の管理 | 
| ibendport | Infiniband エンドポートタイプ定義の管理 | 
semanage booleanコマンド
許可ルールのセットを有効または無効にすることができるコマンド。 これにより、異なるユースケースに対して異なるルールセットを許可することが可能になる。
ユースケースはユーザーのホーム ディレクトリのデータなどのユーザー コンテンツの読み取りを許可する必要がある Web サーバーがある場合などがある。このとき、SELinux ではデフォルトではそれができないが、semanage booleanコマンドを使用すると、その機能を有効にすることができる。
semanage boolean -l | grep httpdsemanage fcontextコマンド
アクセス制御を決定するための追加情報 (SELinux ユーザー、ロール、タイプ、レベルなど) を含むファイル コンテキスト定義を管理するために使用されるコマンド。
# 利用可能なポリシーの完全なリストを表示する
semanage fcontext -lsemanage portコマンド
カスタムポートでサービスを実行できるコマンド。
semanage port -a -t ssh_port_t -p tcp 2112カスタムポートでサービスを実行しようとすると、サービスは失敗する。 例として、SSH デーモンを標準以外のポートで実行したいとする。このために単に sshd_config を構成すると、SELinux はこの変更が行われたことを認識しないため、SELinux がアクセスをブロックする。
8.2.6. SELinuxトラブルシューティングと監査
AVCメッセージの記録
SELinux がアクションを拒否すると、アクセス ベクター キャッシュ (AVC) メッセージがファイルに記録される。
保存される場所は/var/log/audit/audit.logか/var/log/messagesに保存され、またそれはjournaldデーモンによって記録される。
CUIでのトラブルシューティング
ausearchコマンド
最近の AVC メッセージを検索し、SELinux がアクションを拒否していることを確認できるコマンド。
ausearch -m AVC,USER_AVC -ts recent-mオプションはausearch が返す情報の種類を指定、-tsはタイムスタンプを指定する。
- -ts recently… 過去10分間のAVCメッセージを表示
- -ts today… 1日全体のメッセージを表示
sealertコマンド
AVC メッセージをさらに詳細に確認するコマンド。
sealert -l [メッセージID]解析系ユーティリティ
| 解析系コマンド | 説明 | 
|---|---|
| apol | GUIでSELinuxポリシの分析 | 
| seaudit | GUIでSELinuxの監査ログを解析 | 
| seaudit-report | 監査ログのSELinux用カスタムレポートの作成 | 
| audit2why | 監査ログを解析し、アクセス拒否が発生した理由と解決方法を提示 | 
| audit2allow | 監査ログを解析しアクセス拒否が起きないルールを提示 |