1. ホーム
  2. 記事一覧
  3. 【BIND高度実践】chroot環境を構築してみよう【前編】

2023.10.01

【BIND高度実践】chroot環境を構築してみよう【前編】

こちらの記事では、BINDを利用したDNSサーバーにchroot環境を構築する手順をハンズオン形式でご紹介します。対象となるDNSサーバーの環境は、以下の記事で作成した環境を使用します。

https://envader.plus/article/213

また、chroot環境の構築に関する解説は以下の記事で紹介しています。不明点がある場合は、その記事を参照しながら本ハンズオンを進めてください。

https://envader.plus/article/228

本記事で行うchroot環境の構築手順

本記事では以下の手順でchroot環境の構築を行います。

  1. chroot環境の領域の作成
  2. /etc/bindから必要なファイルのコピー
  3. confファイルの読み込み先の変更
  4. デバイスファイルの作成
  5. chroot環境の隔離

1. chroot環境の領域の作成

以下のコマンドで、chroot環境の領域を作成します。ここでは、通常のシステムのルートに存在するディレクトリと同様のディレクトリを作成します。

$ sudo mkdir -p /chroot/named/{etc,dev,run,usr,var}

作成されたchroot環境の領域の構造は以下になります。

/
└──	chroot
			└── named
			    ├── dev
			    ├── etc
			    ├── run
			    ├── usr
			    └── var

2. /etc/bindから必要なファイルのコピー

/etc/bindにあるファイルをchroot環境にコピーします。コピー先は/chroot/named/etc/です。

2-1. /chroot/named/etc/にディレクトリの作成

/chroot/named/etc/以下にコピー元のファイルを格納するためのディレクトリを作成します。(管理や可読性のためにディレクトリを分割しますが、必須ではありません)

$ sudo mkdir -p /chroot/named/etc/{conf,default-zones,external-zones,internal-zones,keys}

2-2. /etc/bind/からファイルをコピーする

デフォルトで作成された/etc/bind内のファイルをchroot環境内に用意します。※今回は/etc/bind/からファイルをコピーしますが、ファイルをコピーするか、移動させるかなどは要件や目的によって異なります。

$ sudo cp /etc/bind/named.conf /chroot/named/etc/ && \
sudo cp /etc/bind/zones.rfc1918 /chroot/named/etc/ && \
sudo cp /etc/bind/246.255.10.db /chroot/named/etc/external-zones/ && \
sudo cp /etc/bind/bind.keys /chroot/named/etc/keys/ && \
sudo cp /etc/bind/db.{0,127,255,empty,local} /chroot/named/etc/default-zones/ && \
sudo cp /etc/bind/dns.com /chroot/named/etc/internal-zones/ && \
sudo cp /etc/bind/named.conf.default-zones /chroot/named/etc/default-zones/ && \
sudo cp /etc/bind/named.conf.external-zones /chroot/named/etc/external-zones/ && \
sudo cp /etc/bind/named.conf.internal-zones /chroot/named/etc/internal-zones/ && \
sudo cp /etc/bind/named.conf.{local,options} /chroot/named/etc/conf/ && \
sudo cp /etc/bind/rndc.key /chroot/named/etc/keys/

2-3. root.hintsをコピーする

root.hintsは、DNSにおいてルートDNSサーバーの情報を格納するファイルです。今回のような内部ネットワーク内での名前解決では不要ですが、インターネット上で名前解決が必要な場合に必要になります。

今回はroot.hintsを参照する形で設定します。root.hintsファイルは、通常のシステムのファイルパスと同様にchroot環境内にディレクトリを用意し、そのディレクトリにroot.hintsをコピーします。

# 1. ディレクトリの作成
$ sudo mkdir -p /chroot/named/usr/share/dns/

# 2. root.hintsをコピーする
$ sudo cp /usr/share/dns/root.hints /chroot/named/usr/share/dns/root.hints

2-4. ファイルコピー後の構造の確認

ファイルコピー後のchroot環境内の構造は以下になります。

chroot
└── named
		├── dev
		├── etc
		│   ├── conf
		│   │   ├── named.conf.local
		│   │   └── named.conf.options
		│   ├── default-zones
		│   │   ├── db.0
		│   │   ├── db.127
		│   │   ├── db.255
		│   │   ├── db.empty
		│   │   ├── db.local
		│   │   └── named.conf.default-zones
		│   ├── external-zones
		│   │   ├── 246.255.10.db
		│   │   └── named.conf.external-zones
		│   ├── internal-zones
		│   │   ├── dns.com
		│   │   └── named.conf.internal-zones
		│   ├── keys
		│   │   ├── bind.keys
		│   │   └── rndc.key
		│   ├── named.conf
		│   └── zones.rfc1918
		├── run
		├── usr
		│   └── share
		│       └── dns
		│           └── root.hints
		└── var

3. confファイルの読み込み先の変更

コピーしてきたファイルはchroot環境外の/etc/bind内のファイルを参照しているため、chroot環境内のファイルを参照するように読み込み先を変更する必要があります。

なお、今回作成したchroot環境のルートは/chroot/namedになります。includeディレクティブで指定する読み込み先のファイルパスは/chroot/namedをルートとした絶対パスで指定します。

3-1. named.conf

named.confは前回同様includeのみを定義します。

$ sudo vim /chroot/named/etc/named.conf

// This is the primary configuration file for the BIND DNS server named.
//
// Please read /usr/share/doc/bind9/README.Debian.gz for information on the
// structure of BIND configuration files in Debian, *BEFORE* you customize
// this configuration file.
//
// If you are just adding zones, please do that in /etc/bind/named.conf.local

// BIND設定オプションファイル
include "/etc/conf/named.conf.options";
// BINDゾーン情報ファイル
include "/etc/internal-zones/named.conf.internal-zones";
include "/etc/external-zones/named.conf.external-zones";

3-2. named.conf.options

chroot環境は隔離されたシステムとなるため、デフォルトでは指定不要だった部分を明示的に指定する必要があります。

$ sudo vim /chroot/named/etc/conf/named.conf.options

acl public-subnet {
        10.255.240.0/21;
};

options {
        // 1. 以下を変更
        directory "/var/cache/";

        // If there is a firewall between you and nameservers you want
        // to talk to, you may need to fix the firewall to allow multiple
        // ports to talk.  See http://www.kb.cert.org/vuls/id/800113

        // If your ISP provided one or more IP addresses for stable
        // nameservers, you probably want to use them as forwarders.
        // Uncomment the following block, and insert the addresses replacing
        // the all-0's placeholder.

        forwarders {
                8.8.8.8;   // Google Public DNS
                8.8.4.4;   // Google Public DNSの別のアドレス
        };

				allow-query {
			                localhost;
			                public-subnet;
			        };

        recursion no;

        //========================================================================
        // If BIND logs error messages about the root key being expired,
        // you will need to update your keys.  See https://www.isc.org/bind-keys
        //========================================================================
        dnssec-validation auto;
	
				// 2.
				key-directory "/etc/keys";
				// 3.
				pid-file "/run/named/named.pid";
				// 4.
				session-keyfile "/run/named/session.key";

        listen-on-v6 { none; };

				version "I won't tell you my version.";
};

今回named.conf.optionsに追記した内容は4つです。

記載した内容説明
directory "/var/cache/";BINDが一時的なデータやキャッシュデータを格納するディレクトリを指定する
key-directory "/etc/keys";bind.keysが格納されているディレクトリを指定する
pid-file "/run/named/named.pid";namedサービスのプロセスIDを保存するファイルを指定する
session-keyfile "/run/named/session.key";ダイナミック(動的)DNSの認証キーを保存するファイルを指定する

キャッシュデータやnamed.pid, session.keyに関してはBINDが自動でファイルを生成します。これらを生成するためにはディレクトリを用意しておく必要があります。

以下のコマンドで必要なディレクトリを作成します。

$ sudo mkdir /chroot/named/var/cache /chroot/named/run/named

3-3. named.conf.default-zones

root.hintsに関してはchroot環境内にデフォルトと同様のファイルパスで作成しているので変更は不要です。他db.*のファイル4つに関しては以下のように変更してください。

$ sudo vim /chroot/named/etc/default-zones/named.conf.default-zones

// prime the server with knowledge of the root servers
zone "." {
        type hint;
        file "/usr/share/dns/root.hints";
};

// be authoritative for the localhost forward and reverse zones, and for
// broadcast zones as per RFC 1912

// 以下を変更
zone "localhost" {
        type master;
        file "/etc/default-zones/db.local";
};

// 以下を変更
zone "127.in-addr.arpa" {
        type master;
        file "/etc/default-zones/db.127";
};

// 以下を変更
zone "0.in-addr.arpa" {
        type master;
        file "/etc/default-zones/db.0";
};

// 以下を変更
zone "255.in-addr.arpa" {
        type master;
        file "/etc/default-zones/db.255";
};

3-4. named.conf.internal-zones

デフォルトゾーンファイルまでのファイルパスを変更します。

$ sudo vim /chroot/named/etc/internal-zones/named.conf.internal-zones

// 以下を変更
include "/etc/default-zones/named.conf.default-zones";

3-5. named.conf.external-zones

正引き、逆引きゾーンファイルまでのファイルパスを変更します。

$ sudo vim /chroot/named/etc/external-zones/named.conf.external-zones

# 正引きゾーンファイル
# 以下を変更
zone "dns.com" {
    type master;
    file "/etc/internal-zones/dns.com";
    allow-update { none; };
};

# 逆引きゾーンファイル
# 以下を変更
zone "246.255.10.in-addr.arpa" {
    type master;
    file "/etc/external-zones/246.255.10.db";
    allow-update { none; };
};

4. デバイスファイルの作成

デバイスファイルを作成する際には、デバイスタイプ、メジャーナンバー、マイナーナンバーを指定します。それぞれの属性について以下の表にまとめました。

属性説明
デバイスタイプデータの取り扱い方を示す。キャラクタデバイスはデータを1バイトずつ順番に処理し、ブロックデバイスは大きなデータブロックを一度に処理する。
メジャーナンバーデバイスの「大まかな」種類を示す番号。例: ハードディスクやCD-ROMなどのストレージデバイスは同じメジャーナンバーを共有することが多い。
マイナーナンバー同じ種類のデバイスの中で、具体的なデバイスや機能を区別する番号。例: ハードディスクが複数ある場合、それぞれ異なるマイナーナンバーを持つ。

以下のコマンドで、デバイスファイルを作成します。

$ sudo mknod /chroot/named/dev/null c 1 3
$ sudo mknod /chroot/named/dev/random c 1 8
$ sudo mknod /chroot/named/dev/urandom c 1 9

これらのデバイスファイルはセキュリティや通信プロトコルの実装など、さまざまな目的で使用されます。特に、/dev/nullはデータの捨て場としてよく使われ、/dev/randomおよび/dev/urandomはセキュアなランダムデータの生成に利用されます。

5. chroot環境を隔離する

chroot環境の隔離が一番重要です。所有者や権限を適切に設定する必要があります。chroot環境の隔離は以下の図のように行います。

5-1. /chrootディレクトリの設定

まず初めに、chroot環境から外部へのアクセスを制限します。以下のコマンドを実行します。

# /chrootはユーザとグループをrootに設定する
$ sudo chown root:root /chroot
$ sudo chmod 700 /chroot

5-2. /chroot/namedディレクトリの設定

次に、外部からchroot環境へのアクセスを制限します。以下のコマンドを実行します。

# /chroot/namedはユーザとグループをbindに設定する
$ sudo chown -R bind:bind /chroot/named/
$ sudo chmod 700 /chroot/named

ここまでの設定で、chroot環境を隔離することができました。chroot環境の隔離を行うと、デフォルトのユーザ(ubuntu)でのchroot環境内へのアクセスやファイル参照などが行えなくなりますので、sudoまたはsudo suで実行する必要があります。

まとめ

今回はchroot環境の構築手順の前編を紹介しました。前編の中でのchroot環境の構築における大事な部分は「chroot環境の隔離」です。chroot環境の構築後にBINDがchroot環境内のファイルを適切に参照するために明示的に各種ファイルパスを指定する必要があります。

続きは後編で紹介します。後編に関しては以下の記事をご参照ください。

https://envader.plus/article/230

エンベーダー編集部

エンベーダーは、ITスクールRareTECHのインフラ学習教材として誕生しました。 「遊びながらインフラエンジニアへ」をコンセプトに、インフラへの学習ハードルを下げるツールとして運営されています。

RareTECH 無料体験授業開催中! オンラインにて実施中! Top10%のエンジニアになる秘訣を伝授します! RareTECH講師への質疑応答可

関連記事