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

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

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

Linux 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 拡張ユーザ属性を有効にする. attr(5) を参照.
acl POSIXアクセスコントロールリストを有効にする. 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::---

Webサイトによっては、拡張属性 (extended attributes) と混同しているものもあるが、両者は別もの。

lsattr / chattr, あるいは getfattr / setfattrコマンドではACLは見れない。

Samba ACL - POSIX ACLマップ

Samba 4では, 初期状態では, Windows ACL を上記のLinux ACLに保存するようになっている。

Windows 8.1では、主に, 次のアクセス許可がある。それぞれ、Linux上では次のように対応付けられる

NTFSのアクセス許可 Linux ACL
フルコントロール rwx
変更 rwx
読み取りと実行 r-x
フォルダの内容の一覧表示(フォルダのみ) r-x
読み取り r--
書き込み -w-
特殊なアクセス許可 (いろいろ)

拡張属性を使う

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

Samba4 では, Windows ACLの情報を 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
  store dos attributes = yes

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

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