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
[1] | 真実は細部に宿るというやつです ((c)カルロ・ギンズブルグ「チーズとうじ虫」の広告)。 |
Copyright (C) 1993-2025 Ken'ichi Fukamachi mail:< fukachan at fml.org >