BINDのアップデート方法

頻繁にアップデートされるBINDさん。

[■（緊急）BIND 9.xの脆弱性（メモリ不足の発生）について（CVE-2022-3094）](https://jprs.jp/tech/security/2023-01-26-bind9-vuln-dynamic-update.html)

>    パッチバージョンの入手先
> 
>     BIND 9.18.11
>     <https://ftp.isc.org/isc/bind9/9.18.11/bind-9.18.11.tar.xz>
> 
>     BIND 9.16.37
>     <https://ftp.isc.org/isc/bind9/9.16.37/bind-9.16.37.tar.xz>


肝心のアップデート手順はなし。そこが痺れる、BIND～。というわけで、ないなら作る精神でパッチ適用を試行した。この環境では「BIND 9.16.37」のパッチを適用。

## 環境
RHEL8、BIND9.xx(9.16未満)

## 目標
BIND9.16にアップデートする。

## 事前
root昇格
```shell-session
$ su -
#
```

confファイル等をバックアップしておく。named.conf.YYYYMMDDができるので確認する。
```shell-session
# cp -p /etc/named.conf ~/named.conf.`date +%Y%m%d`
# ls -l /etc/named*
# ls -l ~
```

BINDの状態を確認しておく。
```shell-session
# systemctl status named
● named.service - Berkeley Internet Name Domain (DNS)・・・bindの状態が表示される。

# ps aux | grep named | grep -v grep
named       1861  0.0  2.2 265548 18884 ?        Ssl  21:27   0:00 /usr/sbin/named -u named -c /etc/named.conf -t
```

バージョンを確認しておく
```shell-session
# /usr/sbin/named -v
```

事前にconfファイルをチェックしておく。
```shell-session
# named-checkconf
```

インストールされているbindを確認しておく。
```shell-session
# dnf list installed | grep bind
```

## BIND9.16へのアップデート

まずはBINDを9.16台に上げる。こちらのリポジトリでは「9.16-32:9.16.23-0.9」が最新だった。
リポジトリの最新版確認方法はこちら。
```shell-session
# dnf --showduplicates search bind
または
# dnf --showduplicates search bind | grep 9.16
```


表示された最も高いバージョンにするために、インストール済みパッケージの削除してインストールする。削除ではなくアップデートしたかったが、削除後インストールするしか選択肢がなかった(アップデートコマンドだと、--allowerasingオプションつけてインストールせよ、とエラーが出たため)。仕方なくこのインストールを実施している。

```shell-session
# dnf install bind9.16-32:9.16.23-0.9.el8.1.x86_64 --allowerasing
```

インストール後のBINDの状態確認
```shell-session
# diff /etc/named.conf ~/named.conf.`date +%Y%m%d`
！バックアップしたconfファイルを差分がないことをチェック。
# systemctl status named
！状態確認
# named-checkconf
！confファイルの構文チェック
# /usr/sbin/named -v
！バージョン確認
```

その他BINDユーティリティやライブラリなども必要に応じバージョンアップする。
```shell-session
# dnf install bind9.16-utils-32:9.16.23-0.9.el8.1.x86_64 --allowerasing
# dnf install python3-bind9.16-32:9.16.23-0.9.el8.1.noarch --allowerasing
```
パッケージのバージョンが9.16であることを確認する。
```shell-session
# dnf list installed | grep bind
/usr/lib/python3.6/site-packages/requests/__init__.py:91: RequestsDependencyWarning: urllib3 (1.26.10) or chardet (3.0.4) doesn't match a supported version!
  RequestsDependencyWarning)

bind9.16.x86_64                               32:9.16.23-0.9.el8.1                      @rhel-8-appstream-rhui-rpms 
bind9.16-libs.x86_64                          32:9.16.23-0.9.el8.1                      @rhel-8-appstream-rhui-rpms 
bind9.16-license.noarch                       32:9.16.23-0.9.el8.1                      @rhel-8-appstream-rhui-rpms 
bind9.16-utils.x86_64                         32:9.16.23-0.9.el8.1                      @rhel-8-appstream-rhui-rpms 
python3-bind.noarch                           32:9.11.36-3.el8                          @rhel-8-appstream-rhui-rpms 
```

## BIND9.16.37へのアップデート
.37アップデートファイルをダウンロードする。
```shell-session
# wget https://ftp.isc.org/isc/bind9/9.16.37/bind-9.16.37.tar.xz

2023-02-21 21:49:13 (582 KB/s) - ‘bind-9.16.37.tar.xz’ saved [5109440/5109440]
```

カレントディレクトリに保存されるため、確認する。
```shell-session
# pwd
# ls -l
-rw-r--r--. 1 root root  5109440 Jan 25 21:10 bind-9.16.37.tar.xz
```

xzを解凍する。
```shell-session
# xz -dv bind-9.16.37.tar.xz
bind-9.16.37.tar.xz (1/1)
  100 %      4,989.7 KiB / 28.9 MiB = 0.169                                    
# ls -l
-rw-r--r--. 1 root root  30269440 Jan 25 21:10 bind-9.16.37.tar
```

解凍したtarファイルを、/usr/src/に移動する。その後、カレントディレクトリもそこに移動する。
```shell-session
# mv ./bind-9.16.37.tar /usr/src/
# cd /usr/src
[src]# ls -l
total 29560
-rw-r--r--. 1 root root 30269440 Jan 25 21:10 bind-9.16.37.tar
drwxr-xr-x. 2 root root        6 Jun 21  2021 debug
drwxr-xr-x. 2 root root        6 Jun 21  2021 kernels
```

tarを解凍する。
```shell-session
[src]# tar xfv ./bind-9.16.37.tar
```

解凍すると、bind-9.16.37ディレクトリができるので、カレントディレクトリをそこに移動する。
```shell-session
[src]# ls -l
total 29564
drwxrwxr-x. 16 root root     4096 Jan 13 07:45 bind-9.16.37
-rw-r--r--.  1 root root 30269440 Jan 25 21:10 bind-9.16.37.tar
drwxr-xr-x.  2 root root        6 Jun 21  2021 debug
drwxr-xr-x.  2 root root        6 Jun 21  2021 kernels
[src]# cd bind-9.16.37
[bind-9.16.37]# pwd
/usr/src/bind-9.16.37
```

このままconfigureコマンドを実行したいが、大抵他パッケージが足りない等で失敗する。ChatGPT先生の力を借りつつ、不足パッケージをインストールしながら進める。私の環境だと事前に以下パッケージを導入する必要があった。
```shell-session
[bind-9.16.37]# yum group install "Development Tools"
[bind-9.16.37]# dnf install libuv-devel
[bind-9.16.37]# dnf install libressl-devel
[bind-9.16.37]# dnf install libcap-devel
```

前提パッケージを入れたら、configure,makeする
```shell-session
[bind-9.16.37]# ./configure --sysconfdir=/etc
[bind-9.16.37]# make
```

インストール前にBINDが止まっていること、または止めてからインストールする。
```shell-session
[bind-9.16.37]# systemctl status named
[bind-9.16.37]# systemctl stop named
[bind-9.16.37]# ps aux | grep named | grep -v grep
ここからインストールする。↓
[bind-9.16.37]# make install
```

# バージョンアップ後の確認
インストールが成功したら、各状態確認を行う。

まず、バックアップしたファイルとconfファイルが変更ない事を確認する。
```shell-session
[bind-9.16.37]# diff /etc/named.conf ~/named.conf.`date +%Y%m%d`
```

BINDのconfファイルの構文チェック。
```shell-session
[bind-9.16.37]# named-checkconf
```

BINDの自動起動と、サービス起動を行う。
```shell-session
[bind-9.16.37]# systemctl enable named
[bind-9.16.37]# systemctl start named
```

プロセス等が起動したことを確認。
```shell-session
[bind-9.16.37]# systemctl status named
● named.service - Berkeley Internet Name Domain (DNS)
・・・
[bind-9.16.37]# ps aux | grep named | grep -v grep
named      47404  0.0  2.5 342580 20628 ?        Ssl  22:04   0:00 /usr/sbin/named -u named -c /etc/named.conf
```
バージョン確認。
```shell-session
[bind-9.16.37]# rndc
Usage: rndc [-b address] [-c config] [-s server] [-p port]
・・・
・・・
Version: 9.16.37
```

自分自身にdigして、名前解決できることを確認する。
```shell-session
[bind-9.16.37]# dig +noall +answer @localhost www.yahoo.co.jp
www.yahoo.co.jp.	900	IN	CNAME	edge12.g.yimg.jp.
edge12.g.yimg.jp.	60	IN	A	183.79.219.252
```

## 余談
configure,make,make installコマンドを久々に使った。今でこそクラウドでLinuxが簡単に使えるが、一昔前はOSインストールや、Linuxでアプリケーションをインストールするとき、特にyumやdnfで外部のリポジトリが使えない閉域環境、プライベートネットワークに閉じた環境だと、Linuxのインストールメディアをドライブに入れて、パッケージを導入したり。はたまたネットに繋がる端末からパッケージをダウンロードして、それをストレージに入れてサーバ室まで移動して、サーバにつないでからパッケージをインストールしたり、それはもう大変だった。
あの作業は苦痛で仕方なかったが、怪我の功名なのか、いまはどうにかできるようになった（サーバがインターネットにつながる環境というのも大きいが）。ただ、またやりたいかと言われるとキツイ。現代はChatGPTがあるので、エラーが出たらすぐGPT3先生に聞けるからいい、あれでだいぶ効率が上がった。

## 参考サイト
[BINDのアップデートをソースから実施する](https://qiita.com/miyahang55/items/8ff068ec98677ff152bc)

[CentOS7とbind9.9.4／bind-chroot9.9.4を利用したDNSサーバ構築](https://qiita.com/You_name_is_YU/items/81b97179518236e1a5f2)