Samba上のファイルのアクセス制御 (ACL)

(2015.4.19) 全体的に書き直し。

Samba 4と今どきの Linuxでは, 設定により, よりWindows と親和性が高いファイルのアクセス制御がおこなえるようになっている。

ファイルの属性

アクセスコントロールリスト (ACL) の前に, ファイルの属性について触れておく。

Windows では, ファイル属性 (attribute) と ACL は別モノ。

今は Samba設定の "store dos attributes" を使います。

= yes にすると, ファイルの属性は, Linuxのファイルシステムの拡張属性に格納されます。さらに, store dos attributes = yes は, map hidden (S), map system (S), map archive (S), map readonly (S) の設定を強制的に offにする。

(2016.12) ドキュメント上は, store dos attributes = yes の場合には map archive は無視される、となっているが、実際の挙動はそのようになっていない。実行属性が併用される。

結局、次のように設定すればよい。

[共有フォルダ名]
    store dos attributes = yes
    map archive = no

UNIX ファイルシステム ACL

UNIX側のアクセス制御について。

ドラフト POSIX Access Control Lists (ACLs) は、伝統的なUNIX ファイルパーミションモデルを拡張します。Linux や FreeBSD (UFSファイルシステム) で採用されています。

商用 UNIX や FreeBSD (ZFS ファイルシステム) では, 標準化された NFSv4 ACL がサポートされています。2021.4現在, Linux では NFSv4 ACL サポートはありません。

伝統的なパーミション mode_t

伝統的なファイルパーミションモデルは、owner - group - other のそれぞれで、アクセス制御します。ファイルは一つの owner と一つの group に属します。/etc/groupファイルでグループを作ります。

理論上は、このグループ設定によって、どのようなユーザの組み合わせに対してもファイルアクセスを制御できます。

が、実際には、こんなやり方では組み合わせ爆発が起こってしまい、運用に堪えません。

ドラフト POSIX ACL

IEEE P1003.1e ドラフト仕様です。POSIX.1e とも呼ばれます。1997年のドラフト17が最終で、提案が取り下げられ、標準としては破棄されています。商用 OS は NFSv4 ACL をサポートすることが多い。

POSIX ACLは、単純に、それぞれのファイル/ディレクトリに、複数のユーザ / グループのアクセス許可を付けれるようにします。

ext4ファイルシステムは、マウントオプションを何を与えなくても, ドラフト POSIX ACLに対応しています。

ext3 では, /etc/fstab ファイルを編集し, 拡張属性と ACL を有効にします。例えば次のようにします。(オプションについてはmount(8)を参照。)

/dev/mapper/vg_kiwi-lv_home    /home     ext3    user_xattr,acl        1 2
mount オプション
user_xattr 拡張ユーザ属性を有効にする. man attr(5) を参照.
acl POSIXアクセスコントロールリストを有効にする. man acl(5) 参照.

ドラフト POSIX ACLの操作は, getfacl / setfacl コマンドを使います。

例えば, 次のような, 自分以外にはアクセスできないファイルを用意します。

$ ls -l hoge.txt
-rw-------. 1 hori hori 5  4月 19 11:55 hoge.txt

次のコマンドでユーザ postgres に read のアクセス許可を与えます。-mはパーミション変更, 「u:」がユーザ、その後ろにユーザ名、アクセス権を書きます。

$ setfacl -m u:postgres:r hoge.txt

lsコマンドで見たときに other の次の文字が「+」になっているファイルは、POSIX ACLデータがあります。

$ ls -l hoge.txt
-rw-r-----+ 1 hori hori 5  4月 19 11:55 hoge.txt

getfacl コマンドでACLを確認できます。

$ getfacl hoge.txt
# file: hoge.txt
# owner: hori
# group: hori
user::rw-
user:postgres:r--
group::---
mask::r--
other::---
  • ファイルのowner に対しては, 伝統的パーミションの owner のアクセス許可が優先される。setfacl コマンドで自分に対して許可を与えても、単に無視される。
  • setfaclコマンドによるユーザ/ グループに対する許可は、伝統的パーミションのgroup に押し込められる。chmod コマンドで group に対する許可を削除すると、アクセスできなくなる。

注意: Webサイトによっては、拡張属性 (extended attributes) と混同しているものもあるが、両者は別もの。lsattr / chattr, あるいは getfattr / setfattr コマンドではACLは見れない。

Samba Windows ACL - ドラフトPOSIX ACLマップ

Samba 4 は, NTFS のセマンティクスを UNIX ファイルシステムに保存するために、いくつかの方法を持つ。

  1. Windows ACL を UNIX 側の拡張属性に保存する
  2. Windows ACL を上記のドラフト POSIX ACLに変換して保存する
  3. NFSv4 ACL [RFC 7530] としてファイルシステムに保存する. FreeBSD ZFS なら可能。Linux ではできない。

NFSv4 は NTFS と同じセマンティクスを持つ。最初の RFC 3010 のドラフト01 が 1999年, 作者の半数が Sun Microsystems Inc. の人。NFSv4.0 の最新版 RFC 7530 は 323ページにもなる巨大仕様。

このセクションでは, ドラフトPOSIXへのマッピングを説明する。

Windows 10 (NTFSファイルシステム) では、次のアクセス許可がある。それぞれ、Linux上では次のように対応付けられる

NTFSのアクセス許可 Linux (ドラフト POSIX) ACL
フルコントロール Full Control rwx
変更 Modify rwx
読み取りと実行 Read & Execute r-x
フォルダの内容の一覧表示 List Folder Contents r-x
読み取り Read r--
書き込み Write -w-

Windows側の「高度なアクセス許可」は、単に無視され、保存されない。

ドラフトPOSIX ACL を使う場合, smb.conf は、次のように設定するとよい.

[folder-aa]
  path = /home/samba/folder-aa
  writable = yes

  ; 書き込み可能なファイルのACLを変更できるようにする.
  dos filemode = yes
  ; 上位のパーミションを引き継ぐ.
  inherit acls = yes

dos filemode (S) は, ファイルの書き込み権限を持つユーザは, ファイルのパーミションや ACL を変更できるようになる。

inherit acls (S)は、子オブジェクトを生成するときに、親のアクセス許可をコピーしてくる。名前が紛らわしいが、Windows のアクセス権の継承とは全く別モノ。

Windows ACL を拡張属性として保存

LinuxのPOSIX ACLは、実用上, 特に不足があるようには思いません。しかし用途によっては, Windows ACLと完全に合わせたい、という需要があるかもしれません。

Samba サーバで Windows ACL を採用している場合は、Windows の「コンピューターの管理」で共有権限を管理できます。

Windows ACL の情報は非常に複雑で、POSIX ACL にはそもそも保存できませんが, Samba4 ではこれを Linuxファイルシステムの拡張属性に保存できます。

拡張属性は, ファイルまたはディレクトリと紐づく name:value ペアのリストです。attrコマンドで内容を確認できます。

$ echo "a file" > aFile
$ attr -s "attrname" -V hoge aFile
Attribute "attrname" set to a 4 byte value for aFile:
hoge
$ attr -l aFile
Attribute "selinux" has a 37 byte value for aFile
Attribute "attrname" has a 4 byte value for aFile
$ attr -g attrname aFile
Attribute "attrname" had a 4 byte value for aFile:
hoge

これを受けて, smb.conf では次のようにします

[共有フォルダ名]
  vfs objects = acl_xattr streams_xattr
  map acl inherit = yes
  acl_xattr:ignore system acls = yes

"vfs objects"命令には次表の値を設定できます. ファイルと属性が分かれないように, acl_xattr のほうがいいでしょう。

vfs objects 設定
acl_tdb NTFSアクセスコントロールリスト(ACLs)をtdbファイルに保存. $LOCKDIR/file_ntacls.tdb
acl_xattr ACLsをそれぞれのファイルの拡張属性に保存
zfsacl FreeBSD: NFSv4 ACL を ZFS に保存する.

acl_xattr の場合, dos filemode, inherit acls が強制的に on になる。

Windows (NTFS) のアクセス権の継承は、親での設定を自動的に伝播させる仕組みで、子オブジェクトのほうに独自のアクセス権の設定がなくても親の設定がそのまま適用されるし、親の方で設定を変えれば、それも直ちに反映される。Samba の設定は map acl inherit (S)値.

さらに, acl_xattr:ignore system acls = yes が推奨される。UNIX システムの ACL を無視し, NTFS との完全互換にする。この場合, create mask = 0666, directory mask = 0777 などが自動的に有効になる。