Previous Post | Top | Next Post |
TOC
引き続き非特権ユーザー権限から立ち上げられたLXC仮想環境を実現するための 技術背景を学ぶために、Linux Namespaces 周辺に着目します。
User Namespaces
Linux Namespacesの中でuser_namespaces
(7)で説明されている
User NamespacesはユーザーIDやグループID等のセキュリティー関連の識別子
と属性(credentials
(7)参照。本来は、資格、信任状の意味の単語)を
分離します。属性とは具体的に言うとルートディレクトリーや、
キー(keyrings
(7)参照。本来は、鍵の意味の単語)や、
ケーパビリティ(capabilities
(7)参照。本来は能力・資質の意味の単語)
等です。
このUser Namespacesにより、Namespacesの中ではあたかも特権ユーザーとして
振る舞いながら、Namespacesの外では通常の非特権ユーザー権限を保持するプロセスを
実現することができます。この際のユーザーIDの対応関係が/proc/[pid]/uid_map
ファイルに記されています。(グループIDの場合は/proc/[pid]/gid_map
)
たとえばコンテナ環境外のシェルプロセスのuid_map
以下です。
$ cat /proc/$$/uid_map
0 0 4294967295
これは、最初の0
が現amespacesのユーザーID、次の0
が(実在しない)親Namespaces
のユーザーID に対応し、(2^32)-1の4294967295が対応関係範囲長となります。
対応関係範囲長を2^32としないのは故意で2^32番目のユーザーID 4294967295
は「ユーザーID無し」の返り値となっているからだそうです。
/proc/[pid]/uid_map
は、newuidmap
(1)で設定できます。その際に
許容されるユーザーIDが/etc/subuid
に羅列し規定されています。
LXC 4.0の非特権ユーザーのコンテナ起動は、/usr/share/doc/lxc/README.Debian
に
詳しく書かれています。この様な現在のシステムでは、各コンテナ環境では
16ビットユーザーIDの 0 - 65536=(2^16)-2 を使っているようです。
$ id -nu
osamu
$ cat /etc/subuid
osamu:100000:65536
ここの100000は見通しが良いように大きい目になっていますが、65538以上の 適当なオフセット値ですね。このようなオフセット値を各コンテナ毎ずらせば 確かにコンテナを安全に隔離できますね。
ちなみに、chroot
(2)システムコールが設定するプロセスごとの
ルートディレクトリーは/proc/[pid]/root
からのシムリンクとして
記録されています。これを使えば、コンテナ毎に違うルートファイルシステム
内容のシステムを作成できます。
オーバーレイマウントやバインドマウント等のカーネル機能も効率的な仮想環境 構成に使えます。
なんとなく、コンテナ環境の仮想化が収まっている全体感というか様子が、 ちょっと見えてきました。
shadow-utils
Linux Namespaces関連のnewuidmap
(1)等のコマンドは、
Shadow
が提供するshadow-utilsのソース中にあり、Debianでは
uidmap
バイナリーパッケージの中で提供されています。
shadow-utilsのソースはpasswd
(1)コマンド等も提供しています。
POSIX Access Control Lists
現在のLinuxにおけるcapabilities
(7)には、Access Control Listsという
旧来のUNIXには無い要素技術があります。これは旧来のUNIXのchmod
(1)で
設定する、u
, g
, o
に対するr
, w
, x
等の属性設定よりきめ細か
い制御ができる機能です。
詳しくは、acl
(5)を参照しましょう。acl
バイナリーパッケージに含まれる、
getfacl
(1) や setfacl
(1) を使って管理操作します。
Previous Post | Top | Next Post |