プロセスが特定のグループで実行されると、Linux権限はどのように機能しますか?

プロセスが特定のグループで実行されると、Linux権限はどのように機能しますか?

これは私が多くの情報を見つけることができないものなので、助けてくれてありがとう。

私の理解はこれである。次のファイルをインポートします。

-rw-r-----  1 root        adm   69524 May 21 17:31 debug.1

ユーザーはphilこのファイルにアクセスできません。

phil@server:/var/log$ head -n 1 debug.1
cat: debug.1: Permission denied

グループphilに追加すると、次のことが可能になります。adm

root@server:~# adduser phil adm
Adding user `phil' to group `adm' ...
Adding user phil to group adm
Done.
phil@server:/var/log$ head -n 1 debug.1
May 21 11:23:15 server kernel: [    0.000000] DMI: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.7.5.1-0-g8936dbb-20141113_115728-nilsson.home.kraxel.org 04/01/2014

ただし、明示的に設定された状態でプロセスが開始されると、ファイルを読み取ることはできませんuser:groupphil:philプロセスは次のように始まります。

nice -n 19 chroot --userspec phil:phil / sh -c "process"

プロセスが次から始まる場合phil:adm:

nice -n 19 chroot --userspec phil:adm / sh -c "process"

だから質問は実際には次のようになります。

プロセスがそのユーザーのセカンダリグループが所有するファイルにアクセスするのを防ぐ特定のユーザー/グループの組み合わせでプロセスを実行する際の特別な点は何ですか。この問題を解決する方法はありますか?

答え1

プロセスはuidとgidを使用して実行されます。どちらも権限が割り当てられています。ユーザーとグループのカスタマイズを使用してchrootを呼び出すことはできますが、ユーザーは実際にはグループに属していません。その後、ユーザー uid と指定されたグループ gid を使用してプロセスが実行されます。

例を見てみましょう。名前がユーザーuserで、その人がグループに属していますstudent

root@host:~$ id user
uid=10298(user) gid=20002(student) groups=20002(student)

次のファイルがあります。

root@host:~$ ls -l file
-rw-r----- 1 root root 9 Mai 29 13:39 file

彼は読むことができません:

user@host:~$ cat file
cat: file: Permission denied 

これでcat、ユーザーとグループのコンテキストでプロセスを実行できるようになります。 catプロセスには必要な権限があります。userroot

root@host:~$ chroot --userspec user:root / sh -c "cat file"
file contents

上記の内容を見るのは面白いですid

root@host:~$ chroot --userspec user:root / sh -c "id"
uid=10298(user) gid=0(root) groups=20002(student),0(root)

はい、しかし、ユーザーはuserグループ(root)に属していません。id情報はどこで入手できますか?パラメータなしで呼び出すと、idシステムコールが使用されます。getuid()getgid()そしてgetgroups()。したがって、独自のプロセスコンテキストidが印刷されます。私たちはこのコンテキストを変更しました--userspec

引数を使用して呼び出すと、idユーザーのグループ割り当てのみが決まります。

root@host:~$ chroot --userspec user:root / sh -c "id user"
uid=10298(user) gid=20002(student) groups=20002(student)

あなたの質問について:

プロセスがそのユーザーのセカンダリグループが所有するファイルにアクセスするのを防ぐ特定のユーザー/グループの組み合わせでプロセスを実行する際の特別な点は何ですか。この問題を解決する方法はありますか?

プロセスが実行する必要がある操作を解決するために必要なセキュリティプロセスコンテキストを設定できます。すべてプロセスには、実行するように設定されたuidとgidがあります。通常、プロセスは、呼び出すユーザー uid と gid を対応するコンテキストとして「取る」。 「取る」とは、カーネルがこれを行うということです。それ以外の場合はセキュリティの問題になります。

したがって、実際にファイルを読み取る権限がないのは、ユーザーではなくプロセス(cat)の権限です。ただし、プロセスは呼び出し側ユーザーのuid / gidとして実行されます。

したがって、uid とグループの gid を使用してプロセスを実行するために特定のグループに属する必要はありません。

答え2

--userspeconオプションを使用してchrootrunを指定しますchroot。セカンダリグループを定義するには、--groupsこのオプションも使用する必要があります。

デフォルトでは、プロセスはプロセスを実行しているユーザーのプライマリグループとセカンダリグループを継承しますが、それを使用して指定した個々のグループに上書きするように--userspec指示できます。chmod

Linux の権限に関する詳細なドキュメントは、以下で確認できます。credentials(7)マンページ。

答え3

Linuxにログインするときのログインプロセス1 - 確認後、次のようにログインできます。フィル- philのuidとそれが属するグループを取得し、プロセスとして設定し、シェルから始めます。uid、gid、および補足グループはプロセスの属性です。

以降に開始されるすべての後続のプログラムはそのシェルのサブプログラムであり、これらの資格情報のコピーのみを受け取ります。 *これは、ユーザー権限を変更しても実行中のプロセスに影響しない理由を説明します。ただし、これらの変更は次回のログイン時に適用されます。

*setuid または setgid ビットがセットされたプログラムは例外です。有効ユーザーID。これは、例えば使用される。数(1)rootしたがって、 によって実行されても権限で実行できますphil

philグループに追加した後、adm彼は実行でき、su philルートsuとして実行されます。彼がphilのパスワードを提供したことを確認し、philが属するuid、gid、および補足グループを持つシェルに彼を置きます。これはユーザーをグループに追加した後に実行されるため、シェルはすでにグループにありますadm

私はchroot(1)が最も適切なプログラムだとは思わない他のユーザーとして実行、しかし、作業は完了です。このパラメータを使用すると、uidとgid--userspec phil:philで実行されます。提供する他のグループセットはありません。したがって、子プロセスはグループに属しません。philphil--groupsadm

プロセスを実行するより一般的な方法はphilですsu phil -c "process"suユーザーデータベース情報からuid、gid、および補足グループをロードするときに、processユーザーが現在持っているのと同じ資格情報があります。

1 これはおそらくログイン(1)、sshd、su、gdb、または他のプログラム。また、pamモジュールを介して管理することもできます。

関連情報