ユーザーを使用する場合(私の場合はLXCを介して)、非特権ユーザーに一連の従属GIDとUIDを割り当てます。リソースについては、以下を参照してください: subuid(5)
、 subgid(5)
、 newuidmap(1)
、- newgidmap(1)
、 user_namespaces(7)
。
その後、その範囲を使用でき、 serns を介してシステムアカウントにマップされます。
UID(およびGID)が1000の(ホスト)システムアカウントjohn
があると仮定します。割り当てられたGIDとUIDの範囲は100000..165536です。
したがって、エントリはそれぞれ/etc/subgid
と/etc/subuid
に存在します。
john:100000:65536
非特権コンテナ内のファイルが「内部」john
によって所有されるようになり、ホスト上の101000が所有し、「内部」root
が所有するファイルは100000によって所有されるようになります。
通常、これらの範囲はホスト上のどの名前にも割り当てられません。
ls
や友人にとってより意味のある出力を得るために、ホスト上でそれぞれのUID/GIDのユーザーを作成しても大丈夫ですか?john
が、これらのファイル/フォルダーにアクセスできるようにする方法はありますか?もしそうなら、従属範囲内のそれらの有効なユーザーとユーザーの「所有者」の間で共有されるグループを作成し、それに応じて権限を設定する唯一の賢明な方法はありますか?まあ、またはACL、明らかに。
- Lsや友人にとってより意味のある出力を得るために、ホスト上でそれぞれのUID/GIDのユーザーを作成しても大丈夫ですか?
はい、大丈夫です。ただし、そのようなユーザーがホストシステム内の何に対しても権利を持っていないことを確認する必要があります。
また、ユーザー名に重複を作成しないようにしてください。
これは、ゲストの/etc/passwd
ファイルと/etc/group
ファイルを使用して、ホストシステムに対応するユーザーを作成するサンプルスクリプトです。すべての名前の前にコンテナー名が付けられ、コンテナーのUIDと一致するように、指定された値を使用してすべてのIDが増加します。
#! /bin/sh
# Path to guest's `/etc' directory.
guest_etc=/var/lib/lxc/mycontainer/rootfs/etc
# Guest's name, used as login prefix and inside GECOS field.
guest_name=mycontainer
# Increment to be applied to UIDs and GIDs (= range start).
uid_incr=100000
gid_incr=$uid_incr
guest_passwd=${guest_etc}/passwd
guest_group=${guest_etc}/group
exec <$guest_group
while IFS=":" read name pass gid null; do
gid_new=$( expr $gid + $gid_incr )
if ! getent group $gid_new >/dev/null; then
addgroup --system --gid $gid_new "${guest_name}_${name}"
fi
done
exec <$guest_passwd
while IFS=":" read login pass uid gid gecos null; do
uid_new=$( expr $uid + $uid_incr )
gid_new=$( expr $gid + $gid_incr )
if ! getent passwd $uid_new >/dev/null; then
adduser --system --home /nonexistent --no-create-home \
--Shell /bin/nologin --uid $uid_new --gid $gid_new \
--gecos "\"$guest_name container user (${gecos})\"" \
"${guest_name}_${login}"
fi
done
アクセスできないホームディレクトリに関する警告は正常であり、予期されています。これは、/nonexistent
が存在しないという実際の目的です。
- ユーザーを「所有」しているホストユーザー、つまりこの場合はjohnが、これらのファイル/フォルダーにアクセスできるようにする方法はありますか?もしそうなら、従属範囲内のそれらの有効なユーザーとユーザーの「所有者」の間で共有されるグループを作成し、それに応じて権限を設定する唯一の賢明な方法はありますか?まあ、またはACL、明らかに。
これは、IMOに別の質問をする価値があります。
コンテナのコンテンツは、コンテナ所有者のUIDとは異なるUIDによって所有されているため、コンテナの所有者はアクセスできません。サブユーザーに対するこのルールの例外を想像することはできますが、現在私が認識しているものはありません(私が作成した 関連する質問 数年前ですが、まだ回答がありません)。
ファイル/etc/subuid
および/etc/subgid
は現在、newuidmap
(1)によってのみ使用され、特定のプロセスの1つのUID/GIDから別のUID/GIDへの切り替えを許可または拒否します。範囲の所有者に他の権利を与えるものではありません。
したがって、このような問題の解決策は、ケースごとに設計する必要があります。ただし、ACLの考え方に注意してください。たとえば、コンテナのファイルにACLを配置して、ホストのUID 1000がそれらを読み取れるようにするとします。これは、コンテナのUID1000を持つコンテナのユーザーにも同じレベルの特権があることを意味します...