chroot で隔離された環境を作る(Ubuntu 上)
chroot の隔離された環境とは、ファイルシステムが分離された実行環境である。
ユースケース: Ubuntu において、新規ユーザと隔離された環境(chroot 環境)を作成し、その新規ユーザのユーザ名とパスワードを用いて SSH でリモートログインして、隔離された環境(chroot 環境)を利用することを目的としている
【目次】
1. 前準備
Ubuntu のシステム更新
Ubuntu でシステム更新を実施する場合は、以下のコマンドを実行する。
# パッケージリストの情報を更新
sudo apt update
# インストール済みのパッケージを包括的に更新 (依存関係も考慮)
sudo apt full-upgrade
# 変更をシステム全体に反映させるために再起動
sudo shutdown -r now
2. Ubuntu の隔離された環境(chroot 環境)の作成(debootstrap を使用)
以下の設定を行う。
- chroot 環境では、ファイルシステムを分離する(本体の /home、/var、/etc などにはアクセスできない)
- ただし /tmp は共有環境として設定する
- プロセス情報(/proc)は共有する
以下のページの内容に基づいて設定を進める
https://wiki.ubuntulinux.jp/UbuntuPackagingGuideJa/appendix-chroot
- 前準備として、debootstrap と schroot をインストールする
sudo apt -y install debootstrap schroot
- 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
- インストール完了の確認を行う
- 動作確認として、Ubuntu の隔離された環境(chroot 環境)を有効にし、「uname -a」コマンドで確認する
確認後は chroot 環境を終了する
sudo chroot /var/ubuntu2404 bash uname -a exit
- /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 の内容を反映させる
sudo mount -a
- 動作確認として、Ubuntu の隔離された環境(chroot 環境)を有効にし、ps コマンドで procfs が機能することを確認する
以下の操作を実行し、プロセス情報が表示されることを確認する
確認後は chroot 環境を終了する
sudo chroot /var/ubuntu2404 bash ps exit
* 「ps aux」コマンドを実行すると、全プロセス情報を確認できる
- /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
- 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 が実行できる環境を整備する
- /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 の設定内容を確認する
schroot -l schroot -i -c ubuntu2404
- schroot の動作確認を実施する
schroot を実行する際に「ubuntu2404」の指定方法が不明な場合は、「schroot -l」コマンドで確認できる
確認結果から、ホームディレクトリを含むドライブがマウントされていることが分かる
schroot -c ubuntu2404 -p bash uname -a pwd exit
4. 隔離された環境(chroot 環境)を使ってみる
ここでは、nano エディタのインストール、C プログラムの作成・ビルド・実行を通じて環境の動作を確認する
- Ubuntu の隔離された環境(chroot 環境)を有効にし、「uname -a」コマンドで確認する
schroot -c ubuntu2404 -p bash
- nano エディタをインストールして動作を確認する
chroot 環境でも通常の環境と同様に利用できる
sudo apt -y install nano
- C コンパイラの動作確認を行う
エディタを使用して以下のプログラムファイルを作成し、「/tmp/hello.c」として保存する
#include<stdio.h> int main() { printf("Hello,World!\n"); printf("sizeof(size_t)=%ld\n", sizeof(size_t)); return 0; }
- プログラムのコンパイルと実行を行う
cd /tmp gcc -o a.out hello.c ./a.out
- exit コマンドで環境を終了する
exit
5. リモートログインできるようにする
新規ユーザの作成とパスワードの設定
- ユーザ名: ai
- ユーザID: 1234
- ホームディレクトリ: /home/ai
chroot 環境用のディレクトリ「/var/ubuntu2404」とは異なる
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 ファイルの権限を設定する
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
SSH を使用してログインテストを実施する
ssh ai@localhost
* エラーが発生してログインできない場合は、/etc/ssh/sshd_config の設定内容と、「ディレクトリの権限の設定」が正しく行われているか確認する