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番号ではなくファイルパスにタイプを割り当てる
    • モード:EnforcementComplainの2つ
    • aa-genprofaa-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=disabled

SELinuxの一次的な有効化/無効化

getenforceコマンドで可能。

getenforce

またsetenforceコマンドはSELinuxのステータスを設定するコマンド。 設定できるパラメータは以下の通り。

  • Disabled … SELinuxの無効化
  • Permissive … ポリシを強制する代わりに警告表示。アクセス制限は無効。
  • Enforcing … セキュリティポリシの強制。アクセス制御が有効。
# 無効化
setenforce 0
# 有効化
setenforce 1

SELinuxセキュリティコンテキスト

セキュリティコンテキスト

セキュリティコンテキストの書式は以下の通り。

ユーザ識別子:ロール識別子:対応識別子[: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_rWebサーバコンテンツ管理者が使用
タイプ識別子説明
sshd_tSSH接続時に使用
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 on

8.2.4. SELinuxの関連コマンド

操作系コマンド説明
getenforce現在の動作モード表示
setenforce動作モードの一時的変更
selinuxenabledSELinuxが有効か数値で返す
chconファイルやディレクトリのセキュリティコンテキストを変更
seconファイルやプロセスに設定されたセキュリティコンテキストを表示
restoreconセキュリティコンテキストの復元
runcon指定されたセキュリティコンテキストでコマンドを実行
fixfilesSELinuxの設定ファイルに従いすべてのファイルにラベルを付与
setfiles指定した設定ファイルに従ってファイルにラベルを付与
sestatusSELinuxの現状を表示
seinfoSELinuxのロールやドメインなど各種情報を表示
newrole指定したロールに変更してシェルを起動
getseboolBool値で示されるポリシーの状態取得
setseboolBool値で示されるポリシーの設定
toggleseboolBool値で示されるポリシーの値変更
semanageSELinuxに関する各種操作

8.2.5. ファイルラベルとコンテキスト、ロールの管理ユーティリティ

ファイルのラベル付けと復元

restoreconコマンド

ファイルの SELinux コンテキストを以前のタイプに復元するコマンド。 -vオプションで変更内容を表示する。

restorecon -v file1

fixfilesコマンド

restoreconコマンドと同じ機能を提供するコマンド。

restorecon

setfilesコマンド

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-name

newroleコマンド

新しいコンテキストで新しいシェルを実行するコマンド。

newrole

runco​​nコマンド

指定された SELinux コンテキストでコマンドを実行するコマンド。

runco​​n

汎用的なポリシー管理

semanageコマンド

ポリシーソースの変更や再コンパイルを必要とせずに、SELinux ポリシーの特定の要素を構成するために使用されるコマンド。

semanage <引数>
オプション説明
-a設定の追加
-d設定の削除
-l設定のリスト表示
-m設定の修正
-s [ユーザ]指定したSELinuxユーザを対象にする
-t [タイプ]指定したタイプのオブジェクトを対象にする
引数説明
importローカルのカスタマイズをインポート
exportローカルのカスタマイズを出力
loginLinux ユーザーと SELinux 制限付きユーザーの間のログイン マッピングを管理する
userSELinux 制限付きユーザーの管理 (SELinux ユーザーの役割とレベル)
portネットワークポートタイプ定義の管理
interfaceネットワークインターフェースタイプの定義を管理する
moduleSELinux ポリシーモジュールの管理
nodenetworkノード タイプの定義を管理する
fcontextファイルコンテキストマッピング定義の管理
booleanブール値を管理して機能を選択的に有効にする
permissiveプロセスタイプ強制モードの管理
dontauditポリシー内の dontaudit ルールを無効/有効にする
ibpkeyinfiniband pkey タイプ定義の管理
ibendportInfiniband エンドポートタイプ定義の管理

semanage booleanコマンド

許可ルールのセットを有効または無効にすることができるコマンド。 これにより、異なるユースケースに対して異なるルールセットを許可することが可能になる。

ユースケースはユーザーのホーム ディレクトリのデータなどのユーザー コンテンツの読み取りを許可する必要がある Web サーバーがある場合などがある。このとき、SELinux ではデフォルトではそれができないが、semanage booleanコマンドを使用すると、その機能を有効にすることができる。

semanage boolean -l | grep httpd

semanage fcontextコマンド

アクセス制御を決定するための追加情報 (SELinux ユーザー、ロール、タイプ、レベルなど) を含むファイル コンテキスト定義を管理するために使用されるコマンド。

# 利用可能なポリシーの完全なリストを表示する
semanage fcontext -l

semanage 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]

解析系ユーティリティ

解析系コマンド説明
apolGUIでSELinuxポリシの分析
seauditGUIでSELinuxの監査ログを解析
seaudit-report監査ログのSELinux用カスタムレポートの作成
audit2why監査ログを解析し、アクセス拒否が発生した理由と解決方法を提示
audit2allow監査ログを解析しアクセス拒否が起きないルールを提示