これは私が多くの情報を見つけることができないものなので、助けてくれてありがとう。
私の理解はこれである。次のファイルをインポートします。
-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"
だから質問は実際には次のようになります。
プロセスがそのユーザーのセカンダリグループが所有するファイルにアクセスするのを防ぐ特定のユーザー/グループの組み合わせでプロセスを実行する際の特別な点は何ですか。この問題を解決する方法はありますか?
答え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プロセスには必要な権限があります。user
root
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
--userspec
onオプションを使用してchroot
runを指定します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
で実行されます。提供する他のグループセットはありません。したがって、子プロセスはグループに属しません。phil
phil
--groups
adm
プロセスを実行するより一般的な方法はphilですsu phil -c "process"
。su
ユーザーデータベース情報からuid、gid、および補足グループをロードするときに、process
ユーザーが現在持っているのと同じ資格情報があります。
1 これはおそらくログイン(1)、sshd、su、gdb、または他のプログラム。また、pamモジュールを介して管理することもできます。