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の削除
-nmask値以上のパーミッションが設定されている場合は有効にしない
–maskmask値以上のパーミッションが設定されている場合は有効にする
-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 <権限>