プロセスが特定のグループとして実行されている場合、Linuxアクセス許可はどのように機能しますか?


12

これは私が多くの情報を見つけることができなかったものですので、どんな助けでもいただければ幸いです。

私の理解はこうです。次のファイルを取ります:

-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

philadmグループに追加された場合、次のことができます。

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"

だから問題は本当に:

特定のユーザー/グループのコンボでプロセスを実行することで、そのユーザーの補足グループが所有するファイルにプロセスがアクセスできないようにすることの特別な点は何ですか?これを回避する方法はありますか?


シェルはそれとは何の関係もないことに注意してください。許可はシェルによって処理されません。彼らが新しいシェルを書くことであなたがルートを獲得できる場所なら
ctrl-alt-delor

回答:


9

プロセスはuidとgidで実行されます。どちらにも権限が割り当てられています。ユーザーとグループのuserspecを使用して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で、ユーザーuserとグループのコンテキストでプロセスを実行できますroot。これで、catプロセスに必要な権限が付与されました。

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
プロセスは通常、プライマリグループの資格情報のみを持っています。をEUID呼び出すことにより、その一部であるセカンダリグループの資格情報にアクセスできますinitgroups(3)。ただし、initgroups(3)すべてのグループを列挙する必要があるため、比較的高価な操作です。このため、プロセスinitgroups(3)は、特定の理由がある場合にのみ呼び出します。
lcd047

6

使用--userspec上のオプションをchroot実行するときに指定し、使用するユーザーおよびグループを1つchroot。補足グループを定義するには、--groupsオプションも使用する必要があります。

デフォルトでは、プロセスはそれらを実行しているユーザーのプライマリグループと補足グループを継承しますが、使用することで、指定した単一のグループを使用してそれをオーバーライドするように--userspec指示chmodしています。

Linuxの権限の詳細なドキュメントは、credentials(7)マンページにあります。


2

Linuxにログインすると、ログインプロセス¹ - philとしてログインできることを確認した後-philのuidとそれが属するグループが取得され、シェルとして起動されるプロセスとして設定されます。uid、gid、および補足グループは、プロセスのプロパティです。

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

*例外は、setuidまたはsetgidビットが設定されているプログラムであり、異なる実効ユーザーIDを持ちます。これは、たとえばsu(1)で使用されるため、rootによって実行されphilた場合でも特権で実行できます。

グループに追加philした後adm、彼はを実行できsu philsurootとして実行され、彼が実際にphilのパスワードを提供していることを確認してから、彼がuid、gid、およびphilが属する補足グループとともにシェルに移動します。そして、これはユーザーをグループに追加した後に行われるため、そのシェルはすでにadmグループに含まれています。

私は、chroot(1)を別のユーザーとして実行するのに最も適したプログラムとは考えていませんが、確実に作業が完了します。パラメータ--userspec phil:philは、のuid philとgidで実行しますphil。追加のグループは設定されません(そのために提供します--groups)。したがって、子プロセスはadmグループに含まれません。

philのようにプロセスを実行するためのより通常の方法は次のとおりsu phil -c "process"です。suユーザデータベースの情報から負荷のuid、gidのと補足グループ、processユーザーが現在持っている同じ資格情報を持つことになります。

¹これは、login(1)、sshd、su、gdb、またはその他のプログラムです。また、pamモジュールを通じて管理されている可能性があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.