便宜上、このグループのディレクトリサーバーにすべてのユーザーを追加するのではなく、/etc/security/group.conf(pam_group.so)メカニズムを使用して、フロッピー、オーディオ、プラグ開発、ビデオなどの特別なグループメンバーシップを割り当てることをお勧めします。 。
これはデバイスアクセスにはうまく機能しますが、外部プログラムがgetgrentを介して特定のグループのユーザーメンバーシップを確認しようとすると問題を引き起こす傾向があります。
今私はこれらのグループの1つにnewgrpを試してみましたが、これは不可能であることに気づきました(システムはDebian squeezeです)。これはnewgrpのバグですか、それとも私のサイトの設定の問題ですか?
newgrpはUnix API側で実際に何をしますか? setgidはルート専用のシステムコールであるようです。特定のユーザーがsetgitターゲットグループのメンバーであれば、それも許可されると思いました。
私は実際にこの問題を偶然見つけました。なぜなら、mount.davfsが私がdavfs2グループのメンバーではないと言ったからです。もちろんそれは本当ですが、それはpam_group.soによって割り当てられたグループでもありました。
ベストアンサー1
newgrp
すでにアクセス権があるグループにのみアクセスできます。役に立たないと思いますか?基本的にそうです。これは、プロセスが2つ以上のグループに属することができなかった頃から起こりました。パスワードで保護されたグループにアクセスすることもできますが、これは非常にまれです。
カーネルの観点から、各プロセスは1つ以上のグループに属します。setgid
rootとして実行するか、setgidプログラム内で実行している場合にのみ使用できます(実(実行)グループと有効(実行)グループの間の置き換え)。カーネルはユーザーとグループのデータベースを認識しません。
ユーザーおよびグループデータベース(/etc/passwd
、、/etc/group
LDAPなど)/etc/security/group.conf
は、ログインと特権の昇格(通常PAM経由)を管理する他のプログラムによってlogin
管理されますsu
。ログインすると、その他のファイルにリストされているグループに割り当てられます/etc/passwd
。/etc/group
プロセスpam_groups
は次のとおりです。
gid_t groups[…] = /*extra GIDs computed from /etc/group and so on*/;
setgroups(sizeof(groups)/sizeof(gid_t), groups);
setgid(gid); /*main GID read from /etc/passwd*/
setuid(uid);
execve(shell, "-sh"); /*shell read from /etc/passwd*/
つまり、root権限の放棄(つまり、ターゲットユーザーに変更)は、他のすべての権限管理の後、ユーザーシェルを呼び出す前に実行されます。プロセスがルートとして実行されなくなると、追加のグループを取得できません。
ユーザーをグループに追加した場合は、そのユーザーが次回ログインしたときに適用されます。別の端末にログインするか、SSHを介して別のセッションを開始すると、そのセッションのプロセスには、ログインしているグループに関係なくユーザーグループがあります。groups
または、コマンドを使用して、自分が属するid
グループ(つまり、で始まった特定のプロセス)を確認できます。groups
だから私はあなたの明示的な質問に答えました(newgrp
それは私の役割を果たしており、あなたが考えたものとは異なります)。私はあなたの問題を解決したかもしれないし、解決しなかったかもしれません。これは、ユーザーとグループのデータベースを見つけるためにログインできないアプリケーションでは一般的ではありません。通常、要求されたプロセスがそのグループのメンバーであるかどうかを調べてアクセスを決定します。特定のアプリケーションについてご質問がある場合はお知らせください。