こちらの記事では、BINDを利用したDNSサーバーにchroot環境を構築する手順をハンズオン形式でご紹介します。対象となるDNSサーバーの環境は、以下の記事で作成した環境を使用します。
https://envader.plus/article/213
また、chroot環境の構築に関する解説は以下の記事で紹介しています。不明点がある場合は、その記事を参照しながら本ハンズオンを進めてください。
https://envader.plus/article/228
本記事で行うchroot環境の構築手順
本記事では以下の手順でchroot環境の構築を行います。
- chroot環境の領域の作成
/etc/bind
から必要なファイルのコピー- confファイルの読み込み先の変更
- デバイスファイルの作成
- 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環境内のファイルを適切に参照するために明示的に各種ファイルパスを指定する必要があります。
続きは後編で紹介します。後編に関しては以下の記事をご参照ください。
【番外編】USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話
プログラミング塾に半年通えば、一人前になれると思っているあなた。それ、勘違いですよ。「なぜ間違いなの?」「正しい勉強法とは何なの?」ITを学び始める全ての人に知って欲しい。そう思って書きました。是非読んでみてください。
「フリーランスエンジニア」
近年やっと世間に浸透した言葉だ。ひと昔まえ、終身雇用は当たり前で、大企業に就職することは一種のステータスだった。しかし、そんな時代も終わり「優秀な人材は転職する」ことが当たり前の時代となる。フリーランスエンジニアに高価値が付く現在、ネットを見ると「未経験でも年収400万以上」などと書いてある。これに釣られて、多くの人がフリーランスになろうとITの世界に入ってきている。私もその中の1人だ。数年前、USBも知らない状態からITの世界に没入し、そこから約2年間、毎日勉学を行なった。他人の何十倍も努力した。そして、企業研修やIT塾で数多くの受講生の指導経験も得た。そこで私は、伸びるエンジニアとそうでないエンジニアをたくさん見てきた。そして、稼げるエンジニア、稼げないエンジニアを見てきた。
「成功する人とそうでない人の違いは何か?」
私が出した答えは、「量産型エンジニアか否か」である。今のエンジニア市場には、量産型エンジニアが溢れている!!ここでの量産型エンジニアの定義は以下の通りである。
比較的簡単に学習可能なWebフレームワーク(WordPress, Rails)やPython等の知識はあるが、ITの基本概念を理解していないため、単調な作業しかこなすことができないエンジニアのこと。
多くの人がフリーランスエンジニアを目指す時代に中途半端な知識や技術力でこの世界に飛び込むと返って過酷な労働条件で働くことになる。そこで、エンジニアを目指すあなたがどう学習していくべきかを私の経験を交えて書こうと思った。続きはこちらから、、、、
エンベーダー編集部
エンベーダーは、ITスクールRareTECHのインフラ学習教材として誕生しました。 「遊びながらインフラエンジニアへ」をコンセプトに、インフラへの学習ハードルを下げるツールとして運営されています。
関連記事
2020.02.25
完全未経験からエンジニアを目指す爆速勉強法
USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話
- キャリア・学習法
- エンジニア
2023.01.25
【初心者向け】GitHubとは?必須知識と使い方について解説!
こちらの記事でGitHubの基礎知識と基本操作、そして実際の開発時の使い方について解説します。
- インフラエンジニア
2023.10.30
IAMエンティティを理解する ユーザー・グループ・ロールの基本
本記事を通じてIAMエンティティの基本的な知識を習得し、AWS環境でのセキュリティ対策を理解していきましょう。
- インフラエンジニア
- AWS
2023.03.01
インフラエンジニアはフリーランスで稼げる?需要は?どのような企業が求めているかを解説
フリーランスになりたいと考えているインフラエンジニアの方に向けて、需要や年収、案件について解説していきます。向いている人/向いていない人も紹介しているので、ぜひ参考にしてください。
- インフラエンジニア
- キャリア・学習法