これは私が多くの情報を見つけることができなかったものですので、どんな助けでもいただければ幸いです。
私の理解はこうです。次のファイルを取ります:
-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:group
をphil:phil
に明示的に設定しているときにプロセスが開始されると、ファイルを読み取ることができません。プロセスは次のように開始されました:
Nice -n 19 chroot --userspec phil:phil / sh -c "process"
プロセスがphil:adm
として開始された場合、ファイルを読み取ることができます。
Nice -n 19 chroot --userspec phil:adm / sh -c "process"
だから問題は本当に:
特定のユーザー/グループのコンボでプロセスを実行することで、そのユーザーの補足グループが所有するファイルにプロセスがアクセスできないようにすることの特別な点は何ですか?これを回避する方法はありますか?
プロセスは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でプロセスを実行するために、特定のグループに属している必要はありません。
chroot
で_--userspec
_オプションを使用すると、chroot
の実行時に使用するユーザーと単一のグループを指定できます。補足グループを定義するには、_--groups
_オプションも使用する必要があります。
デフォルトでは、プロセスはそれらを実行しているユーザーのプライマリグループと補足グループを継承しますが、_--userspec
_を使用することで、chmod
に、指定された単一のグループを使用してオーバーライドするように指示しています。
Linuxでの権限の詳細なドキュメントは credentials(7)
のマンページにあります。
Linuxにログインすると、ログインプロセス¹-philとしてログインできることを確認した後、philのuidとそれが属するグループを取得し、設定これらは、シェルとして開始されるプロセスとして。 uid、gid、および補足グループはプロセスのプロパティです。
それ以降に起動したプログラムは、そのシェルの子孫であり、それらの資格情報のコピーを受け取るだけです。*これが、ユーザーの権限を変更しても実行中のプロセスに影響を与えない理由です。ただし、変更は次回のログイン時に反映されます。
*例外は、setuidまたはsetgidビットが設定されているプログラムであり、異なる実効ユーザーIDを持ちます。これは、たとえば su(1) で使用されるため、root
によって実行された場合でも、phil
特権で実行できます。
phil
をadm
グループに追加すると、彼は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モジュールを通じて管理されている可能性があります。