chroot で隔離された環境を作る(Ubuntu 上)
ユースケース: 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 をインストールする
debootstrap は Debian/Ubuntu の最小限のベースシステムを構築するツールである。schroot は一般ユーザが chroot 環境を利用できるようにする管理ツールである。
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(プロセス情報を提供する仮想ファイルシステム)や 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 の内容を反映させる
sudo mount -a
- 動作確認として、Ubuntu の隔離された環境(chroot 環境)を有効にし、ps コマンドで procfs が機能することを確認する
以下の操作を実行し、プロセス情報が表示されることを確認する。確認後は chroot 環境を終了する。
sudo chroot /var/ubuntu2404 bash ps exit
* 「ps aux」コマンドを実行すると、全プロセス情報を確認できる
- /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
- 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 環境を利用できる。
- /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. リモートログインできるようにする
本節では、SSH でリモートログインしたユーザを自動的に chroot 環境内に閉じ込める設定を行う。これにより、該当ユーザはホストシステムのファイルにアクセスできなくなる。
新規ユーザの作成とパスワードの設定
以下の設定で新規ユーザを作成する。
- ユーザ名: ai
- ユーザID: 1234
- ホームディレクトリ: /home/ai
chroot 環境用のディレクトリ「/var/ubuntu2404」とは異なる点に注意する。
sudo adduser --uid 1234 --home /home/ai 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 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
SSH を使用してログインテストを行う
ssh ai@localhost
* エラーが発生してログインできない場合は、/etc/ssh/sshd_config の設定内容と、「ディレクトリの権限の設定」が正しく行われているか確認する