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

chroot の隔離された環境とは,ファイルシステムが分離された実行環境です.

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

目次

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

1. 前準備

Ubuntu のシステム更新

Ubuntu でシステム更新を実施する場合は, 以下のコマンドを実行します.

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

sudo apt -y update
sudo apt -yV upgrade
sudo /sbin/shutdown -r now

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

以下の設定を行います.

以下のページの内容に基づいて設定を進めます https://wiki.ubuntulinux.jp/UbuntuPackagingGuideJa/appendix-chroot

  1. 前準備として,debootstrap と schroot をインストールします
    sudo apt -y install debootstrap schroot
    
  2. Ubuntu の隔離された環境(chroot 環境)を作成します

    設定内容は以下の通りです

    • アーキテクチャ: amd64
    • バージョン: Ubuntu 22.04 (jammy)
    • 使用するディレクトリ: /var/ubuntu2204
    • インストールするバリアント: minbase と buildd

    インストール完了まで時間がかかりますので,しばらくお待ちください

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

    確認後は chroot 環境を終了します.

    sudo chroot /var/ubuntu2204 bash
    uname -a
    exit
    
  5. /etc/fstab の設定を行います

    これは,隔離された環境(chroot 環境)内で procfs などを利用するための設定です

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

    以下の操作を実行し,プロセス情報が表示されることを確認してください

    確認後は chroot 環境を終了します.

    sudo chroot /var/ubuntu2204 bash
    ps
    exit
    

    * 「ps -augx」コマンドを実行すると,すべてのプロセス情報を確認できます.

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

    インストール完了後は chroot 環境を終了します.

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

3. schroot の設定

schroot を設定して,一般ユーザでも chroot が実行できる環境を整備します

  1. /etc/schroot/chroot.d/ubuntu2204 を以下のように設定します

    「directory=/var/ubuntu2204」の部分は,実際に作成したディレクトリパスに変更してください

    kaneko」の部分は,使用を許可するユーザのユーザ名に変更してください(複数ユーザの場合はカンマで区切ります)

    [ubuntu2204]
    description=Ubuntu 22.04 (Jammy)
    type=directory
    directory=/var/ubuntu2204
    root-users=kaneko
    users=kaneko
    
  2. schroot の設定内容を確認します.
    schroot -l 
    schroot -i -c ubuntu2204
    
  3. schroot の動作確認を実施します

    schroot を実行する際に「ubuntu2204」の指定方法が不明な場合は,「schroot -l」コマンドで確認できます.

    確認結果から,ホームディレクトリが含まれるドライブがマウントされることが分かります.

    schroot -c ubuntu2204 -p bash
    uname -a
    pwd
    exit
    

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

ここでは,nano エディタのインストール,C プログラムの作成・ビルド・実行を通じて環境の動作を確認します.

  1. まず,管理者権限で Ubuntu の隔離された環境(chroot 環境)を有効にし,「uname -a」コマンドで確認します
    schroot -c ubuntu2204 -p bash
    
  2. nano エディタをインストールして動作を確認します

    chroot 環境でも通常の環境と同様の操作感で利用できます.

    sudo apt -y install 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;
    }
    
  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/ubuntu2204 bash
rm -rf /home/ai
申し訳ありません.途中で切れてしまった部分から続けさせていただきます.

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

/var/ubuntu2204/etc/sudoers の設定

これは,隔離された環境(chroot 環境)内で sudo を実行する必要がある場合のための設定です.(必要がない場合は,この操作は省略可能です).

/var/ubuntu2204/etc/sudoers ファイルに「Defaults visiblepw」の行を追加します.

適切な権限を設定します

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

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

ssh によるリモートログインを可能にするため, ssh の要件に従って所有者を root に,権限を「755」に設定します.

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

/etc/ssh/sshd_config の設定

SSH でのリモートログイン時に chroot が自動的に実行されるよう,/etc/ssh/sshd_config に以下の設定を追加します

「ChrootDirectory=/var/ubuntu2204」の「/var/ubuntu2204」は,実際に作成したディレクトリパスに変更してください

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

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

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

sudo service sshd reload

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

ssh ai@localhost

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