10-Aug-2022の続き。実際に運用してみると意外にpermission deniedに遭遇する場面が多く、マシン間でUID/GIDを統一する必要があるという結論になりました。nfsdでall_squashオプションを指定しているので、anonuid, anongidに対応するものを用意すれば十分。
とはいえ…/etc/{passwd,group}を見るに、どの辺りが空いているかを調べるのもなかなか面倒です。nobodyやnogroup辺りのUID/GIDが値としては最大なのかなーと思っていたのですが、
nobodyのUID
- 99
- Void Linux, Slackware
- 32767
- NetBSD, OpenBSD
- 65534
- Arch Linux, Debian, FreeBSD, DragonflyBSD
nobodyのGID
- 39
- NetBSD
- 98
- Slackware
- 32767
- OpenBSD
- 65534
- Arch Linux, FreeBSD, DragonflyBSD
- なし
- Debian, Void Linux
nogroupのGID
- 99
- Void Linux, Slackware
- 32766
- NetBSD, OpenBSD
- 65533
- FreeBSD, DragonflyBSD
- 65534
- Debian
- なし
- Arch Linux
65000を使うのが妥当かどうかは何とも言えないので、32000にします。shellもnobody準拠…といきたいところですが、
nobodyのshell
- /bin/false
- Void Linux, Slackware
- /sbin/nologin
- DragonflyBSD, NetBSD, OpenBSD
- /usr/bin/nologin
- Arch Linux
- /usr/sbin/nologin
- Debian, FreeBSD
こんな感じにしっちゃかめっちゃかです。nologin, falseをwhichで確認するに、
nologinの所在
- /sbin/nologin
- Void Linux, Slackware, FreeBSD, DragonflyBSD, NetBSD, OpenBSD
- /usr/bin/nologin
- Arch Linux
- /usr/sbin/nologin
- Debian
falseの所在
- /sbin/false
- Void Linux
- /usr/bin/false
- Arch Linux, Debian, Slackware, FreeBSD, DragonflyBSD, NetBSD, OpenBSD
これもバラバラ。とはいえ、ここに挙げているLinux distroは/bin/falseと/usr/bin/falseと/sbin/nologinが通ります。ArchとVoidは/sbin/false, /usr/sbin/false, /bin/nologin, /usr/bin/nologinにも対応し、Slackware, NetBSD, OpenBSDは/usr/sbin/nologinに非対応です。/sbin/nologinもしくは/usr/bin/falseのどちらかを使えば良さそうです。
さて、これからやるべきことは単純に…
- ユーザexport(uid=32000), グループexport(gid=32000)を追加する
- ユーザexportのshellは/sbin/nologinなど、ホームディレクトリは/export
これを各OS毎に設定していくことなのですが、useraddが使えないケースもあったりオプションの指定も微妙に違っていたりとなかなかに厄介です。
まずは仮想マシンのホスト機兼NFSサーバのDebianから。rootでログインしている場合は/sbinへのパスが通っていますが、su等で他のユーザからrootに化けた場合は/sbin/addgroupとフルパスで呼び出す必要があります(haltですら/sbin/haltとしないと呼べないので面倒くさい…)。
- Debian
- /sbin/addgroup --gid 32000 export; /sbin/adduser --system --home /export ---no-create-home --uid 32000 --gid 32000 --disabled-password --disabled-login export; /sbin/adduser <自分のアカウント> export
あとは/etc/exportsのanonuidとanongidをそれぞれ32000に修正。/sbin/useradd, /sbin/groupaddも持っているようですが、これは他のLinux distroで試します。うっかり間違っちゃった場合は/sbin/groupdelなり/sbin/userdelなり使えば良いでしょう。
あとは他の仮想マシンを設定していきます。
- NetBSD, OpenBSD, Slackware, Arch Linux, Void Linux
- groupadd -g export 32000; useradd -d /export -g 32000 -s /sbin/nologin -u 32000 export
SlackwareやOpenBSDにはadduserがあるものの、Debianのようにグループへユーザを追加する機能を持ちません。そのために、/etc/group(とLinux系OSは/etc/gshadow)を編集してexportグループにユーザを追加します。NetBSDとOpenBSDは/etc/groupをvi等で直接編集し、Slackwareではvigr, vigr -s、Arch LinuxおよびVoid Linuxはvigr(/etc/group編集後に/etc/gshadowの編集に移ります)を使用してください。
- FreeBSD, DragonflyBSD
- pw groupadd export -g 32000; pw useradd export -d /export -g 32000 -s /sbin/nologin -u 32000; pw groupmod export -M <自分のアカウント>
FreeBSDとその派生であるDragonFlyBSDに関しては、ユーザとグループの管理はpwコマンドに集約されているのでこれを使います。グループへのユーザの追加もコマンドラインから行えますが、groupmodである点に注意して下さい。
これでもまだ時折permission deniedを起こすことがあるのですが、発生する頻度が減ったことで使い勝手は上がっているので、のんびり原因を調べていこうと思います。57.5kg(08:05)