TenForward

技術ブログ。はてなダイアリーから移転しました

Ubuntu 12.04 の lxc (2)

間があいてますが 前回 の続きです.全くたいした内容ではありません.

以下は 12.04 だけでなく 12.10 でも通用するお話です.

lxc は,Linux kernel 標準で提供されているコンテナ関係の機能 (namespace と cgroup) を使って作られているわけですが,まだ kernel に不足している機能もあり,それだけだと色々とセキュリティ的にマズい事が出来てしまう場合があります.

Ubuntu ではそのような事が起こらないようにするために,Ubuntu が採用している Apparmor を使っています.lxc パッケージをインストールすると,色々と profile がインストールされます.lxc 側でも Apparmor を使う仕組みは実装されていて,最近リリースされた lxc-0.8.0 ではコンテナの設定ファイルに使用する profile を書く設定があります.Ubuntu 12.04 でもデフォルトだと Apparmor を使うようにコンテナ等が設定されます.12.04 の lxc は 0.7.5 で,まだ Apparmor 関連機能は実装されてなかったと思いますが,Ubuntu パッケージのパッチを見るとそれ関係のパッチが当てられているのが分かります.12.10 では 0.8.0 が入りますから,標準でサポートされている機能になります.

この辺りは Ubuntuのドキュメント に説明がありますので,そちらをどうぞ.

さて,普通だと安全に設定されるコンテナが良いですが,無効にして起動したい場合もあるかと思います.その場合,コンテナの設定ファイルに以下のように記述します.

lxc.aa_profile = unconfined

これで Apparmor 無効の lxc コンテナが起動します.こうして起動したコンテナで例えば

# echo b > /proc/sysrq-trigger

などと実行すると,ホスト OS がリブート出来るのが観測できるかと思います (ヲイ).(この動きは以前からです)

実際は lxc-start コマンドにも適用されているものがあるので,上記設定だけだと完全に何も適用されていないコンテナではないのですが,その辺りの詳細は先に紹介した Ubuntu のドキュメントを参照してください.

ちなみに OpenVZ でも,多分 lxc と同じ /proc の namespace 機能が使われているはずですが,同じ事をコンテナで実行しても何も起きません.OpenVZ 用のパッチを見ると,色々と sysrq 関係のコードにパッチが当たっていますので,その辺りで実行できないようにされているんだと思います (ちゃんと調べてないのであてずっぽうです).