
Linuxコンテナ(LXCコンテナ)を「権限なし」と言うとどういう意味ですか?
答え1
権限のないLXCコンテナは、それを悪用するコンテナです。ユーザーネームスペース(ユーザー名)。つまり、ホストのUID範囲を名前空間にマップできるカーネル関数です。~へUID 0 を持つユーザーが再び存在する可能性があります。
権限のないLXCコンテナに対する私の最初の考えとは異なり、これは権限のないホストユーザーがコンテナを所有しなければならないという意味ではありません。これは単なる可能性です。
関連事項は次のとおりです。
- ホストユーザーの一連の子UIDとGIDの定義(
usermod [-v|-w|--add-sub-uids|--add-sub-gids]
) - ...範囲はコンテナ構成(
lxc.id_map = ...
)にマップされます。
したがって、root
ホスト上のコンテナプロセスの有効なUIDがマッピングによって定義された範囲内にあるため、権限のないコンテナを持つことも可能です。
ただし、root
まずスレーブIDを定義する必要があります。によって作成されたユーザーとは異なり、adduser
子root
ID範囲はデフォルトでは定義されていません。
また、提供するフルスコープを使用できるため、次の構成行を使用して3つのコンテナーを持つことができます(UIDマッピングのみを表示)。
lxc.id_map = u 0 100000 100000
lxc.id_map = u 0 200000 100000
lxc.id_map = u 0 300000 100000
気づく:コメントによると、最新バージョンではlxc.idmap
!
root
100000から400000の間の依存UIDがあるとします。私が見つけたすべての文書では、コンテナごとに65536の子IDを使用することをお勧めしますが、一部は人が読みやすくするために100000を使用します。
つまり、すべてのコンテナに同じ範囲を割り当てる必要はありません。
40億(〜)以上のスレーブIDが可能であり2^32
、これはホストユーザーのスレーブ範囲を処理するのに寛大であることを意味します。
ルートが所有して実行する権限のないコンテナ
もう一度こすります。権限のないLXCゲストは、ホスト上の権限のないユーザーが実行する必要はありません。
次のように、依存UID / GIDマッピングを使用してコンテナを構成します。
lxc.id_map = u 0 100000 100000
lxc.id_map = g 0 100000 100000
root
ホストのユーザーが指定された範囲の子IDを持っている場合は、ゲストをより効果的に制限できます。
しかし、この場合、重要な追加の利点があります(はい、それが機能することを確認しました)。システムの起動時にコンテナを自動的に起動できます。
LXCに関する情報をWebで検索すると、権限のないLXCゲストは自動的に起動できないというメッセージがよく聞こえます。ただし、デフォルトでは、これはシステム全体のコンテナストア(通常は同じ/var/lib/lxc
)にないコンテナでのみ機能します。もしそうなら(通常はルートによって生成され、ルートによって開始されたことを意味します)、それはまったく異なる話です。
lxc.start.auto = 1
コンテナ構成に入れると、操作はうまく行われます。
正しい権限と構成を取得する
私自身もこの問題に多少の困難を抱えており、ここにセクションを追加しました。
lxc.include
通常、名前/usr/share/lxc/config/$distro.common.conf
($distro
展開名がある場合)として含まれる構成フラグメントに加えて、システムに存在することを確認して含める必要があります/usr/share/lxc/config/$distro.userns.conf
。たとえば、
lxc.include = /usr/share/lxc/config/ubuntu.common.conf
lxc.include = /usr/share/lxc/config/ubuntu.userns.conf
スレーブ ID マッピングを追加します。
lxc.id_map = u 0 100000 65535
lxc.id_map = g 0 100000 65535
これはホストUID 100000root
~へLXCゲストのユーザーネームスペース。
次に、権限が正しいことを確認してください。ゲスト名が環境変数に保存されている場合は、$lxcguest
次のコマンドを実行します。
# Directory for the container
chown root:root $(lxc-config lxc.lxcpath)/$lxcguest
chmod ug=rwX,o=rX $(lxc-config lxc.lxcpath)/$lxcguest
# Container config
chown root:root $(lxc-config lxc.lxcpath)/$lxcguest/config
chmod u=rw,go=r $(lxc-config lxc.lxcpath)/$lxcguest/config
# Container rootfs
chown 100000:100000 $(lxc-config lxc.lxcpath)/$lxcguest/rootfs
chmod u=rwX,go=rX $(lxc-config lxc.lxcpath)/$lxcguest/rootfs
これにより、最初の試行後にコンテナを実行でき、一部の権限関連のエラーが発生する可能性があります。
答え2
0xC0000022L(解決策が私にとってうまくいった)についてのフォローアップを行うために、次のように書いています。追加-uid-gid.plLXCコンテナ内でファイルを正しくマッピングするために必要な所有権の変更を自動化するperlスクリプト。
これがない場合、この推奨設定を使用すると、マスターホストの0 / rootに属するLXCコンテナrootfsのファイルがLXCコンテナ自体内で65534 / nobodyにマップされます。 LXC コンテナ内で 0/root にマッピングされるには、ホストの 100000 に属する必要があります。
ここで説明します。https://yeupou.wordpress.com/2017/06/23/setting-up-lxc-containers-with-mapped-giduid/そしてスクリプトはgitlabから直接取得できますhttps://gitlab.com/yeupou/stalag13/blob/master/usr/local/bin/increase-uid-gid.pl