Linux namespace と chroot を使用してプロセス ID を分離

Pocket

コンテナセキュリティ Liz Rice 著を読んでいます。
前半でコンテナで使用される Linux の要素技術を説明して、コンテナの仕組みを把握します。
コンテナの仕組みを踏まえてコンテナセキュリティの考え方を解説します。

本記事は 4 章のプロセス ID の分離についての読書メモです。

ゴール

Linux の namespace 機能と chroot を使用してプロセスを分離します。

使用コマンド

  • unshare namespace を作成
  • chroot root ディレクトリを変更

前提

  • Amazon EC2 Ubuntu 22.04 を使用
  • ホームディレクトリに workdir を作成

表記

  • 通常のプロンプトを $ で表記
  • 作成した namespace のプロンプトを \ で表記

プロセスの分離

変更後 root ディレクトリに alpine のディレクトリを使います。

$ cd "${HOME}/workdir"
$ mkdir sample
$ cd sample
$ curl -o alpine.tar.gz https://dl-cdn.alpinelinux.org/alpine/latest-stable/releases/x86_64/alpine-minirootfs-3.19.0_rc3-x86_64.tar.gz
$ tar xvf alpine.tar.gz
$ rm alpine.tar.gz
$ cd ..

pid namespace、 mount namespace および chroot を組み合わせてプロセスを分離します。

$ sudo unshare --pid --mount --fork chroot sample sh

新たな namespace で ps を実行します。

\ ps auxf
PID   USER     TIME  COMMAND

プロセスを確認できません。
ps は /proc ディレクトリを読み込んで動作しますが chroot で root が ${HOME}/workdir/sample に変更されたので /porc ディレクトリが存在しないためにプロセスを表示できません。
新たな namespace で proc をマウントします。

\ mount -t proc proc proc

再度 ps を実行します。

\ ps auxf
PID   USER     TIME  COMMAND
    1 root      0:00 sh
    5 root      0:00 ps af

新たな namespace のプロセスが表示されます。
またホストのプロセスは見えません。(ホストからは namespace のプロセスは見えます)。

当たらな namespace の proc ディレクトリを見ます。

\ ls -al /proc
total 4
dr-xr-xr-x  167 root     root             0 Apr 20 02:07 .
drwxr-xr-x   19 1000     1000          4096 Dec  5 07:02 ..
dr-xr-xr-x    9 root     root             0 Apr 20 02:07 1
dr-xr-xr-x    9 root     root             0 Apr 20 02:28 5
dr-xr-xr-x    9 root     root             0 Apr 20 02:28 6
dr-xr-xr-x    3 root     root             0 Apr 20 02:07 acpi
...

プロセス関連のファイルが格納されています。

今回は pid namespace と mount namespace でコンテナがホストとどのように分離されているかをざっくりと概観しました。

コメント

No comments yet.

コメントの投稿

改行と段落タグは自動で挿入されます。
メールアドレスは表示されません。