スマートフォン解析 top

TOP > タイガーチームセキュリティレポート > Sandboxについて - Part 2

タイガーチームセキュリティレポート

Sandboxについて - Part 2

sandboxに関するコラムの第2回です。今回はLinuxのContainer実装であるLXCについてです。


-LXC Basics-

LXCの概要を駆け足で紹介します。

LXC(Linux Containers)はLinuxのContainer実装でありOS-level virtualizationの一種です。LXCを支えているのはmainline kernelの2つの機能、CgroupとNamespaceです。

CgroupとNamespaceはそれぞれ、Linux Kernelの直交する2つのresource管理機能です。

Cgroupはプロセスの集合(cgroup)ごとにCPU, memory, Disk I/Oなどを割り当てる機能とUser Spaceからそれを制御するためのInterfaceであるcgroup file systemなどからなります。

NamespaceはMount, Network, PID, UTS, IPCなどのglobal resourceを分離する機能とプロセスへのNamespaceの割当てに関する幾つかのsystem call(clone(), unshare(), setns())などからなります。

CgroupとNamespaceを組み合わせることによりLXCはchroot jailよりも洗練されたsandbox環境を提供します。

CgroupとNamespaceのうち、LXCのセキュリティを考慮する上で特に興味深いのがNamespaceです。Namespaceの機能により、Containerに対してchroot jailのようなfile systemの見た目上の隔離だけでなくContainerごとに独立したPID空間やNetwork Interfaceを提供することができます。

以上です。LXCのより詳しい紹介は@ten_forwardさんのプレゼン資料を御覧ください。[1]
(図をお借りしました)



-LXC in Action-

chroot jailとの比較のために、/mylxc/rootfs以下に最小限の設定でContainerを構築してみます。ここで構築するContainerは次回以降の検証に使うことにします。以下、構築の手順を簡単に説明します。ContainerのHost環境は前回と同様にDebian wheezyです。

Host環境にlxcとbridge-utilsを導入します。Network Namespaceを使わない場合、bridge-utilsは不要です。


Kernelのcompileの際に設定したconfigを確認します。一部の機能がenabledでない場合は必要に応じてKernelをrecompileします。


Containerのfile systemとなる/mylxc/rootfs以下のディレクトリ構造とメインの設定ファイルlxc.confとContainerのMount Namespaceを設定するfstabを作成します。


lxc-createを実行し、さきほど作成した設定ファイルからmylxcという名前のContainerを作成します。


Containerを起動する前に、/sys/fs/cgroup(他のディレクトリでもokですが)にcgroup file systemをmountしておきます。


Container上で(root権限で)initとbashを起動します。/dev/shmに関する警告メッセージはここでは無視することにします。


Container内でpsを実行するとinitとbashとpsしか見えません。これはHost環境とPID Namespaceが分離されているためです。見えないプロセスにはシグナルを送ることができません。


以上です。chroot()と比べると少しだけ大変です。mylxcの設定は、次回以降に見直すことにしましょう。

ここではbind mountによりHost環境のファイルをroで利用することでなるべく最小限のリソースでContainerを構築しました。より実用的な例としてtemplateから完全なFedora環境をContainer内に構築する方法を紹介します (Fedoraを選択した深い理由はありません)。templateの実体はContainer環境のセットアップを行うshell scriptであり/usr/share/lxc/templates以下に各種templateが用意されています。


lxc-fedoraがFedora環境を構築するためのtemplateになります。FedoraのrpmたちをインストールするためにHost環境にyumとcurlが必要です。


lxc-createのオプションでFedoraのtemplateを指定して起動すれば、セットアップがはじまります。140以上のrpmをDownload & Installするので多少(筆者環境では5分程度)の時間はかかりますが、お茶を飲んでいるうちに終わります。templateが正常終了すれば/var/lib/lxc/fedora以下にFedora 14(古い)環境が構築されたはずです。


以上です。あとは起動するだけ。お手軽かつ超簡単ですね。

Container上のプロセスは他のすべてのプロセスと同様にHost環境のKernel上で直接動作するので完全仮想化のように他のOSを動作させることはできません (FreeBSD KernelはLinux ELF formatの実行形式を理解するので、FreeBSD jail内では一部のLinux distroを動作させることが可能です)。その分、hardware emulationが必要な完全仮想化と比べて性能的にもmemory footprint的にも有利になるのがContainerの良さですが、筆者はContainerのセキュリティにより興味があります。


参考情報:
[1] Linuxコンテナ入門
https://guinan.ten-forward.ws/~karma/container-20131005.pdf
[2] LXC - Wikipedia
http://ja.wikipedia.org/wiki/LXC
[3] cgroups - Wikipedia
http://ja.wikipedia.org/wiki/Cgroups
[4] Namespaces in operation, part 1: namespaces overview [LWN.net]
http://lwn.net/Articles/531114/
[5] LXC - Debian Wiki
https://wiki.debian.org/LXC
[6] lxc/lxc GitHub
https://github.com/lxc/lxc
[7] Linux 3.8 - Linux Kernel Newbies
http://kernelnewbies.org/Linux_3.8


次回は、今回構築したContainerを使ってLXCのセキュリティを見ていきたいと思います。


タイガーチームメンバー 塚本 泰三