web-dev-qa-db-ja.com

プロセスが特定のグループとして実行されている場合、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

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"

だから問題は本当に:

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

12
phil-lavin

プロセスは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)
_

あなたの質問へ:

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

プロセスが実行する必要があるタスクを解決するために必要なセキュリティプロセスコンテキストを設定できます。 Everyプロセスには、彼が実行するuidおよびgidが設定されています。通常、プロセスは呼び出しユーザーのuidとgidをコンテキストとして「取得」します。 「テイク」とは、カーネルがそうすることを意味します。そうでなければ、セキュリティ上の問題になります。

したがって、実際にはユーザーではなく、ファイルを読み取るためのアクセス許可を持たないのは、そのプロセスのアクセス許可(cat)です。ただし、プロセスは呼び出し元ユーザーのuid/gidで実行されます。

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

9
chaos

chrootで_--userspec_オプションを使用すると、chrootの実行時に使用するユーザーと単一のグループを指定できます。補足グループを定義するには、_--groups_オプションも使用する必要があります。

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

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

6
Stephen Kitt

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

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

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

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

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

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

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

2
Ángel