見出し画像

SMB と NFS の権限について


みなさんこんにちは。辻村です。
この記事は、以前書いた「SMB と NFS の権限について」という記事のアンコールです。あるベンダーさんからリンクをはってくださっているようなので、復活することにしました。加筆・訂正し、少しだけ一般的にしています。

1. なぜ NAS では標準的な設定を使えと言われるのか?

SMB と NFS version 3 では権限の考え方が違う。NFS v3 は POSIX の権限であり、有名な rwx:rwx:rwx の組み合わせで設定をする。所有者、グループ、その他のグループに読みだし、書き込み、実行の権限を与えるという考え方である。一方 SMB は権限がはるかに多い。Windows を使うのであれば、rwx でぽちぽち設定していって、「ちゃんと権限設定できたかな…」なんて考えるより、選択一発で設定してくれた方がわかりやすい。

そのため、 NASの設定画面に「Windowsの省略時の権限を設定」みたいなボタンがある。この省略時の設定を Solaris の世界から眺めてみると以下の通りになる。

ar83-1# ls -l
total 6
drwx------ 2 nobody other 2 Aug 24 03:02 posix_default
drwxr-xr-x+ 2 nobody other 2 Aug 24 03:03 windows_default
ar83-1# ls -V
drwx------ 2 nobody other 2 Aug 24 03:02 posix_default
owner@:rwxp-DaARWcCos:-------:allow
group@:------a-R-c--s:-------:allow
everyone@:------a-R-c--s:-------:allow
drwxr-xr-x+ 2 nobody other 2 Aug 24 03:03 windows_default
owner@:rwxpdDaARWcCos:fd-----:allow
group@:r-x---a-R-c--s:fd-----:allow
everyone@:r-x---a-R-c--s:fd-----:allow
ar83-1# ls -v
total 6
drwx------ 2 nobody other 2 Aug 24 03:02 posix_default
0:owner@:list_directory/read_data/add_file/write_data/add_subdirectory
/append_data/read_xattr/write_xattr/execute/delete_child
/read_attributes/write_attributes/read_acl/write_acl/write_owner
/synchronize:allow
1:group@:read_xattr/read_attributes/read_acl/synchronize:allow
2:everyone@:read_xattr/read_attributes/read_acl/synchronize:allow
drwxr-xr-x+ 2 nobody other 2 Aug 24 03:03 windows_default
0:owner@:list_directory/read_data/add_file/write_data/add_subdirectory
/append_data/read_xattr/write_xattr/execute/delete_child
/read_attributes/write_attributes/delete/read_acl/write_acl
/write_owner/synchronize:file_inherit/dir_inherit:allow
1:group@:list_directory/read_data/read_xattr/execute/read_attributes
/read_acl/synchronize:file_inherit/dir_inherit:allow
2:everyone@:list_directory/read_data/read_xattr/execute/read_attributes
/read_acl/synchronize:file_inherit/dir_inherit:allow

通常の ls -l では POSIX 1の権限が示される。拡張された ACL が設定されているときには、+ が表示される。Solaris の場合、ls -v あるいは ls -V を実行すると、拡張された ACL が表示される。上の例では、posix_default としたのが、 Use Windows default permissions を「使わなかった」場合、windows_default としたのが「使った場合」である。

この NASでは、何も考えずに設定すると、通常は所有者が nobody であり、グループが other になる。しかも、この設定では、所有者に rwx の設定をしたにもかかわらず、拡張 ACL で見てみると作成しても削除ができないという不思議な設定になってしまう。SMB の share としてみせるときには拡張 ACL 側を見せるので、設定のいかんによっては「作成した人が削除できず、Administrator を含む他の人がまったく手を出せない」という事態が起こってしまう。また、立ち上げた際に中間ファイルを作る Microsoft Office のような製品ではトラブルの原因になってしまう。

2. ZFS と NFSv4 の権限

ZFS と NFS v4 は上記の拡張された権限を保持している。一例であるが、macOS (10.10.5) で NFSv4 でマウントしてみる。

サンプルは ActiveDirectory ドメインに参加している Windows ユーザーがファイルを作成したものをドメインに全く関係のない NFSv4 ユーザーが見ているという例である。(つまり LDAP などでユーザーやグループの関連づけは一切していない)ご覧頂ければわかるが、NFSv3 でマウントした場合、追加の権限は表示されない。

2.1 macOS の場合

macOS の場合、ターミナルマウントする際に -o vers=4 を指定すれば、 NFSv4 でマウントすることができる。以下が実行例である。現実にはこんなバカなことはしないだろうが、比較のため、おなじ share を Version 3, Version 4 の NFS でマウントしてある。

bash-3.2# uname -a
Darwin MacBookPro.local 14.5.0 Darwin Kernel Version 14.5.0: Wed Jul 29 02:26:53 PDT 2015; root:xnu-2782.40.9~1/RELEASE_X86_64 x86_64

/* NFSv3 Mac OS*/
bash-3.2# mount -o vers=3,rsize=128000,wsize=128000 192.168.150.21:/export/smbnfs /mnt/nfsv3
bash-3.2# ls -l /mnt/nfsv3
total 0
-rwxr-xr-x 1 2147483649 2147483651 0 8 26 17:25 memo-2.txt.txt
-rwxr-xr-x 1 2147483649 2147483651 0 8 26 17:17 memo-windows-user.txt.txt

/* NFSv4 MacOS */
bash-3.2# mount -o vers=4,rsize=128000,wsize=128000,aclonly 192.168.150.21:/export/smbnfs /mnt/nfsv4bash-3.2# ls -l /mnt/nfsv4
total 2
-rwxrwxrwx+ 1 nobody nobody 0 8 26 17:25 memo-2.txt.txt
-rwxrwxrwx+ 1 nobody nobody 0 8 26 17:17 memo-windows-user.txt.txt
bash-3.2# ls -le /mnt/nfsv4
total 2
-rwxrwxrwx+ 1 nobody nobody 0 8 26 17:25 memo-2.txt.txt
0: group:nobody deny write,append,writeattr,writeextattr
1: group:nobody allow read,write,execute,delete,append,readattr,writeattr,readextattr,writeextattr,readsecurity,writesecurity,chown
2: group:owner allow read,write,execute,delete,append,readattr,writeattr,readextattr,writeextattr,readsecurity,writesecurity,chown
3: group:group allow read,execute,readattr,readextattr,readsecurity
4: group:everyone allow read,execute,readattr,readextattr,readsecurity
-rwxrwxrwx+ 1 nobody nobody 0 8 26 17:17 memo-windows-user.txt.txt
0: group:nobody allow read,write,execute,delete,append,readattr,writeattr,readextattr,writeextattr,readsecurity,writesecurity,chown
1: group:owner allow read,write,execute,delete,append,readattr,writeattr,readextattr,writeextattr,readsecurity,writesecurity,chown
2: group:group allow read,execute,readattr,readextattr,readsecurity
3: group:everyone allow read,execute,readattr,readextattr,readsecurity

NFSv4 の場合、普通に ls -l を実行すると + マークがついて、拡張 ACL (extended attribute) があることを教えてくれる。ls -le で拡張 ACL が表示されるが、Windows のユーザー名は見る影もない。(nobody で表示されている)

2.2 Mac OSX での落とし穴

NFSv4 においてデフォルト設定でマウントした場合、実はこの拡張 ACL を見ることはできない。デフォルトでは、 noacl が効いていて拡張 ACL を無視してしまうためだ。これを解決するには拡張 ACL が通るようにしてあげる必要があるので、上記の例では、 aclonly の設定をしている。詳しくは、 mount_nfs(8) の man ページを参照されたい。なお、現在のマウント状況とオプション類は、 nfsstat -m で見ることができる。

/* nfsstat -m MacOS 10.10.5 */
bash-3.2# nfsstat -m
/mnt/nfsv3 from 192.168.150.21:/export/smbnfs
-- Original mount options:
General mount flags: 0x0
NFS parameters: vers=3,aclonly,rsize=128000,wsize=128000
File system locations:
/export/smbnfs @ 192.168.150.21 (192.168.150.21)
-- Current mount parameters:
General mount flags: 0x4000000 multilabel
NFS parameters: vers=3,tcp,port=2049,nomntudp,hard,nointr,noresvport,negnamecache,callumnt,locks,quota,rsize=65536,wsize=65536,readahead=16,dsize=32768,nordirplus,nodumbtimr,timeo=10,maxgroups=16,acregmin=5,acregmax=60,acdirmin=5,acdirmax=60,nomutejukebox,nonfc,sec=sys
File system locations:
/export/smbnfs @ 192.168.150.21 (192.168.150.21)
Status flags: 0x0
/mnt/nfsv4 from 192.168.150.21:/export/smbnfs
-- Original mount options:
General mount flags: 0x0
NFS parameters: vers=4,aclonly,rsize=128000,wsize=128000
File system locations:
/export/smbnfs @ 192.168.150.21 (192.168.150.21)
-- Current mount parameters:
General mount flags: 0x4000000 multilabel
NFS parameters: vers=4.0,tcp,port=2049,hard,nointr,noresvport,callback,negnamecache,namedattr,acl,aclonly,locks,noquota,rsize=65536,wsize=65536,readahead=16,dsize=32768,nordirplus,nodumbtimr,timeo=10,maxgroups=16,acregmin=5,acregmax=60,acdirmin=5,acdirmax=60,nomutejukebox,noephemeral,nonfc,sec=sys
File system locations:
/export/smbnfs @ 192.168.150.21 (192.168.150.21)
Status flags: 0x0

2.3 Solaris NFS

Solaris では特段工夫をしなくても NFSv4 でもマウントすることができる。macOS と同じように、 NFSv4 でマウントした場合には、 ls -l を実行すると、 + マークがついて拡張された ACL が効いていることを教えてくれる。

/* NFSv3 Solaris */
root@so11-01:~# ls -l /mnt
total 2
-rwxr-xr-x 1 2147483649 2147483651 0 8月 26日 17:25 memo-2.txt.txt
-rwxr-xr-x 1 2147483649 2147483651 0 8月 26日 17:17 memo-windows-user.txt.txt
root@so11-01:~# nfsstat -m
/mnt from 192.168.150.21:/export/smbnfs
Flags: vers=3,proto=tcp,sec=sys,hard,intr,link,symlink,acl,rsize=1024000,wsize=1024000,retrans=5,timeo=600
Attr cache: acregmin=3,acregmax=60,acdirmin=30,acdirmax=60

/* NFSv4 Solaris */
root@so11-01:~# uname -a
SunOS so11-01 5.11 11.2 i86pc i386 i86pc
root@so11-01:~# nfsstat -m
/mnt from 192.168.150.21:/export/smbnfs
Flags: vers=4,proto=tcp,sec=sys,hard,intr,link,symlink,acl,rsize=1024000,wsize=1024000,retrans=5,timeo=600
Attr cache: acregmin=3,acregmax=60,acdirmin=30,acdirmax=60
root@so11-01:~# ls -l /mnt
total 2
-rwxr-xr-x+ 1 nobody nobody 0 8月 26日 17:25 memo-2.txt.txt
-rwxr-xr-x+ 1 nobody nobody 0 8月 26日 17:17 memo-windows-user.txt.txt
root@so11-01:~# ls -V /mnt
total 2
-rwxr-xr-x+ 1 nobody nobody 0 8月 26日 17:25 memo-2.txt.txt
group:unknown:-w-p---A-W----:-------:deny
group:unknown:rwxpdDaARWcCos:-------:allow
owner@:rwxpdDaARWcCos:-------:allow
group@:r-x---a-R-c--s:-------:allow
everyone@:r-x---a-R-c--s:-------:allow
-rwxr-xr-x+ 1 nobody nobody 0 8月 26日 17:17 memo-windows-user.txt.txt
group:unknown:rwxpdDaARWcCos:-------:allow
owner@:rwxpdDaARWcCos:-------:allow
group@:r-x---a-R-c--s:-------:allow
everyone@:r-x---a-R-c--s:-------:allow
root@so11-01:~#

2.4 Oracle Enterprise Linux の場合


Oracle Enterprise Linux 7.1 の場合は以下の通りだ。nfs4-acl-tools というパッケージが導入されていないといけない。

[hisaotsu@localhost ~]$ uname -a
Linux localhost.localdomain 3.8.13-98.2.1.el7uek.x86_64 #2 SMP Wed Aug 19 16:47:38 PDT 2015 x86_64 x86_64 x86_64 GNU/Linux
[hisaotsu@localhost ~]$ yum list installed nfs4-acl-tools
Loaded plugins: langpacks
Installed Packages
nfs4-acl-tools.x86_64 0.3.3-13.el7 @anaconda/7.1
[root@localhost ~]# which nfsstat
/sbin/nfsstat
[root@localhost ~]# which nfs4_getfacl
/bin/nfs4_getfacl
/* NFSv3 OEL 7.1 */
[root@localhost ~]# nfsstat -m
/mnt from 192.168.150.21:/export/smbnfs
Flags: rw,relatime,vers=3,rsize=32768,wsize=32768,namlen=255,soft,nordirplus,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=192.168.150.21,mountvers=3,mountport=55518,mountproto=udp,local_lock=none,addr=192.168.150.21
[root@localhost ~]# ls -l /mnt
total 1
-rwxr-xr-x+ 1 2147483649 2147483651 0 Aug 26 17:25 memo-2.txt.txt
-rwxr-xr-x+ 1 2147483649 2147483651 0 Aug 26 17:17 memo-windows-user.txt.txt

/* NFSv4 OEL 7.1 */
[root@localhost ~]# mount -o vers=4,rsize=64000,wsize=64000,nordirplus 192.168.150.21:/export/smbnfs /mnt
[root@localhost ~]# nfsstat -m
/mnt from 192.168.150.21:/export/smbnfs
Flags: rw,relatime,vers=4.0,rsize=32768,wsize=32768,namlen=255,hard,nordirplus,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=192.168.150.202,local_lock=none,addr=192.168.150.21
[root@localhost ~]# ls -l /mnt
total 1
-rwxr-xr-x. 1 nobody nobody 0 Aug 26 17:25 memo-2.txt.txt
-rwxr-xr-x. 1 nobody nobody 0 Aug 26 17:17 memo-windows-user.txt.txt
[root@localhost ~]# nfs4_getfacl /mnt
A:fdg:DL_A_full@arlab2.local:rwaDdxtTnNcCoy
A:fd:OWNER@:rwaDdxtTnNcCoy
A:fdg:GROUP@:rxtncy
A:fd:EVERYONE@:rxtncy
[root@localhost ~]# nfs4_getfacl /mnt/memo-windows-user.txt.txt
A:g:DL_A_full@arlab2.local:rwadxtTnNcCoy
A::OWNER@:rwadxtTnNcCoy
A:g:GROUP@:rxtncy
A::EVERYONE@:rxtncy
[root@localhost ~]# which nfsstat
/sbin/nfsstat
[root@localhost ~]# which nfs4_getfacl
/bin/nfs4_getfacl

ACL のみの表示について言えば、「誰が」をきちんと出せているという点で、Oracle Enterprise Linux が一番優秀だ。NFSv3 であっても追加の権限があることが + で示されている。NFSv4 のときになぜピリオドになってしまうのか、あるいはこれを採用したのかは不明だ。追加権限を参照するには nfs4_getfacl コマンドを使う必要がある。ls のオプションとして提供されていないので、「ここは NFS、ここはローカルファイルシステム」という用に意識しなければいけないところが少し面倒だ。

3. 共存はできないのか?

ここまでで簡単ではあるが、Windows 上から SMB 経由でファイルを作成し、Solaris (11.2), MacOS (10.10.5), Oracle Enterprise Linux (7.1) の NFSv3, NFSv4 でどの様にみえるかを見てきた。いずれの場合であっても Windows の SID と Unix 側で割り振る UID/GID には全く関連づけはなされていない。このため、実装によっては、SID で設定されている ACL を表現するため nobody というユーザーやグループが使われていたり、unknown と表示されていたりする。(個人的にはディレクトリーサービスが設定されていない場合、誰だかわからないから nobody/unknown というのもよくわかるし、 Linux の nfs4_getfacl のようにとりあえず設定されている権限だけでも表示してくれるのも便利だとも思う。)

また、Windows でデフォルトとしている権限の設定は、POSIX で設定可能な設定より多くの設定が必要であるので、ZFS Storageでは Use Windows default という設定を用意することによって、容易に設定ができるようにしている。

SMB と NFS で同じ share を共有するのに筋が良さそうなのは NFSv4 である。ZFS Storage および Solaris の ZFS については、内部では、拡張された ACL を持つことができるので、権限が設定できないのではないかという心配については不要だ。共存については、実はあと二つ解決するべき問題がある。

・排他制御に関するファイルの「ロック」の問題。
・もう一つは、Windows 環境と Solairis/MacOS/Linux の環境のユーザーやグループが同一であることを各々のシステムに知ってもらうための IDマッピングの仕組みである。

SMBとNFSのロックの関係については、こちらの記事をご覧ください。

この記事はここまでです。 最後まで読んでいただいてありがとうございます。 気に入っていただいたなら、スキを押していただいたり、 共有していただけるとうれしいです。 コメントや感想大歓迎です!