FreeBSDはすでにNISサーバーとなっており、他のFreeBSDをNISクライアントとした状況では確かに動いていました。ところが、ここにUbuntuをNISクライアントとして加えようとした場合に、どうしてもNISでパスワードを参照できず、UbuntuでNIS上にあるユーザーでログインできません。
このような状況はあまりないのか、検索システムで探してもそれらしい事例がありません。いろいろと試みてているうちに、ふとNISのユーザーでログインできるようになりました。ただ意図したわけでないので、なにが有効なのすぐにわかりませんでしたが、調べてみいくと、
- Ubuntuの/etc/passwdにだけ、NISにあるユーザーを加えた。
- /etc/shadowには加えていない
つまり、FreeBSDが動くNISサーバーにある/etc/passswdのうち、ログインするユーザー分をUbuntuの/etc/passwdに追加すればよいようです。しかし、これでは、あまりNISを利用する意味がありません。ここで、FreeBSDとUbuntuの/etc/passwdの形式を見比べていると、あることに気が付きました。
- FreeBSDの/etc/passwd
sshd:*:22:22:Secure Shell Daemon:/var/empty:/usr/sbin/nologin
- Ubuntuの/etc/passwd
sshd:x:110:65534::/var/run/sshd:/usr/sbin/nologin
$ ypcat passwd | grep sshdNISもpasswdのパスワードエントリは「x」です。もしかして、Ubuntuはpasswdのパスワードエントリが 「x」である必要があるのでしょうか? もしかするとNISのpasswdデータベースを作るところで、「*」を「x」に置き換えてしまえばいいのかもしれません。そこで、試してみると、ログインできるようになりました…。
sshd:*:22:22:Secure Shell Daemon:/var/empty:/usr/sbin/nologin
$
ということで、Ubuntu 16.04では/etc/passwdのパスワードエントリが「*」でないといけないようです。なので、FreeBSD 11でNISのpasswdデータベースを作るMakefileを以下のように変更しています。ただ、このとき/var/yp/Makefileは/var/yp/Makefile.distへのシンボリックリンクになっているので、注意が必要です。Makefileをいったん削除してから、Makefile.distからコピーしてから変更するのがよいでしょう。
$ cat /var/yp/MakefileSEDがある行(太字にした行)を追加しています。
…
MV = @/bin/mv -f
RMV = /bin/mv -f
SED = /usr/bin/sed
…
passwd.byname: $(PASSWD)
@echo "Updating $@..."
@$(AWK) -F: '{ if ($$1 != "" && $$1 !~ "^#.*" && $$1 != "+") \
print $$1"\t"$$0 }' $(PASSWD) \
| $(SED) 's/^\([^:]*\):[^:]*:/\1:x:/' \
| $(DBLOAD) -f -i $(PASSWD) -o $(YPMAPDIR)/$@ - $(TMP); \
$(RMV) $(TMP) $@
@$(DBLOAD) -c
@if [ ! $(NOPUSH) ]; then $(YPPUSH) -d $(DOMAIN) $@; fi
@if [ ! $(NOPUSH) ]; then echo "Pushed $@ map." ; fi
…
$