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

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

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

ファイルの属性

アクセスコントロールリスト (ACL) の前に, ファイルの属性について。Windows では, ファイル属性 (attribute) と ACL は別モノ。

今は "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

POSIX ACL

POSIX Access Control Lists (ACLs) は、伝統的なUNIX ファイルパーミションモデルを拡張します。

Linux や FreeBSD で採用されています。

伝統的なパーミション

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

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

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

POSIX 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
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 ACL - POSIX ACLマップ

Samba 4 は, 大きく二つの方法がある。Windows ACL をそのまま UNIX 側で保存する方法と、Windows ACL を上記の POSIX ACLに変換して保存する方法。

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

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
  map acl inherit = yes

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

acl_tdb NTFSアクセスコントロールリスト(ACLs)をtdbファイルに保存. $LOCKDIR/file_ntacls.tdb
acl_xattr ACLsをそれぞれのファイルの拡張属性に保存

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