(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側のアクセス制御について。
ドラフト 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
ファイルでグループを作ります。
理論上は、このグループ設定によって、どのようなユーザの組み合わせに対してもファイルアクセスを制御できます。
が、実際には、こんなやり方では組み合わせ爆発が起こってしまい、運用に堪えません。
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
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::---
注意: Webサイトによっては、拡張属性 (extended attributes) と混同しているものもあるが、両者は別もの。lsattr / chattr, あるいは getfattr / setfattr コマンドではACLは見れない。
Samba 4 は, NTFS のセマンティクスを UNIX ファイルシステムに保存するために、いくつかの方法を持つ。
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 を変更できるようになる。
LinuxのPOSIX ACLは、実用上, 特に不足があるようには思いません。しかし用途によっては, Windows ACLと完全に合わせたい、という需要があるかもしれません。
Samba サーバで Windows ACL を採用している場合は、Windows の「コンピューターの管理」で共有権限を管理できます。
Windows ACL の情報は非常に複雑で、POSIX ACL にはそもそも保存できませんが, Samba4 ではこれを Linuxファイルシステムの拡張属性に保存できます。
拡張属性は, ファイルまたはディレクトリと紐づく name:value ペアのリストです。attrコマンドで内容を確認できます。
これを受けて, " Windows (NTFS) のアクセス権の継承は、親での設定を自動的に伝播させる仕組みで、子オブジェクトのほうに独自のアクセス権の設定がなくても親の設定がそのまま適用されるし、親の方で設定を変えれば、それも直ちに反映される。Samba の設定は さらに, inherit acls
(S)は、子オブジェクトを生成するときに、親のアクセス許可をコピーしてくる。名前が紛らわしいが、Windows のアクセス権の継承とは全く別モノ。
Windows ACL を拡張属性として保存
$ 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
のほうがいいでしょう。
acl_tdb
NTFSアクセスコントロールリスト(ACLs)をtdbファイルに保存. $LOCKDIR/file_ntacls.tdb
acl_xattr
ACLsをそれぞれのファイルの拡張属性に保存
zfsacl
FreeBSD: NFSv4 ACL を ZFS に保存する.
acl_xattr
の場合, dos filemode
, inherit acls
が強制的に on になる。
map acl inherit
(S)値.
acl_xattr:ignore system acls = yes
が推奨される。UNIX システムの ACL を無視し, NTFS との完全互換にする。この場合, create mask = 0666
, directory mask = 0777
などが自動的に有効になる。