コンテンツにスキップ

8. アクセス制御

8.1. 任意アクセス制御

任意アクセス制御はDACとも呼ばれ、アクセス制御リスト(ACL)を用いて実装できる。

8.1.1. 基本的なシステム権限設定

chmodコマンド

ファイルのアクセス許可を変更するために使用できるコマンド。

詳細はコチラから。

suid/guid

Linux権限システムでは、SUIDでユーザIDベースの、GUIDでグループIDベースのアクセスモードが提供されている。

プログラムにSUIDアクセスモード(u+s)で設定されている場合、そのファイルの所有者によりプロセスが開始されたように見える。

またプログラムにGUIDアクセスモード(g+s)で設定されている場合、プログラムはファイルのグループに属しているように実行される。

詳細はコチラから。

スティッキービット

ディレクトリにスティッキービット(o+t)を設定すると、ファイルの削除またはリンク解除を所有ユーザーまたはrootのみに許可できる

詳細はコチラから。

chownコマンド

rootユーザが使用できるコマンドでファイルの所有権を変更できるコマンド

詳細はコチラから。

拡張属性

拡張属性(xattr)はファイルシステム内のファイルまたはディレクトリに追加データを追加するメカニズムで、ext2、ext3、ext4、jfs、xfs、reiserfs、btrfs などの多くのファイル システムがサポートしている。

拡張ファイル属性は、ファイル システム、データ管理 API などの他のミドルウェア、オペレーティング システム、またはユーザーによってプログラム的に設定できるキーと値のペアのこと。

拡張属性の名前は、次の拡張属性名のように、名前空間名、ドット、属性名で構成される。

user.swift.metadata

system.posix_acl_access

パブリックの名前空間は以下の通り。

  • user ... 名前や内容の制限なし名前空間
  • Trusted ... 通常のプロセスがアクセスできない拡張属性に情報を保持するメカニズムをユーザー空間に実装するために使用される
  • security ... SELinux によって使用される
  • system ... 主にカーネルによってアクセス制御リスト (ACL) 用に使用される

getgfattr/setfattrコマンド

attrパッケージで使用できるコマンドにはgetgfattr/setfattrコマンドがある。 拡張属性の設定・確認に使用する。

# 指定されたパス内のファイルごとに、ファイル名と、そのファイルに関連付けられている拡張属性名 (およびオプションで値) のセットを表示
getfattr

# 指定されたパスの名前付き属性を返す
getfattr -n <name>
getfattr --name <name>

# 拡張属性名および値を表示
getfattr -d
getfattr --dump

# 指定されたパターンに一致する属性を持つ属性を返す
getfattr -m <pattern>

# 拡張属性の値の表示形式を指定する
getfattr -e <エンコード>
getfattr --encoding=<エンコード>
# 指定された各ファイルの拡張属性名に新しい値を関連付ける
setfattr

# 指定されたパスの名前付き属性を返す
setfattr -n <name>
setfattr --name <name>
# 指定された属性に割り当てる新しい値
setfattr -v <value>
setfattr --value <value>
# 属性を完全に削除
setfattr -x  <name>
setfattr --remove  <name>
# 指定したACLをデフォルトACLに設定
setfattr -d 
setfattr --default
# 指定したACLに設定を変更/追加
setfattr -m <権限>

8.1.2. ACLの使用

ACLは所有者以外のユーザーまたはグループに対して異なる権限であっても、特定の権限を定義する場合に使用できる。

また、ACLの使用は基本的な所有権や権限を (必然的に) 変更することなく、より具体的な権限のセットをファイルまたはディレクトリに適用できる。これにより、他のユーザーまたはグループのアクセスを追加できるようになる。

ACL権限を割り当てることができるエントリ タグは4つある。

  • user(u) ... ファイル所有者または指定されたユーザ
  • group(g) ... グループ所有者または指定されたグループ
  • mask(m) ... ファイル所有者のユーザー エントリを除く、任意の ACL エントリによって付与できる最大アクセスを指定するエントリ
  • other(o) ... ユーザーまたはグループの ACL エントリに一致しないプロセスに許可されるアクセスを指定するエントリ

設定例は以下の通り。

# ユーザー john には読み取りおよび書き込みアクセス権を与える
u:john:rw-
# グループ スタッフには読み取りアクセス権を付与
g:staff:r--
# その他のアクセスはなし
o::---

getfaclコマンド

getfaclコマンドはファイルごとにファイル アクセス制御リスト(ACL)を取得できるコマンド。 ディレクトリにデフォルト ACL がある場合は、 getfaclデフォルト ACL も表示される。

getfacl <ファイル名/ディレクトリ名>
オプション 説明
-a 設定されているACLの表示
-d デフォルトACLを表示
-R ファイルやディレクトリのACLを再帰的に表示

setfaclコマンド

setfaclコマンドはACLを設定するコマンド。構文は以下の通り。

setfacl [オプション] [アクション] ファイル

なおアクションは-mで変更、-xで削除になる。

使用例は以下の通り。

# Userにパーミッションを追加する
setfacl -m "u:user:permissions" /path/to/file

ACLのマスク設定

マスク設定を行うとすべてのユーザーに許可される最大設定に設定される。 また、マスク設定は、chmodまたは setfaclコマンドのいずれかを使用してアクセス許可を変更すると、間接的に自動的に再度更新される。

コマンド 説明
setfacl -m u:lisa:r file 追加のユーザーに読み取りアクセスを許可する
setfacl -m m::rx file すべてのグループおよびすべての指定ユーザーからの書き込みアクセスを取り消す (有効な権限マスクを使用)
setfacl -x g:staff file ファイルの ACL からの名前付きグループ エントリの削除
getfacl file1 setfacl --set-file=- file2
getfacl --access dir setfacl -d -M- dir

8.2. 強制アクセス制御

8.2.1. DACとMAC

ほとんどの主流のOSのセキュリティシステムはDACと呼ばれる所有権によりセキュリティを強制する任意アクセス制御(DAC)に基づいている。 DACではユーザーがファイルを所有している場合、そのファイルに対する読み取り、書き込み、および実行のアクセス許可を設定できる。 つまりユーザの裁量でデータを制御するのがDACと呼べる。

Linuxにおいてはrootアカウントによりもたらされる危険性、具体的に言えばすべてのファイルとプロセスを制御する権限を持っているため、root アカウント、またはその権限で実行されるプロセスが侵害されると、攻撃者がシステムとそのデータを制御する可能性がある。

MAC(強制アクセス制御)はrootアカウントの必要性が制限される、または排除され、権限がユーザアカウントからシステムの所有者に移される。 MACではセキュリティポリシの適用を強制する。なおセキュリティポリシーは、システム所有者が設定し、システム管理者またはセキュリティ管理者が実装できる。 これらのポリシーが設定されると、たとえ root 権限を持っていたとしても、ユーザーはポリシーを上書きできない。そのためMACではファイルとプロセスの保護は所有者から独立しているといえる。

有名な強制アクセス制御(MAC)のシステムは以下のようなものがある。

  • SELinux
  • AppArmor
    • UbuntuやSUSE Linuxで使用されているセキュリティモジュール
    • プロファイルと呼ばれるセキュリティポリシーを使用して、アプリケーション単位のアクセス権を設定することができる
    • AppArmorはファイルパスで保持するため、ファイルシステムを選ばずに利用できるという利点がある
  • Smack
    • 設定がシンプルなセキュリティモジュール
    • カーネルモジュール、起動スクリプト、GNUセキュリティパッケージ用のパッチセット、の三つで構成される

DACとMACの処理順序

Linuxにおいてプロセスがファイルアクセスをする際、DAC => MACの順に処理される。 この際、DACとMAC両方許可されたときのみファイルアクセスに成功する。

なお、アクセス先がファイルではない場合、DACは関係なく、MACのみ処理される。 また、SELinuxでエラーが発生したときは監査ログ(/var/log/audit/audit.log)に記述される。

8.2.2. SELinux

SELinux(Security - Enhanced Linux)は管理者がシステムにアクセスできるユーザーをより詳細に制御できるようにするLinuxアーキテクチャのこと。 米国のNSAにより開発された。

SELinuxの動作

SELinuxは、システム上のアプリケーション、プロセス、ファイルのアクセス制御を定義する。 これはSELinux にアクセスできるものとできないものを指示する一連のルールであるセキュリティポリシーを使用して、ポリシーによって許可されたアクセスを強制する

アプリケーションまたはプロセスがファイルなどのオブジェクトへのアクセス要求(サブジェクトと呼ばれる)を行うとSELinux はサブジェクトとオブジェクトのアクセス許可がキャッシュされているアクセスベクターキャッシュ (AVC) を使用してチェックする。 SELinux がキャッシュされたアクセス許可に基づいてアクセスを決定できない場合、リクエストをセキュリティサーバーに送信する。 セキュリティサーバーは、アプリまたはプロセスとファイルのセキュリティコンテキストをチェックする。セキュリティコンテキストは SELinux ポリシーデータベースから適用され、その後、許可が付与または拒否される。

なおアクセス許可が拒否された場合、avc: denied/var/log.messagesに表示される。

SELinuxの機能

  • TE(Type Enforcement)
    • プロセスやリソースに対する操作権限を制限する
    • プロセスには「ドメイン」、ファイルやディレクトリなどのリソースには「タイプ」というラベルを付与することにより、細かなアクセス制御を実現する
  • ドメイン遷移
    • 子プロセスを、親プロセスとは異なるドメインに遷移させる
    • 子プロセスを親プロセスと異なるドメインに遷移させる事により、親プロセスの持つ権限を引き継がず個別に権限を制御できる
  • RBAC(Role Based Access Control)
    • 従来のLinuxにおいてrootユーザが持っていた絶対的な権限を分散し、「システム管理者」や「Web管理者」といったロール(役割)をユーザに割り当てる
  • MAC(Mandatory Access Control)

SELinuxの設定

SELinux を構成するに様々な方法があるが、一般的な方法には対象を絞ったポリシーまたはマルチレベルセキュリティ (MLS)がある。

  • 対象を絞ったポリシー ... デフォルト設定。さまざまなプロセス、タスク、サービスをカバーする
  • MLS ... 通常は政府機関の機器で使用される設定

SELinuxの動作は/etc/sysconfig/selinuxファイルの確認で可能。 このファイルにはSELinuxが許容モード、強制モード、または無効のいずれであるか、またはどのポリシーがロードされることになっているかが保存される。

cat /etc/sysconfig/selinux
  • Enforcing ... アクセス違反は拒否する
  • Permissive ... アクセス違反は許可されるが、ログに記録する

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

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

ユーザ識別子:ロール識別子:対応識別子[:MLS]
  • ユーザ識別子 ... SELinuxユーザ
  • ロール識別子 ... ユーザに割り当てるロールを表す
  • タイプ識別子 ... TEで使用するドメインまたはタイプを表す
  • MLS ... 情報の機密性を表す
ユーザ識別子 説明
root システム管理者用
system_u プロセスなどを使用するユーザ用
user_u 一般ユーザ用
ロール識別子 説明
object_r ファイルなどロールが不要なものに付与
staff_r 一般ユーザが使用(sysadm_rに変更可能)
user_r 一般ユーザが使用(sysadm_rに利用不可能)
sysadm_r システム管理者が使用
system_r プロセスが使用
タイプ識別子 説明
sshd_t SSH接続時に使用
sysdam_t システム管理者が使用

セキュリティコンテキストの確認

セキュリティコンテキストの確認は以下コマンドで行える。

  • プロセス ... ps Zコマンド
  • ファイル/ディレクトリ ... ls -Zコマンド

SELinuxの動作モード確認

SELinuxはデフォルトで有効になっており、デフォルトモードであるEnforceモードで動作している。 確認にはsestatusコマンドで確認できる。

sestatus

またSELinuxポリシーの一部をクエリするにはseinfoコマンドで行える。

seinfo

またapolと呼ばれるGUI SELinux ポリシー分析ツールではsesinfoコマンドと同様の機能をGUIで提供する。 利用にはsetools-uiパッケージをインストールする必要がある。

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

getenforceコマンドで可能。

getenforce

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

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

SELinuxの永続的な有効化/無効化

SELinuxの永続設定は/etc/selinux/configファイルの編集にて行う。 再起動後に設定が反映される。

# 有効化
SELINUX=enforcing

# 無効化
SELINUX=disabled

Bool値によるSELinuxポリシの設定

Bool値を使用すると、SELinuxポリシの作成に関する知識がなくても実行時に、SELinuxのポリシ一部を変更できる。 これはSELinuxのポリシのリロード、再コンパイルを行わずに、サービスによるNFSボリュームへのアクセス許可などの変更が可能になることを意味する。

またBool値を設定/表示するコマンドは以下の通り。

コマンド 説明
getsebool コマンドはBool値をリストするコマンド
setsebool ブール値を有効または無効にするコマンド

SELinuxにおけるファイルのラベル付け

SELinuxではSELinuxコンテキストと呼ばれるすべてのプロセスとファイルにセキュリティ関連の情報を表すラベルが付けられる。

確認にはls -Z <ファイル名/ディレクトリ名>で行える。

ls -Z file1
-rw-rw-r--  user1 group1 unconfined_u:object_r:user_home_t:s0 file1

SELinuxはユーザ(u)/ロール(r)/タイプ(t)/レベル(s0)の情報を提供する。 これらの情報はアクセス制御の決定を行うために使用される。

またSELinuxにはファイルシステムへのラベル付けを管理するためのコマンドで以下のものを提供している。

  • chcon
  • semanage fcontext
  • restorecon

SELinux関連コマンド一覧

操作系コマンド 説明
getenforce 現在の動作モード表示
setenforce 動作モードの一時的変更
selinuxenabled SELinuxが有効か数値で返す
chcon ファイルやディレクトリのセキュリティコンテキストを変更
restorecon セキュリティコンテキストの復元
runcon 指定されたセキュリティコンテキストでコマンドを実行
fixfiles SELinuxの設定ファイルに従いすべてのファイルにラベルを付与
setfiles 指定した設定ファイルに従ってファイルにラベルを付与
sestatus SELinuxの現状を表示
seinfo SELinuxのロールやドメインなど各種情報を表示
newrole 指定したロールに変更してシェルを起動
getsebool Bool値で示されるポリシーの状態取得
setsebool Bool値で示されるポリシーの設定
togglesebool Bool値で示されるポリシーの値変更
semanage SELinuxに関する各種操作
解析系コマンド 説明
apol GUIでSELinuxポリシの分析
seaudit GUIでSELinuxの監査ログを解析
seaudit-report 監査ログのSELinux用カスタムレポートの作成
audit2why 監査ログを解析し、アクセス拒否が発生した理由と解決方法を提示
audit2allow 監査ログを解析しアクセス拒否が起きないルールを提示

chconコマンド

chconコマンドはファイル/ディレクトリのセキュリティコンテキストを変更するコマンド。 ただし、このchconコマンドで行われた変更は、ファイルシステムのラベルを変更したり、restoreconコマンドを実行したりしても保持されない。

# ファイルタイプの変更
chcon -t httpd_sys_content_t file-name
# ファイルタイプと内容の再帰的変更
chcon -R -t httpd_sys_content_t directory-name

8.2.1. SELinuxコンテキストを管理するためのツール

restoreconコマンド

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

restorecon -v file1

fixfilesコマンド

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

restorecon

setfilesコマンド

SELinux ファイルのセキュリティコンテキストを設定するために使用できるコマンド。

setfiles

8.2.2. SELinuxコンテキストとロールをテストするためのツール

SELinux の一部には、Role-Based Access Control (RBAC) セキュリティモデルが実装されている。ロールは RBAC の属性となる。 SELinux ユーザーにはロールが承認され、ロールはドメインに対して承認される。 この役割はドメインと SELinux ユーザーの間の仲介者として機能する これは、権限昇格攻撃に対する脆弱性を軽減するのに役立つ。

newroleコマンド

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

newrole

runco​​nコマンド

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

runco​​n

8.2.3. 汎用的なSELinux管理コマンド

semanageコマンド

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

semanage <引数>
引数 説明
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 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.4. CUIでのSELinux AVCメッセージのトラブルシューティング

SELinux がアクションを拒否すると、アクセス ベクター キャッシュ (AVC) メッセージがファイルに記録される。 保存される場所は/var/log/audit/audit.log/var/log/messagesに保存され、またそれはjournaldデーモンによって記録される。

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]

8.2.5. Seaudit

Seauditはログを表示し、特定の SELinux ポリシーに基づいてフィルタリングするためのGUIツール。

8.2.6. MACの代替ツール

SELinux以外のMACツールには以下のようなものがある。

  • AppArmor
    • Ubuntuで人気のMACツール
    • SELinuxよりも管理が容易
    • inode番号ではなくファイルパスにタイプを割り当てる
    • モード:EnforcementComplainの2つ
    • aa-genprofaa-logpro fコマンド(ポリシ作成に使用)がある
  • Smack
    • カーネルにコンパイルする必要がある
    • ラベルの割り当てに拡張ファイル属性を使用
    • -ZSELinux のようなフラグを使用
    • chsmackコマンドをラベル情報のクエリと設定に使用する