[HOME] [github] [twitter] [blog] [fml4] [fml8] [北海道] Powered by NetBSD and [nuinui.net] .

[BUG] pkgsrc の OpenSSH が動かない (+ 直し方) → 解決済

Important: 2012/02/08: pkgsrc/security/skey のほうで対応してもらえました。

skey を skey-1.1.5nb4 以降へアップグレードすれば、本節の対応は不要です。

一番最初(/usr/pkgsrc にソースを広げた時)に、 /etc/mk.conf に PREFER_PKGSRC=yes と書いておけば、 それで万事 OK のはずなのですが、なぜか OpenSSH だけはおかしいです。

いつからなのか正確には不明ですが、この 3 〜 4 年のどこかでこうなりました。 pkgsrc/security/openssh の build の仕方が何か変とみていましたが、 そうではなく libskey.a の問題だと思います。

Important: 直し方というか BUG の理由ですが、これであってると思います (send-pr しろよ〜とか、 自分で直せよ〜とか言われそうですが、 なかなか暇がね;-)

直し方は、 「skey の人に直してもらう」 か、 「pkgsrc で無理矢理関数名を変更するか削除する patch をあてる」 か?です。

この問題は、 NetBSD 本体の /usr/lib/libskey.a が非常に古い時代のものに由来します。 OS 本体では、この BUG が発現しないというのがやっかいなところです。 微妙なところに潜んでいます。 [1]

/usr/lib/libutil.a には setusercontext() という関数があり、 これが login 時の最後の方で呼ばれます。

00001064 T setusercontext
問題は、 pkgsrc の skey (1.1.5 ベース)にも同じ名前の関数 setusercontext があることです。

このため、 PREFER_PKGSRC=yes とすると /usr/lib/libutil.a ではなく /usr/pkg/lib/libskey.a の setusercontext() 関数が呼ばれ、 エラーになります。 PREFER_PKGSRC=no の場合 /usr/pkg/lib/libskey.a はリンクされないので、 正しく /usr/lib/libutil.a の setusercontext() 関数が呼ばれるというわけです。

これを直すには (1) /usr/pkg/lib/libskey.a から setusercontext() を削除、 (2) 後述のように openssh で、この部分が呼ばれないように define.h を編集、 (3) /usr/lib/libutil.a を修正、 でしょう。 案 (1) と (2) どちらの方法でもバグは回避可能です (このマニュアルでは、簡単な案(2)の方が書かれています)。

本来は(いつか skey をバージョンアップしたら、このバグを踏むので) OS 本体でも考えるべき話なのですが、それは重たい話で…はぁ。

**********************************************
[背景説明]

/etc/mk.conf に PREFER_PKGSRC=yes と書くと、リモートログインできません。


client% ssh server 
Last login: Wed Nov 24 07:33:45 2010 from client.example.org.
NetBSD 5.0.2 (SERVER) #0: Thu Feb 25 19:34:15 JST 2010

Welcome to NetBSD!

unable to set user context (setuser): Operation not permitted
Connection to server closed.
client% 
この時、ログには、次のようなエラーメッセージが出ています。
sshd[8556]: setuid(1000): Operation not permitted

でも /etc/mk.conf に PREFER_PKGSRC=no と書いてコンパイルした場合は、 ちゃんとリモートログインできます。 何で?

この時、何が違うのかというと、 /usr/pkg/sbin/sshd の参照するライブラリで /usr/pkg/lib を使うように変 わるものは libwrap (tcp_wrapper)、 libcrypto (openssl)、 libskey (skey)、 libz (zlib) の4つです。

一方、エラーメッセージの大元は openssh/session.c の中で setusercontext(3) をするところです。 setusercontext(3) で SETUSER 命令を使っているところで setuid(2) が失敗しています。 でも、この関数は libutil なので、どちらの場合でも /usr/lib/libutil.so を 使っているはず。 PREFER_PKGSRC は関係ないとおもえます。 でも実際、どのバージョン、アーキテクチャアでも再現できます。 不思議、不思議。

なお、対処療法は、openssh を作る際に一度 make patch で止めて、 defines.h を書き換えて make build です。これで回避できます。

# cd /usr/pkgsrc/security/openssh
# make patch
  work/openssh*/defines.h を編集して #undef HAVE_LOGIN_CAP する。
# make 
# make install ないし make update

Notes

[1]

真実は細部に宿るというやつです ((c)カルロ・ギンズブルグ「チーズとうじ虫」の広告)。

[HOME] [github] [twitter] [blog] [fml4] [fml8] [北海道] Powered by NetBSD and [nuinui.net] .
Copyright (C) 1993-2022 Ken'ichi Fukamachi mail:< fukachan at fml.org >