頻繁にアップデートされるBINDさん。
■(緊急)BIND 9.xの脆弱性(メモリ不足の発生)について(CVE-2022-3094)
パッチバージョンの入手先
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昇格
$ su -
#
confファイル等をバックアップしておく。named.conf.YYYYMMDDができるので確認する。
# cp -p /etc/named.conf ~/named.conf.`date +%Y%m%d`
# ls -l /etc/named*
# ls -l ~
BINDの状態を確認しておく。
# 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
バージョンを確認しておく
# /usr/sbin/named -v
事前にconfファイルをチェックしておく。
# named-checkconf
インストールされているbindを確認しておく。
# dnf list installed | grep bind
BIND9.16へのアップデート
まずはBINDを9.16台に上げる。こちらのリポジトリでは「9.16-32:9.16.23-0.9」が最新だった。
リポジトリの最新版確認方法はこちら。
# dnf --showduplicates search bind
または
# dnf --showduplicates search bind | grep 9.16
表示された最も高いバージョンにするために、インストール済みパッケージの削除してインストールする。削除ではなくアップデートしたかったが、削除後インストールするしか選択肢がなかった(アップデートコマンドだと、--allowerasingオプションつけてインストールせよ、とエラーが出たため)。仕方なくこのインストールを実施している。
# dnf install bind9.16-32:9.16.23-0.9.el8.1.x86_64 --allowerasing
インストール後のBINDの状態確認
# diff /etc/named.conf ~/named.conf.`date +%Y%m%d`
!バックアップしたconfファイルを差分がないことをチェック。
# systemctl status named
!状態確認
# named-checkconf
!confファイルの構文チェック
# /usr/sbin/named -v
!バージョン確認
その他BINDユーティリティやライブラリなども必要に応じバージョンアップする。
# 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であることを確認する。
# 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アップデートファイルをダウンロードする。
# 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]
カレントディレクトリに保存されるため、確認する。
# pwd
# ls -l
-rw-r--r--. 1 root root 5109440 Jan 25 21:10 bind-9.16.37.tar.xz
xzを解凍する。
# 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/に移動する。その後、カレントディレクトリもそこに移動する。
# 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を解凍する。
[src]# tar xfv ./bind-9.16.37.tar
解凍すると、bind-9.16.37ディレクトリができるので、カレントディレクトリをそこに移動する。
[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先生の力を借りつつ、不足パッケージをインストールしながら進める。私の環境だと事前に以下パッケージを導入する必要があった。
[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する
[bind-9.16.37]# ./configure --sysconfdir=/etc
[bind-9.16.37]# make
インストール前にBINDが止まっていること、または止めてからインストールする。
[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ファイルが変更ない事を確認する。
[bind-9.16.37]# diff /etc/named.conf ~/named.conf.`date +%Y%m%d`
BINDのconfファイルの構文チェック。
[bind-9.16.37]# named-checkconf
BINDの自動起動と、サービス起動を行う。
[bind-9.16.37]# systemctl enable named
[bind-9.16.37]# systemctl start named
プロセス等が起動したことを確認。
[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
バージョン確認。
[bind-9.16.37]# rndc
Usage: rndc [-b address] [-c config] [-s server] [-p port]
・・・
・・・
Version: 9.16.37
自分自身にdigして、名前解決できることを確認する。
[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先生に聞けるからいい、あれでだいぶ効率が上がった。