chroot で隔離された環境を作る(Ubuntu 上)
chroot の隔離された環境とは,ファイルシステムが分離された実行環境です.
ユースケース: Ubuntu において,新規ユーザと隔離された環境(chroot 環境)を作成し,その新規ユーザのユーザ名とパスワードを用いて SSH でリモートログインして,隔離された環境(chroot 環境)を効率的に利用することを目的としています
【目次】
1. 前準備
Ubuntu のシステム更新
Ubuntu でシステム更新を実施する場合は, 以下のコマンドを実行します.
sudo apt -y update sudo apt -yV upgrade sudo /sbin/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 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
- インストール完了の確認を行います
- 動作確認として,Ubuntu の隔離された環境(chroot 環境)を有効にし,「uname -a」コマンドで確認します.
確認後は chroot 環境を終了します.
sudo chroot /var/ubuntu2204 bash uname -a exit
- /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
- 設定した /etc/fstab の内容を反映させます
sudo mount -a
- 動作確認として,Ubuntu の隔離された環境(chroot 環境)を有効にし,ps コマンドで
procfs が正常に機能することを確認します
以下の操作を実行し,プロセス情報が表示されることを確認してください
確認後は chroot 環境を終了します.
sudo chroot /var/ubuntu2204 bash ps exit
* 「ps -augx」コマンドを実行すると,すべてのプロセス情報を確認できます.
- /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
- 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 が実行できる環境を整備します
- /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
- schroot の設定内容を確認します.
schroot -l schroot -i -c ubuntu2204
- schroot の動作確認を実施します
schroot を実行する際に「ubuntu2204」の指定方法が不明な場合は,「schroot -l」コマンドで確認できます.
確認結果から,ホームディレクトリが含まれるドライブがマウントされることが分かります.
schroot -c ubuntu2204 -p bash uname -a pwd exit
4. 隔離された環境(chroot 環境)を使ってみる
ここでは,nano エディタのインストール,C プログラムの作成・ビルド・実行を通じて環境の動作を確認します.
- まず,管理者権限で Ubuntu の隔離された環境(chroot 環境)を有効にし,「uname -a」コマンドで確認します
schroot -c ubuntu2204 -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
仮想環境用のディレクトリ「/var/ubuntu2204」とは別個のものです
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 reloadSSH を使用してログインテストを実施します
ssh ai@localhost* エラーが発生してログインできない場合は,/etc/ssh/sshd_config の設定内容と,「ディレクトリの権限の設定」が正しく行われているか確認してください