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 ... 名前や内容の制限なし名前空間
- 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 も表示される。
オプション | 説明 |
---|---|
-a | 設定されているACLの表示 |
-d | デフォルトACLを表示 |
-R | ファイルやディレクトリのACLを再帰的に表示 |
setfaclコマンド
setfaclコマンドはACLを設定するコマンド。構文は以下の通り。
なおアクションは-m
で変更、-x
で削除になる。
使用例は以下の通り。
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が許容モード、強制モード、または無効のいずれであるか、またはどのポリシーがロードされることになっているかが保存される。
- Enforcing ... アクセス違反は拒否する
- Permissive ... アクセス違反は許可されるが、ログに記録する
セキュリティコンテキスト
セキュリティコンテキストの書式は以下の通り。
- ユーザ識別子 ... 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
コマンドで確認できる。
またSELinuxポリシーの一部をクエリするにはseinfo
コマンドで行える。
またapol
と呼ばれるGUI SELinux ポリシー分析ツールではsesinfo
コマンドと同様の機能をGUIで提供する。
利用にはsetools-ui
パッケージをインストールする必要がある。
SELinuxの一次的な有効化/無効化
getenforce
コマンドで可能。
またsetenforce
コマンドはSELinuxのステータスを設定するコマンド。
設定できるパラメータは以下の通り。
- Disabled ... SELinuxの無効化
- Permissive ... ポリシを強制する代わりに警告表示。アクセス制限は無効。
- Enforcing ... セキュリティポリシの強制。アクセス制御が有効。
SELinuxの永続的な有効化/無効化
SELinuxの永続設定は/etc/selinux/config
ファイルの編集にて行う。
再起動後に設定が反映される。
Bool値によるSELinuxポリシの設定
Bool値を使用すると、SELinuxポリシの作成に関する知識がなくても実行時に、SELinuxのポリシ一部を変更できる。 これはSELinuxのポリシのリロード、再コンパイルを行わずに、サービスによるNFSボリュームへのアクセス許可などの変更が可能になることを意味する。
またBool値を設定/表示するコマンドは以下の通り。
コマンド | 説明 |
---|---|
getsebool |
コマンドはBool値をリストするコマンド |
setsebool |
ブール値を有効または無効にするコマンド |
SELinuxにおけるファイルのラベル付け
SELinuxではSELinuxコンテキストと呼ばれるすべてのプロセスとファイルにセキュリティ関連の情報を表すラベルが付けられる。
確認にはls -Z <ファイル名/ディレクトリ名>
で行える。
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
オプションで変更内容を表示する。
fixfilesコマンド
restorecon
コマンドと同じ機能を提供するコマンド。
setfilesコマンド
SELinux ファイルのセキュリティコンテキストを設定するために使用できるコマンド。
8.2.2. SELinuxコンテキストとロールをテストするためのツール
SELinux の一部には、Role-Based Access Control (RBAC) セキュリティモデルが実装されている。ロールは RBAC の属性となる。 SELinux ユーザーにはロールが承認され、ロールはドメインに対して承認される。 この役割はドメインと SELinux ユーザーの間の仲介者として機能する これは、権限昇格攻撃に対する脆弱性を軽減するのに役立つ。
newroleコマンド
新しいコンテキストで新しいシェルを実行するコマンド。
runconコマンド
指定された SELinux コンテキストでコマンドを実行するコマンド。
8.2.3. 汎用的なSELinux管理コマンド
semanageコマンド
ポリシーソースの変更や再コンパイルを必要とせずに、SELinux ポリシーの特定の要素を構成するために使用されるコマンド。
引数 | 説明 |
---|---|
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 fcontextコマンド
アクセス制御を決定するための追加情報 (SELinux ユーザー、ロール、タイプ、レベルなど) を含むファイル コンテキスト定義を管理するために使用されるコマンド。
semanage portコマンド
カスタムポートでサービスを実行できるコマンド。
カスタムポートでサービスを実行しようとすると、サービスは失敗する。 例として、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 がアクションを拒否していることを確認できるコマンド。
-m
オプションはausearch が返す情報の種類を指定、-ts
はタイムスタンプを指定する。
-ts recently
... 過去10分間のAVCメッセージを表示-ts today
... 1日全体のメッセージを表示
sealertコマンド
AVC メッセージをさらに詳細に確認するコマンド。
8.2.5. Seaudit
Seauditはログを表示し、特定の SELinux ポリシーに基づいてフィルタリングするためのGUIツール。
8.2.6. MACの代替ツール
SELinux以外のMACツールには以下のようなものがある。
- AppArmor
- Ubuntuで人気のMACツール
- SELinuxよりも管理が容易
- inode番号ではなくファイルパスにタイプを割り当てる
- モード:
Enforcement
とComplain
の2つ aa-genprof
とaa-logpro f
コマンド(ポリシ作成に使用)がある
- Smack
- カーネルにコンパイルする必要がある
- ラベルの割り当てに拡張ファイル属性を使用
-Z
SELinux のようなフラグを使用chsmack
コマンドをラベル情報のクエリと設定に使用する