2006年6月6日火曜日

(FreeBSD) 所属するgroup数が多すぎるとログインできなくなる

ある日、NISのデータベースをいじって、古いアカウントの整理をしたり、さまざまな管理用のグループを作ったりしていたら、急に、FreeBSDマシンへログインできなくなってしまいました。



sshでログインしようとすると、ログインできたかできないかの瞬間に、sshが終了してしまいます。/var/log/messagesをみると



Jun  5 21:40:41 freebsd sshd[34246]: fatal: initgroups: nhh: Invalid argument



というようなログが残ります。



じゃあ、ためしにtelnetでログインしようとすると、やっぱりtelnetが終了してしまいます。



Jun  5 21:49:32 freebsd login: initgroups(nhh,10085): Invalid argument
Jun  5 21:49:32 freebsd login: setusercontext() failed - exiting



initgroupsって何?って思って、man initgroupsしてみて、簡単なサンプルプログラムを作って確認してみました。

#include <unistd.h>
#include <stdio.h>



int
main( int argc, char* argv[] )
{
    const char* name = "nhhtest";
    gid_t basegid = 10085;
    int r = initgroups( name, basegid );
    if ( r != 0 ) {
        perror("initgroups");
    }



    return 0;
}

nhhtestというアカウントを作成し、かつ、/etc/groupを書き換えて、nhhtestをたくさん(~16個ほど)のグループに所属させておきます。



プログラムを実行すると(root権限じゃないとダメみたいです)、おお~、r == -1になって、確かに「Invalid argument」というエラーです。



そういえば、以前、FreeBSDのメーリングリストか何かで、「1つのユーザーアカウントは、最大で16くらいまでしかグループに所属できない」という制限がある、と聞いたことがあります。おおっ、それかぁ~!



groupsというコマンドで、所属しているグループ一覧が表示されますが、ログインできたときの最大は、こんな感じ。

> groups
nhhtest wheel operator www group1 group2 group3 group4 group5 group6 group7 group8 group9 group10 group11

所属しているグループは15個。これ以上、所属グループを増やすと、ログインできなくなります。



というわけで、15個までしかグループに所属できないってことでしょうか。



(お仕事の)プロジェクトごとに、グループを作って、ファイルのアクセス制限を設定したりすることは、よくやるんじゃないかと思うのですが、所属できるのは15個まで、ってことなので、終わっちゃったプロジェクトのgroupは、さっさと消さないとダメよ!ってことですね。



・・・でも、15個を超えるとログインできなくなっちゃうって、バグといってもいいような気がしませんか?



0 件のコメント:

コメントを投稿