
特権LXC(1.0.3)コンテナ(私が知っている部分)をビルドしてから、無許可実行のために正常に移行するにはどうすればよいですか?つまり、テンプレート(通常は下)を直接debootstrap
変更または調整して、正しく機能するようにしたいと思います。lxc-ubuntu
/usr/share/lxc/templates
それで私がこの質問をするのです。lxc-ubuntu
テンプレートを見ると、次のことがわかります。
# Detect use under userns (unsupported)
for arg in "$@"; do
[ "$arg" = "--" ] && break
if [ "$arg" = "--mapped-uid" -o "$arg" = "--mapped-gid" ]; then
echo "This template can't be used for unprivileged containers." 1>&2
echo "You may want to try the \"download\" template instead." 1>&2
exit 1
fi
done
ただし、参照されているテンプレートでおよびそれ以降を使用するLXC_MAPPED_GID
ことには特別な内容がないようです。実際に行うことは、ファイルの所有権(+)を調整することだけです。しかし、テンプレートの拡張属性は、所望の「魔法」を達成するために微調整された可能性がある。LXC_MAPPED_UID
lxc-download
chgrp
chown
download
コメントからStéphane Graberによるブログ投稿スティーブンはある評論家にこう言いました。
残念ながら、これを行う簡単な方法はありません。権限のないコンテナーの構成と一致するようにコンテナー構成を更新し、コンテナーのディレクトリーを実行する権限のないユーザーに移動し、Sergeのuidshiftプログラムを使用して所有権を変更する必要があります。すべてのファイル。
...そして:
- 見るhttps://jenkins.linuxcontainers.org/
download
テンプレート用に作成されたパッケージの場合 - チェック
uidmapshift
アウト:ここ- 手順は、概説され
lxc-usernsexec -m b:0:1000:1 -m b:1:190000:1 -- /bin/chown 1:1 $file
ているように機能するようです。lxc-usernsexec(1)
- 手順は、概説され
しかしこれ以上の指示はなかった。
だから私の質問は:root
私が自分で構築した(所有および全体)一般的な(権限のある)LXCコンテナを権限のないコンテナに移行するにはどうすればよいですか?スクリプトなどを提供できない場合でも、考慮すべき事項と権限のないLXCコンテナを実行する機能にどのような影響を与えるかを知っておくとよいでしょう。スクリプトを直接作成して解決策を見つけたら、この質問に対する回答として投稿することを約束できます。 :)
メモ:Ubuntu 14.04を使用していますが、これは一般的な質問。
答え1
私はKVM仮想マシンを無許可のLXCに移動するのと非常によく似た作業をしました。
これにはシステムコンテナを使用していますが(起動時に自動的に起動できるように)、マッピングされたUID / GID(ユーザーネームスペース)を使用します。
- / etc / subuid、subgidを編集します(uid / gids 10M-100Mをルートにマップし、コンテナあたり100Kを使用しました)。
- 最初のコンテナでは、/var/lib/lxc/CTNAME/config で u/gid 10000000-10099999 を使用します。
- /var/lib/lxc/CTNAME/rootfsにコンテナストレージをマウントする(または別々のボリューム/データセット/コンテナごとに何も使用しない場合は何もしません)
- chown 10000000:10000000 /var/lib/lxc/CTNAME/rootfs
- setfacl -mu:10000000:x /var/lib/lxc (または単に chmod o+x /var/lib/lxc)
- lxc-usernsexec -mb:0:10000000:100000 --/bin/bash
これで、最初のコンテナユーザーの名前空間にいます。すべてが同じですが、プロセスではuidが0であると思いますが、実際にはホストネームスペースではuidが10000000です。 /proc/self/uid_mapをチェックして、uidがマッピングされていることを確認してください。もはや/rootで読むことができず、誰も/どのグループも所有していないようです。
ユーザーの名前空間では、元のホストからrsyncします。
ユーザーの名前空間の外部では、/var/lib/lxc/CTNAME/rootfs のファイルが、元のインストールと同じ予想 uid に属さず、10000000+remote_uid に属していることがわかります。これがあなたが望むものです。
それはすべてです。データを同期するときは、コンテナの /etc/fstab からすべてのエントリを削除してマウントを試みずに起動する必要があります。変更する必要がある他のものがあるかもしれません。コンテナ化された展開に対してLXCテンプレートが実行する作業を確認してください。カーネル、grub、ntp、およびコンテナのすべてのハードウェアプローブパッケージを完全に削除できます(実行する必要はなく、ユーザーの名前空間からコンテナにchrootできます)。
実行中のリモートVMがない場合は、raw VMストレージをホスト名前空間にマウントし、rsync / SSHをローカルホストに再マウントすることもできます。効果は同じです。
特権コンテナーを非特権コンテナーに変更する場合は、uid/gid マッピングを追加し、上記のマッピングをコンテナー構成に追加してから、次のこともできます。
for i in `seq 0 65535`; do
find /var/lib/lxc/CTNAME/rootfs -uid $i -exec chown $((10000000+i)) \{\} \;
find /var/lib/lxc/CTNAME/rootfs -gid $i -exec chgrp $((10000000+i)) \{\} \;
done
これが完了する必要があるすべてのタスクであり、今すぐ許可されていない方法でコンテナを実行できるようになりました。上記の例は非常に非効率的です。 uidshiftはより良い仕事をすることができます(しかしまだ使用していません)。
HTH。
答え2
Borut Mrakのサンプルコードは、シンボリックリンクがコンテナ内のファイルを指すときにホストシステム上のファイルの所有権も変更することを警告したいと思います。あなたが望むものはまったくありません!
専用ファイルシステムがある場合は、chown / chgrpに-hフラグを使用し、検索に-mountを使用する必要があります。
より高速でスマートなバージョンは次のとおりです。
find "/var/lib/lxc/$name/rootfs" -mount -uid '-65536' -printf '%U\n'|sort -n|uniq|while read i; do
find "/var/lib/lxc/$name/rootfs" -mount -uid "$i" -exec chown -h "$((200000+i))" \{\} \;
done
find "/var/lib/lxc/$name/rootfs" -mount -gid '-65536' -printf '%G\n'|sort -n|uniq|while read i; do
find "/var/lib/lxc/$name/rootfs" -mount -gid "$i" -exec chgrp -h "$((200000+i))" \{\} \;
done
答え3
アルパインLinux今すぐ使用uidmapshift
に変換lua
到着特権コンテナを特権コンテナに変換する。見てinitd
スクリプト設定/作成された追加フォルダの権限と要件を確認します。 (/etc/subuid
&/etc/subgid
)
答え4
ピエロコンテナ用
SUBUID_OFFSET=-65536
SUBGID_OFFSET=-65536
cd rootfs || exit 1
find .|while read i; do SUBUID=$(stat --format=%u $i); SUBGID=$(stat --format=%g $i); NEW_SUBUID=$((SUBUID+SUBUID_OFFSET)); NEW_SUBGID=$((SUBGID+SUBGID_OFFSET)); echo "chown -h $NEW_SUBUID.$NEW_SUBGID $i"; done
Linux システムの移行に使用されます。
SUBUID=100000
SUBGID=100000
cd rootfs || exit 1
find .|while read i; do CURRENT_UID=$(stat --format=%u $i); CURRENT_GID=$(stat --format=%g $i); NEW_SUBUID=$((CURRENT_UID+SUBUID)); NEW_SUBGID=$((CURRENT_GID+SUBGID)); echo "chown -h $NEW_SUBUID.$NEW_SUBGID $i"; done