web-dev-qa-db-ja.com

LXCと非特権ユーザーのユーザーの下位GID / UID?

ユーザーを使用する場合(私の場合は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によって所有されるようになります。

通常、これらの範囲はホスト上のどの名前にも割り当てられません。

質問:

  1. lsや友人にとってより意味のある出力を得るために、ホスト上でそれぞれのUID/GIDのユーザーを作成しても大丈夫ですか?
  2. ユーザーを「所有」しているホストユーザー、つまりこの場合はjohnが、これらのファイル/フォルダーにアクセスできるようにする方法はありますか?もしそうなら、従属範囲内のそれらの有効なユーザーとユーザーの「所有者」の間で共有されるグループを作成し、それに応じて権限を設定する唯一の賢明な方法はありますか?まあ、またはACL、明らかに。
7
0xC0000022L
  1. 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が存在しないという実際の目的です。

  1. ユーザーを「所有」しているホストユーザー、つまりこの場合はjohnが、これらのファイル/フォルダーにアクセスできるようにする方法はありますか?もしそうなら、従属範囲内のそれらの有効なユーザーとユーザーの「所有者」の間で共有されるグループを作成し、それに応じて権限を設定する唯一の賢明な方法はありますか?まあ、またはACL、明らかに。

これは、IMOに別の質問をする価値があります。

コンテナのコンテンツは、コンテナ所有者のUIDとは異なるUIDによって所有されているため、コンテナの所有者はアクセスできません。サブユーザーに対するこのルールの例外を想像することはできますが、現在私が認識しているものはありません(私が作成した 関連する質問 数年前ですが、まだ回答がありません)。

ファイル/etc/subuidおよび/etc/subgidは現在、newuidmap(1)によってのみ使用され、特定のプロセスの1つのUID/GIDから別のUID/GIDへの切り替えを許可または拒否します。範囲の所有者に他の権利を与えるものではありません。

したがって、このような問題の解決策は、ケースごとに設計する必要があります。ただし、ACLの考え方に注意してください。たとえば、コンテナのファイルにACLを配置して、ホストのUID 1000がそれらを読み取れるようにするとします。これは、コンテナのUID1000を持つコンテナのユーザーにも同じレベルの特権があることを意味します...

2
WhiteWinterWolf