ファイルの権限を変更しました(chmod g+w testfile
)と実行中ls -l testfile
は以下を与えます:
-rwxrwxr-x 1 user1 user1 0 2011-01-24 20:36 testfile
次に、そのグループにユーザーを追加しました( "/ etc/group" has user1:x:1000:user2
行)、ただしそのファイルをuser2として編集できません。これはなぜですか?
_user2
_はログアウトしてから再度ログインする必要があります。グループの権限は次のように機能します。
/etc/passwd
_で言及されているメイングループのメンバーシップに加えて、_/etc/group
_でユーザーが言及されているすべてのグループを取得します。 (より正確には、 getpw(your_uid)
の _pw_gid
_ フィールドに加えて、 すべてのグループユーザーが明示的なメンバーである _/etc/passwd
_および_/etc/group
_を超えて、情報は他のNISやLDAPなどの種類のユーザーデータベース。)メイングループはプロセスの 実効グループID になり、他のグループはその 補足グループID 。ご覧のとおり、ユーザーのグループメンバーシップへの変更は、ユーザーがログインしたときにのみ有効になります。実行中のプロセスの場合は、手遅れです。そのため、ユーザーはログアウトしてから再度ログインする必要があります。それが問題が多すぎる場合、ユーザーは別のセッションにログインできます(たとえば、別のコンソールで、または_ssh localhost
_を使用して)。
内部的には、プロセスはlose特権(ユーザーID、グループID、機能)しか失うことができません。カーネルは、ルートとして実行されているinit
プロセス(起動後の最初のプロセス)を開始し、すべてのプロセスは最終的にそのプロセスから派生します。 login
プロセス(またはsshd
、またはログインするデスクトップマネージャーの一部)は引き続きrootとして実行されています。その仕事の一部は、ルート権限を削除し、適切なユーザーとグループに切り替えることです。
1つの例外があります。 setuidまたはsetgid プログラムの実行です。そのプログラムは追加のアクセス許可を受け取ります。これは、親プロセスのメンバーシップのさまざまなサブセットと、setxid実行可能ファイルを所有するユーザーまたはグループの追加メンバーシップの下で動作することを選択できます。特に、setuidルートプログラムにはルート権限があるため、すべてを実行できます²。これがsu
やSudo
のようなプログラムがどのように機能するかです。
¹ Init(initrd、udev)から派生していないプロセスが時々ありますが、原則は同じです。ルートとして開始すると、時間の経過とともに特権が失われます。
² SELinuxなどのマルチレベルセキュリティフレームワークを除外する。
User2をログアウトしてから再度ログインさせる必要がある場合があります(または、sshでログインして新しいログインセッションを作成してみてください)。 id --groups
の出力を確認して、ユーザーの数値グループIDを表示します。
Sudo su $(whoami)
ssh localhost
と本質的に同じ回避策ですが、sshサーバーがインストールされていなくても使用できます。
あなたがルートを持っている限り。ただし、新しいグループを追加して権限を変更した場合は、おそらくそうします。
su
で十分な場合もありますが、Sudo
は必要ありません。
欠点がある場合は、知っておくと面白いでしょう。コメントしてください。
su --login $(whoami)
man su
から:
su
を使用すると、代替ユーザーとグループIDでコマンドを実行できます。
su [options] [-] [user [argument...]]
混在環境による副作用を回避するために、常に
--login
オプション(ショートカット-
ではなく)を使用することをお勧めします。
-, -l, --login
実際のログインと同様の環境で、ログインシェルとしてシェルを起動します。
TERM
および変数を除くすべての環境変数をクリアします--whitelist-environment
によって指定HOME
、Shell
、USER
、LOGNAME
、PATH
を初期化しますargv[0]
を「-」に設定しますホストにControlMaster sshディレクティブを使用している場合、ユーザーログアウトが役に立たない場合があります。アカウントをグループに追加し、同じControlMaster接続内でログオフして再度ログオンしても、セッションには新しいメンバーシップは表示されません。マスター接続を強制的に切断する必要があります
ssh -O exit hostname
再度ログオンする前。