chroot で隔離された環境を作る(Ubuntu 上)

chroot の隔離された環境とは、ファイルシステムが分離された実行環境である。chroot 環境を使用することで、ホストシステムに影響を与えずにソフトウェアのテストや開発を行うことができる。また、特定のユーザを制限された環境内に閉じ込めることで、セキュリティを向上させることができる。

ユースケース: Ubuntu において、新規ユーザと隔離された環境(chroot 環境)を作成し、その新規ユーザのユーザ名とパスワードを用いて SSH でリモートログインして、隔離された環境(chroot 環境)を利用することを目的としている

目次

  1. 前準備
  2. Ubuntu の隔離された環境(chroot 環境)の作成(debootstrap を使用)
  3. schroot の設定
  4. 隔離された環境(chroot 環境)を使ってみる
  5. リモートログインできるようにする

1. 前準備

Ubuntu のシステム更新

Ubuntu でシステム更新を行う場合は、以下のコマンドを実行する。

Ubuntu のインストール方法は別ページ »で解説している

# パッケージリストの情報を更新
sudo apt update
# インストール済みのパッケージを包括的に更新(依存関係も考慮)
sudo apt full-upgrade
# 変更をシステム全体に反映させるために再起動
sudo shutdown -r now

2. Ubuntu の隔離された環境(chroot 環境)の作成(debootstrap を使用)

本節では以下の設定を行う。

以下のページの内容に基づいて設定を進める。

https://wiki.ubuntulinux.jp/UbuntuPackagingGuideJa/appendix-chroot

  1. 前準備として、debootstrapschroot をインストールする

    debootstrap は Debian/Ubuntu の最小限のベースシステムを構築するツールである。schroot は一般ユーザが chroot 環境を利用できるようにする管理ツールである。

    sudo apt -y install debootstrap schroot
    
    debootstrap と schroot のインストール画面
  2. Ubuntu の隔離された環境(chroot 環境)を作成する

    設定内容は以下の通りである。

    • アーキテクチャ: amd64
    • バージョン: Ubuntu 24.04 (noble)
    • 使用するディレクトリ: /var/ubuntu2404
    • インストールするバリアント: buildd(パッケージビルドに必要な基本ツールを含む構成)

    インストールには時間がかかるため、完了まで待機する。

    sudo rm -rf /var/ubuntu2404
    sudo mkdir /var/ubuntu2404
    sudo debootstrap --arch amd64 --variant buildd --include=ca-certificates,apt,wget,sudo noble /var/ubuntu2404 http://jp.archive.ubuntu.com/ubuntu
    
    debootstrap の実行画面
  3. インストールの完了を確認する
    インストール完了の確認画面
  4. 動作確認として、Ubuntu の隔離された環境(chroot 環境)を有効にし、「uname -a」コマンドで確認する

    確認後は chroot 環境を終了する。

    sudo chroot /var/ubuntu2404 bash
    uname -a
    exit
    
    uname -a コマンドの実行結果
  5. /etc/fstab の設定を行う

    この設定により、chroot 環境内で procfs(プロセス情報を提供する仮想ファイルシステム)や devpts(擬似端末デバイス)を利用できるようになる。この設定はシステム再起動後も維持される。

    /tmp            /var/ubuntu2404/tmp         none    bind            0       0
    proc-chroot     /var/ubuntu2404/proc        proc    defaults        0       0
    devpts-chroot   /var/ubuntu2404/dev/pts     devpts  defaults        0       0
    
    /etc/fstab の設定内容
  6. 設定した /etc/fstab の内容を反映させる
    sudo mount -a
    
    mount -a の実行画面
  7. 動作確認として、Ubuntu の隔離された環境(chroot 環境)を有効にし、ps コマンドで procfs が機能することを確認する

    以下の操作を実行し、プロセス情報が表示されることを確認する。確認後は chroot 環境を終了する。

    sudo chroot /var/ubuntu2404 bash
    ps
    exit
    
    ps コマンドの実行結果

    * 「ps aux」コマンドを実行すると、全プロセス情報を確認できる

  8. /var/ubuntu2404/etc/apt/sources.list の設定を行う

    この設定により、chroot 環境内で追加のパッケージをインストールできるようになる。

    echo "deb http://jp.archive.ubuntu.com/ubuntu noble main restricted universe multiverse" | sudo tee -a /var/ubuntu2404/etc/apt/sources.list
    echo "deb-src http://jp.archive.ubuntu.com/ubuntu noble main restricted universe multiverse" | sudo tee -a /var/ubuntu2404/etc/apt/sources.list
    
    sources.list の設定画面
  9. Ubuntu の隔離された環境(chroot 環境)を有効にし、必要なパッケージをインストールする

    インストール完了後は chroot 環境を終了する。

    sudo chroot /var/ubuntu2404 bash
    apt update
    apt -y install dialog build-essential dh-make automake pbuilder gnupg lintian wget debconf devscripts gnupg sudo language-pack-ja
    exit
    

3. schroot の設定

schroot を設定することで、一般ユーザでも chroot を実行できる環境を整備する。通常、chroot コマンドの実行には root 権限が必要であるが、schroot を使用することで、許可されたユーザが安全に chroot 環境を利用できる。

  1. /etc/schroot/chroot.d/ubuntu2404 を以下のように設定する

    「directory=/var/ubuntu2404」の部分は、作成したディレクトリパスに変更する。「kaneko」の部分は、使用を許可するユーザのユーザ名に変更する(複数ユーザの場合はカンマで区切る)。

    [ubuntu2404]
    description=Ubuntu 24.04 (Noble)
    type=directory
    directory=/var/ubuntu2404
    root-users=kaneko
    users=kaneko
    
    schroot 設定ファイルの内容
  2. schroot の設定内容を確認する
    schroot -l
    schroot -i -c ubuntu2404
    
    schroot 設定確認の結果
  3. schroot の動作確認を行う
    schroot を実行する際に「ubuntu2404」の指定方法が不明な場合は、「schroot -l」コマンドで確認できる

    確認結果から、ホームディレクトリを含むドライブがマウントされていることが分かる。

    schroot -c ubuntu2404 -p bash
    uname -a
    pwd
    exit
    
    schroot 動作確認の結果

4. 隔離された環境(chroot 環境)を使ってみる

本節では、nano エディタのインストール、C プログラムの作成・ビルド・実行を通じて環境の動作を確認する。

  1. Ubuntu の隔離された環境(chroot 環境)を有効にし、「uname -a」コマンドで確認する
    schroot -c ubuntu2404 -p bash
    
    schroot による環境有効化
  2. nano エディタをインストールして動作を確認する

    chroot 環境でも通常の環境と同様に利用できる。

    sudo apt -y install nano
    
    nano エディタのインストール画面
  3. C コンパイラの動作確認を行う

    エディタを使用して以下のプログラムファイルを作成し、「/tmp/hello.c」として保存する。

    #include<stdio.h>
    int main() {
        printf("Hello,World!\n");
        printf("sizeof(size_t)=%ld\n", sizeof(size_t));
        return 0;
    }
    
    hello.c ファイルの作成
    hello.c ファイルの内容
  4. プログラムのコンパイルと実行を行う
    cd /tmp
    gcc -o a.out hello.c
    ./a.out
    
    コンパイルと実行結果
  5. exit コマンドで環境を終了する
    exit
    
    環境終了画面

5. リモートログインできるようにする

本節では、SSH でリモートログインしたユーザを自動的に chroot 環境内に閉じ込める設定を行う。これにより、該当ユーザはホストシステムのファイルにアクセスできなくなる。

新規ユーザの作成とパスワードの設定

以下の設定で新規ユーザを作成する。

sudo adduser --uid 1234 --home /home/ai ai
新規ユーザの作成画面
* 設定を変更する場合は「sudo deluser ai」でアカウントを削除してから再度実行する

ユーザ削除の例

隔離された環境(chroot 環境)内にホームディレクトリを作成し、環境内でアカウント(ユーザ名、パスワード)を追加する

chroot 環境内で sudo コマンドを実行する際などに必要となるため、環境内でアカウント(ユーザ名、パスワード)を設定する。

* 先に設定したパスワードと同一である必要はないが、ユーザID、ホームディレクトリ、ユーザ名は一致させる必要がある

sudo chroot /var/ubuntu2404 bash
rm -rf /home/ai
deluser ai
adduser --uid 1234 --ingroup sudo --home /home/ai ai
exit

/var/ubuntu2404/etc/sudoers の設定

chroot 環境内で sudo を実行する必要がある場合に、この設定を行う。sudo を使用しない場合は、この操作を省略できる。

/var/ubuntu2404/etc/sudoers ファイルに「Defaults visiblepw」の行を追加する。この設定により、SSH 経由でログインした際に sudo がパスワードプロンプトを表示できるようになる。

注意: sudoers ファイルの編集を誤ると sudo が使用できなくなる可能性がある。編集前にバックアップを取得することを推奨する。

sudoers ファイルの編集

sudoers ファイルの権限を設定する。

sudo chmod 444 /var/ubuntu2404/etc/sudoers
sudo chmod 444 /var/ubuntu2404/etc/sudoers.d/*

ディレクトリの権限の設定

SSH によるリモートログインを可能にするため、SSH の ChrootDirectory 機能の要件に従って所有者を root に、権限を 755 に設定する。この要件を満たさない場合、SSH ログイン時にエラーが発生する。

sudo chown root:root /home
sudo chmod 755 /home
sudo chown root:root /var/ubuntu2404
sudo chmod 755 /var/ubuntu2404
sudo chown root:root /var/ubuntu2404/home
sudo chmod 755 /var/ubuntu2404/home
sudo chown root:root /var/ubuntu2404/home/ai
sudo chmod 755 /var/ubuntu2404/home/ai

/etc/ssh/sshd_config の設定

SSH でのリモートログイン時に chroot が実行されるよう、/etc/ssh/sshd_config に以下の設定を追加する。「ChrootDirectory=/var/ubuntu2404」の「/var/ubuntu2404」は、作成したディレクトリパスに変更する。

Match User ai
        X11Forwarding yes
        AllowTcpForwarding yes
        ChrootDirectory /var/ubuntu2404

* sshd_config 内で「AllowUsers xxxx」のようにログイン可能なユーザを制限している場合は、「ai」をその一覧に追加する

/etc/ssh/sshd_config の変更を反映するため sshd を再起動する

sudo service sshd reload
sshd 再起動の実行画面

SSH を使用してログインテストを行う

ssh ai@localhost

* エラーが発生してログインできない場合は、/etc/ssh/sshd_config の設定内容と、「ディレクトリの権限の設定」が正しく行われているか確認する

SSH ログインテストの結果