2018年1月27日土曜日

FreeBSD 11をNISサーバーに、Ubuntu 16.04をNISクライアントするための設定 - 1

FreeBSD 11をNISサーバーに、Ubuntu 16.04をNISクライアントにしようとしたときに、すこし大変だったので、以下に作業メモをまとめます。

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
パスワードエントリが「*」と「x」で違います。もしかしてと思い、確かめてみると…
$ ypcat passwd | grep sshd
sshd:*:22:22:Secure Shell Daemon:/var/empty:/usr/sbin/nologin
$
NISもpasswdのパスワードエントリは「x」です。もしかして、Ubuntuはpasswdのパスワードエントリが 「x」である必要があるのでしょうか? もしかするとNISのpasswdデータベースを作るところで、「*」を「x」に置き換えてしまえばいいのかもしれません。そこで、試してみると、ログインできるようになりました…。

ということで、Ubuntu 16.04では/etc/passwdのパスワードエントリが「*」でないといけないようです。なので、FreeBSD 11でNISのpasswdデータベースを作るMakefileを以下のように変更しています。ただ、このとき/var/yp/Makefileは/var/yp/Makefile.distへのシンボリックリンクになっているので、注意が必要です。Makefileをいったん削除してから、Makefile.distからコピーしてから変更するのがよいでしょう。
$ cat  /var/yp/Makefile

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

$
SEDがある行(太字にした行)を追加しています。