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

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. 前準備として、debootstrap と schroot をインストールする
    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 などを利用するための設定である

    /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 の設定を行う
    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 が実行できる環境を整備する

  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. リモートログインできるようにする

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

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 を実行する必要がある場合のための設定である(必要がない場合は、この操作は省略可能である)

/var/ubuntu2404/etc/sudoers ファイルに「Defaults visiblepw」の行を追加する

sudoers ファイルの編集

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

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

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

SSH によるリモートログインを可能にするため、SSH の要件に従って所有者を root に、権限を 755 に設定する

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 内で「AllowUser xxxx」のようにログイン可能なユーザを制限している場合は、「ai」をその一覧に追加する

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

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

SSH を使用してログインテストを実施する

ssh ai@localhost

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

SSH ログインテストの結果