8.1. 任意アクセス制御
8.1.1. 任意アクセス制御(DAC)の基礎
DACの定義と実装方法
任意アクセス制御はDAC(Discretionary Access Control)とも呼ばれ、主に以下の2種類の実装方法がある。
- オブジェクトのアクセス権を所有者/所有グループ/その他の3種類に分けて指定する
- アクセス制御リスト(ACL)を用いる
基本的なファイル所有権・パーミッションの管理と理解
chmodコマンド
ファイルのアクセス許可を変更するために使用できるコマンド。
詳細はコチラから。
chownコマンド
rootユーザが使用できるコマンドでファイルの所有権を変更できるコマンド。
詳細はコチラから。
suid/guid
Linux権限システムでは、SUIDでユーザIDベースの、GUIDでグループIDベースのアクセスモードが提供されている。
プログラムにSUIDアクセスモード(u+s)で設定されている場合、そのファイルの所有者によりプロセスが開始されたように見える。
また、プログラムにGUIDアクセスモード(g+s)で設定されている場合、プログラムはファイルのグループに属しているように実行される。
詳細はコチラから。
スティッキービット
ディレクトリにスティッキービット(o+t)を設定すると、ファイルの削除またはリンク解除を所有ユーザーまたはrootのみに許可できる。
詳細はコチラから。
8.1.2. アクセス制御リスト(ACL)の管理と理解
ACLの概要と役割
ACLは所有者以外のユーザーまたはグループに対して異なる権限であっても、特定の権限を定義する場合に使用できる。
また、ACLの使用は基本的な所有権や権限を (必然的に) 変更することなく、より具体的な権限のセットをファイルまたはディレクトリに適用できる。これにより、他のユーザーまたはグループのアクセスを追加できるようになる。
ACL権限を割り当てることができるエントリ タグは4つある。
- user(u) … ファイル所有者または指定されたユーザ
- group(g) … グループ所有者または指定されたグループ
- mask(m) … ファイル所有者のユーザー エントリを除く、任意の ACL エントリによって付与できる最大アクセスを指定するエントリ
- other(o) … ユーザーまたはグループの ACL エントリに一致しないプロセスに許可されるアクセスを指定するエントリ
設定例は以下の通り。
# ユーザー john には読み取りおよび書き込みアクセス権を与える
u:john:rw-
# グループ スタッフには読み取りアクセス権を付与
g:staff:r--
# その他のアクセスはなし
o::---ACLの設定と操作
setfaclコマンド
setfaclコマンドはACLを設定するコマンド。構文は以下の通り。
setfacl [オプション] [アクション] ファイルなおアクションは-mで変更、-xで削除になる。
使用例は以下の通り。
# Userにパーミッションを追加する
setfacl -m "u:user:permissions" /path/to/file| オプション | 説明 | 
|---|---|
| -b | すべての拡張ACLエントリの削除 | 
| -d | 指定したACLをデフォルトACLに設定 | 
| -k | デフォルトACLの削除 | 
| -n | mask値以上のパーミッションが設定されている場合は有効にしない | 
| –mask | mask値以上のパーミッションが設定されている場合は有効にする | 
| -R | 再帰的に処理を実行 | 
| オプション | 説明 | 
|---|---|
| -M [ACLファイル] | ACLファイルに指定したものからACLを読込変更 | 
| -m [ACLスペック] | ACLスペック部分に記載したACL設定に変更 | 
| -X [ACLファイル] | ACLファイルに指定したものからACLを読込削除 | 
| -x [ACLスペック] | ACLスペック部分に記載したACL設定を削除 | 
ACLの確認
getfaclコマンド
getfaclコマンドはファイルごとにファイル アクセス制御リスト(ACL)を取得できるコマンド。
ディレクトリにデフォルト ACL がある場合は、 getfaclデフォルト ACL も表示される。
getfacl <ファイル名/ディレクトリ名>| オプション | 説明 | 
|---|---|
| -a | 設定されているACLの表示 | 
| -d | デフォルトACLを表示 | 
| -e [エンコード] | 拡張属性の値の表示形式を指定 | 
| -R | ファイルやディレクトリのACLを再帰的に表示 | 
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 | あるファイルの ACL を別のファイルにコピーする | 
| getfacl --access dir | setfacl -d -M- dir | アクセス ACL をデフォルト ACL にコピーする | 
8.1.3. 拡張属性(xattr)の管理と理解
拡張属性の概念
拡張属性(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 <権限>