2011年9月13日火曜日

bind : ソースインストール してみた。

サボリ気味だったから、たまには本来の目的の技術情報もちゃんと書かないとね。


もうちょっと前の話ですが、bindの動作検証をする必要があったため、その時のメモ。
わけあって、バージョンは9.7.1-P2ですが、9.7.4とかでもだいたい一緒でしょう!(多分。。)

先にOpenSSLをインストールしておく。
OpenSSL自体はおそらく既にインストールされているので、下記コマンドで確認。

# openssl version
# which openssl

入ってなかったら、とりあえずyumで入れとく。
※脆弱性対策とかを考えると、ホントはopensslも最新のものをソースからインストールする方が望ましいです。

# yum install openssl

で、openssl だけだと、bind をインストールする時に引っかかるので、opennssl-devel も入れる。

# yum install openssl-devel

ここまでそろったら、いよいよbindのインストール。

# tar zxvf bind-9.7.1-P2.tar.gz
# cd bind-9.7.1-P2
# .configure --with-openssl --enable-ipv6 --with-libtool ※ipv6の部分はいらないかも
# make depend
# make all
# make install

で、ひとまずインストールは終了。


次に初期設定。

rndc鍵を作成する。

# rndc-confgen -a

# ls -l /etc/rndc.key
-rw------- 1 root root 77 8月 9 06:28 /etc/rndc.key

# cat /etc/rndc.key
key "rndc-key" {
algorithm hmac-md5;
secret "1uO8DAPSLsR/Tri4ar4Lyg==";
};

設定ファイルを作成する。
# rndc-confgen > /etc/rndc.conf


# ls -l /etc/rndc.conf
-rw-r--r-- 1 root root 479 8月 9 06:29 /etc/rndc.conf


# cat /etc/rndc.conf
# Start of rndc.conf
## rndcの共有鍵
key "rndc-key" {
algorithm hmac-md5;
secret "RTIoq8RxmGxQ3sRRfiicUA==";
};


## rndcの制御を受け付けるアドレス・ポートとそれに対応する共有鍵を定義
options {
default-key "rndc-key";
default-server 127.0.0.1;
default-port 953;
};
# End of rndc.conf


# Use with the following in named.conf, adjusting the allow list as needed:
# key "rndc-key" {
# algorithm hmac-md5;
# secret "RTIoq8RxmGxQ3sRRfiicUA==";
# };
#
# controls {
# inet 127.0.0.1 port 953
# allow { 127.0.0.1; } keys { "rndc-key"; };
# };
# End of named.conf


rndc.conf の、Use with ~ End of named.conf の部分をコピって、
named.conf を作成する。コメントアウトは全て外す。

# vi named.conf


## rndcの共有鍵

key "rndc-key" {

algorithm hmac-md5;

secret "RTIoq8RxmGxQ3sRRfiicUA==";

};

## rndcの制御を受け付けるアドレス・ポートとそれに対応する共有鍵を定義

controls {

inet 127.0.0.1 port 953

allow { 127.0.0.1; } keys { "rndc-key"; };

};



で、ここまで来たらひとまずbindの制御ツールであるrndcコマンドを使って確認してみる。

# rndc status
WARNING: key file (/etc/rndc.key) exists, but using default configuration file (/etc/rndc.conf)
rndc: connect failed: 127.0.0.1#953: connection refused

なんか、WARNINGが出た。
/etc/rndc.key があるのに、/etc/rndc.conf を使ってますよ、と。
ということで、rndc.confを修正してみる。

---
## rndcの共有鍵
key "rndc-key" {
algorithm hmac-md5;
secret "RTIoq8RxmGxQ3sRRfiicUA==";
};
---

この部分を、

---
## rndcの共有鍵
include "/etc/rndc.key"
---

としてみた。
rndc.conf の rndc.key と、named.conf の rndc.key の値は一致していないと
いけないので、/etc/named.conf も同様に修正した。

ここで、再度rndcコマンドを実施。

# rndc status
WARNING: key file (/etc/rndc.key) exists, but using default configuration file (/etc/rndc.conf)
rndc: connect failed: 127.0.0.1#953: connection refused

、、、また同じのが出た。
なんか手元の書籍とかでそれぞれ違うことが書いてあって、混乱したのですが、
結局のところ、rndc.key がある場合は、rndc.conf はいらないみたい。
ということで、rndc.conf は削除。

# rm -i /etc/rndc.conf

そして、再度rndcコマンドを実行。

# rndc status
rndc: connect failed: 127.0.0.1#953: connection refused

お、今度はWARNINGが消えた☆
っていうかそもそもrndc.keyを作る必要がなかったという噂もあるけど、、、。
まぁよしとして、ここからが本題。

connection refused となっているのは、bind が起動してないからかな。
では、起動する前に named.conf の最低限の設定をやっておこう。

現時点でのnamed.confは下記の通り。


## rndcの共有鍵

include "/etc/rndc.key";



## rndcの制御を受け付けるアドレス・ポートとそれに対応する共有鍵を定義

controls {

inet 127.0.0.1 port 953

allow { 127.0.0.1; } keys { "rndc-key"; };

};



上記に、最低限の設定を追加。


## rndcの共有鍵

include "/etc/rndc.key";



## rndcの制御を受け付けるアドレス・ポートとそれに対応する共有鍵を定義

controls {

inet 127.0.0.1 port 953

allow { 127.0.0.1; } keys { "rndc-key"; };

};



## ゾーンファイル設置ディレクトリを指定

options {

directory "/var/named";

};



## hintファイル(rootサーバの情報を記載)の位置を指定

zone "." IN {

type hint;

file "named.ca";

};



では、定義した通り、/var/named 配下に、 hintファイルを named.ca として保存する。
hintファイルは、ftp://ftp.internic.net/domain/named.root として公開されている。

# mkdir /var/named
# cd /var/named
# wget ftp://ftp.internic.net/domain/named.root
--2011-08-10 12:37:15-- ftp://ftp.internic.net/domain/named.root
=> `named.root'ftp.internic.net をDNSに問いあわせています... 208.77.188.26
ftp.internic.net|208.77.188.26|:21 に接続しています... 接続しました。
anonymous としてログインしています... ログインしました!
==> SYST ... 完了しました。 ==> PWD ... 完了しました。
==> TYPE I ... 完了しました。 ==> CWD /domain ... 完了しました。
==> SIZE named.root ... 3048
==> PASV ... 完了しました。 ==> RETR named.root ... 完了しました。
長さ: 3048 (3.0K)


100%[==========================================================>] 3,048 --.-K/s 時間 0.001s


2011-08-10 12:37:17 (4.73 MB/s) - `named.root' へ保存終了 [3048]


# ls -l
合計 4
-rw-r--r-- 1 root root 3048 8月 10 12:37 named.root
# mv named.root named.ca
# ll
合計 4
-rw-r--r-- 1 root root 3048 8月 10 12:37 named.ca

最低限の設定が終わったので、bindを起動してみる。

# named -c /etc/named.conf
# ps auxww | grep named
root 4441 0.5 3.8 7892 4780 ? Ss 12:48 0:00 named -c /etc/named.conf
root 4446 0.0 0.5 5076 752 pts/0 R+ 12:48 0:00 grep named

無事に起動した模様。
※rootユーザで起動してしまっているが、それはあとで対応しよう。

では、再度rndcコマンドを打ってみる。

# rndc status
version: 9.7.1-P2
number of zones: 17
debug level: 0
xfers running: 0
xfers deferred: 0
soa queries in progress: 0
query logging is OFF
recursive clients: 0/0/1000
tcp clients: 0/100
server is up and running

キターーーーー!
いちいち躓いたけど、無事にインストール~動作確認が出来ました~(・∀・)
ではこれにて終了~、、、

と、行きたいところなんだけど、このままだとセキュリティ的に望ましくないらしい。
bind(に特定される話ではないようにも思うけど)を動作させるのはchroot環境で、
っていうのが定石みたい。

======

ということで、次はchroot環境の設定を行う。(もう疲れたよ。。)

概要としては、

1.bindを動かす一般ユーザ(named)の作成。
2.chroot環境の構築および権限・所有者(named)の設定。
3.設定ファイルをchroot先のディレクトリ配下に置く。
4.chroot先のetcディレクトリ配下に、「localtime」ファイルを置く。
5.chroot先に「/var/run」ディレクトリを作成する。※pidファイルを置くため
6.chroot先に「dev」ディレクトリを作成し、mknodコマンドでデバイスファイルを作成する。

となります。(Amazonリンクの本の受け売りです。。)

まずは、ユーザの作成。

# groupadd named
# cat /etc/group | grep named
named:x:500:
# useradd -g named named
# usermod -s /bin/false named ←ログイン出来ないようにする。
# cat /etc/passwd | grep named
named:x:500:500::/home/named:/bin/false

んで次に、chroot環境の構築。
まずはディレクトリの作成

# mkdir /var/named/chroot
# mkdir /var/named/chroot/dev
# mkdir /var/named/chroot/etc
# mkdir /var/named/chroot/var
# mkdir /var/named/chroot/var/named
# mkdir /var/named/chroot/var/run
# mkdir /var/named/chroot/var/run/named
# mkdir /var/named/chroot/var/log ※これはログ用なので任意で。

次に設定ファイルの配置。

# mv /var/named/named.ca chroot/var/named/
# mv /etc/named.conf /var/named/chroot/etc/
# ln -s /var/named/chroot/etc/named.conf /etc/named.conf
# mv /etc/rndc.key /var/named/chroot/etc/
# ln -s /var/named/chroot/etc/rndc.key /etc/rndc.key
# cp -p /etc/localtime chroot/etc/

デバイスファイルの配置。

# mknod /var/named/chroot/dev/null c 1 3
# mknod /var/named/chroot/dev/zero c 1 5
# mknod /var/named/chroot/dev/randome c 1 8

所有者の設定。

# chown -R named:named /var/named

権限の設定。

# chmod 750 /var/named
# chmod 750 /var/named/chroot
# chmod 750 /var/named/chroot/*


で、最終的にこんな感じになる。

# tree -pug /var/named
/var/named
`-- [drwxr-x--- named named ] chroot
|-- [drwxr-x--- named named ] dev
| |-- [crw-r--r-- named named ] null
| |-- [crw-r--r-- named named ] random
| `-- [crw-r--r-- named named ] zero
|-- [drwxr-x--- named named ] etc
| |-- [-rw-r--r-- named named ] localtime
| |-- [-rw-r--r-- named named ] named.conf
| `-- [-rw------- named named ] rndc.key
`-- [drwxr-x--- named named ] var
|-- [drwxr-xr-x named named ] log
|-- [drwxr-xr-x named named ] named
| `-- [-rw-r--r-- named named ] named.ca
`-- [drwxr-xr-x named named ] run
`-- [drwxr-xr-x named named ] named

chroot/etc 配下の、named.conf および rndc.key は、/etc 配下(元の場所)へシンボリックリンクを貼ってある。

# ls -l /etc/rndc.key
lrwxrwxrwx 1 root root 30 8月 10 14:22 /etc/rndc.key -> /var/named/chroot/etc/rndc.key
# ls -l /etc/named.conf
lrwxrwxrwx 1 root root 32 8月 10 14:17 /etc/named.conf -> /var/named/chroot/etc/named.conf


さぁ、これでいよいよ準備が整ったので、chroot環境でnamedを起動してみる。

# ps auxww | grep named
root 2990 0.0 0.5 5076 752 pts/0 R+ 14:56 0:00 grep named


# named -u named -t /var/named/chroot/ -c /etc/named.conf


# ps auxww | grep named
named 3001 0.4 3.8 7940 4772 ? Ss 14:58 0:00 named -u named -t /var/named/chroot/ -c /etc/named.conf
root 3012 0.0 0.5 5076 752 pts/0 R+ 14:59 0:00 grep named

ちゃんとchroot環境で動作しているようです。

さて、これでめでたくbindのインストール完了!

と、言いたいところですが。。(まだあるのか。。)

実は、、、bindの落とし方が分からないのですが。。
起動スクリプトとかってありますか、、、?

ということで、作るのが面倒だったので同僚に貰いました~。

# mv ~/named /etc/init.d/
# chmod 755 /etc/init.d/named

停止してみる。

# ps auxww | grep named
named 3295 0.2 3.8 7940 4780 ? Ss 16:01 0:00 /usr/local/sbin/named -u named -t /var/named/chroot
root 3306 0.0 0.5 5076 752 pts/0 R+ 16:01 0:00 grep named


# ls -l /var/named/chroot/var/run/named/
合計 8
-rw-r--r-- 1 named named 5 8月 10 16:01 named.pid
-rw------- 1 named named 102 8月 10 16:01 session.key


# service named stop
named を停止中: [ OK ]


# ps auxww | grep named
root 3355 0.0 0.5 5076 748 pts/0 R+ 16:03 0:00 grep named


# ls -l /var/named/chroot/var/run/named/
合計 0

起動してみる。

# service named start
named を起動中: [ OK ]


# ps auxww | grep named
named 3396 0.1 3.8 7940 4784 ? Ss 16:04 0:00 /usr/local/sbin/named -u named -t /var/named/chroot
root 3404 0.0 0.5 5076 752 pts/0 R+ 16:04 0:00 grep named


# ls -l /var/named/chroot/var/run/named/
合計 8
-rw-r--r-- 1 named named 5 8月 10 16:04 named.pid
-rw------- 1 named named 102 8月 10 16:04 session.key

rndc でも確認してみる。

# rndc status
version: 9.7.1-P2
number of zones: 17
debug level: 0
xfers running: 0
xfers deferred: 0
soa queries in progress: 0
query logging is OFF
recursive clients: 0/0/1000
tcp clients: 0/100
server is up and running

と、いうことで、中身についてはそれほど精査していませんが、問題なさそうです。
パッケージについてくる起動スクリプトを書き換えたみたいなので、まぁ大丈夫でしょう。
とはいえ未検証のものを載せるのは、たとえブログでも気が引けるのでやめておきます(・。・;


長くなりましたが、、、
これにてめでたくbindのソースからのインストール完了!(多分)

設定は次回ということで~



おしまい。

※下記の書籍を参考にさせて頂きました。
どちらも分かりやすかったです。実践DNSの方は、DNSSECのことも詳しく載っています。


  

0 件のコメント:

コメントを投稿