NFSサーバーで許可されたグループなのになぜかAccess Deniedになる

NFSでマウントしたディレクトリに対して、許可されたグループのメンバーからアクセスしてもAccess Deniedされて若干ハマった。 状態としては以下のような感じ。

### 状態確認
$ pwd
 (NFSマウントされているの場所)
$ ls -lah
合計 29K
drwxrwxrwx 3 good-group good-group   7 10月  7 11:00 .
drwxrwx--- 7 hoge       good-group   7  6月  9 12:00 ..
-rw-rw-rw- 1 hoge       good-group  15K 10月  1 00:00 test-good.txt
$ id
uid=1000(fuga) gid=1000(fuga) groups=1000(fuga),10(wheel),14(uucp),18(audio),19(cdrom),27(video),35(games),80(cdrw),85(usb),100(users),250(portage),973(vboxusers),993(pulse),998(plugdev),1000(fuga),1011(bbb),5001(ccc),5002(ddd),5003(eee),5004(good-group)

### アクセスしてみる
$ cat test-good.txt
cat: test-good.ods: 許可がありません

### NFS以外はOK
$ cat /home/taka/test-home.txt
This is a test file.

(ちなこにここで、idで出てくるグループ数が多いのがミソだった)

クライアントでもメンバーだし、サーバー側でもメンバーになっている。

どうにも分からんし、ググってもピンとこない (というかそもそもどうググればいいか、キーワードが分からん) ので、NFSが読めるわけではないがWiresharkさんなら解読してくれるだろうとの願いで、とりあえずキャプってみる。

WiresharkでNFSをキャプチャしてみたところ

なんか Auxiliary GIDs で所属グループIDのリストを送ってるっぽいですが、後半が省かれてますね。16個までしか送られてない。なんか個数的にもこれはどっかの制限で切られている予感。

ちなみにそもそもLinuxユーザーとかのレベルのアクセス制御は全部クライアントでやってると思ってたので、リストを送ってたりすること自体知らなかった。。。 (この問題に遭遇した時に若干もしやという気もしたけど)

これらのヒントを元に調べた所だと、どうやらグループ数が16を越えると上手く動かないケースがあるようで。

Solving the NFS 16-Group Limit Problem

この記事によると、

  • NFS側で対処できることはなくて、auth_sys? (というかプロトコル自体?) の問題。NFSv4にしたってダメだよ
  • ファイルシステムでもどうしようもない
  • auth_sysをチューンする方法もないよ

    (ただし2011年の記事なので状況が変わってるかも)

ということで、 rpc.mountd の --manage-gids オプションを使ってサーバー側でGroup IDを管理する方法がベストの方法として取り上げられている。

が、ちょっとサーバがFreeBSD (というかFreeNAS) で、どこいじれば正攻法なのかパッと分からんので、とりあえず一旦グループ数を減らす方向でトライ。

### 状態確認
$ pwd
 (NFSマウントされているの場所)
$ ls -lah
合計 29K
drwxrwxrwx 3 good-group good-group   7 10月  7 11:00 .
drwxrwx--- 7 hoge       good-group   7  6月  9 12:00 ..
-rw-rw-rw- 1 hoge       good-group  15K 10月  1 00:00 test-good.txt
$ id
uid=1000(fuga) gid=1000(fuga) groups=1000(fuga),10(wheel),14(uucp),18(audio),27(video),35(games),85(usb),100(users),973(vboxusers),998(plugdev),1000(fuga),1011(bbb),5002(ddd),5003(eee),5004(good-group)

$ cat test-good.txt
This is a test file.

とりあえずうまくいった。