最もオープンなネットワークサービスであるDNSは、ネットワーク攻撃の対象のNO1。だから、いつでもタイムリーに脆弱性対策ができるように、BINDはソースからビルドしよう。BIND9のソースからのビルド手順を解説します。
目次
DNSサーバはネットワーク攻撃対象NO1
DNSサービスは、不特定多数のアクセスを許すという性格上、常にネットワーク攻撃の対象NO1にランクされます。DNSサーバのデファクトスタンダードであるISC(Internet Service Consorthium)のBINDは、たいていのLinuxディストリビューションに標準添付され、最近では、chroot設定の雛形が、RedHat系LinuxのRPMのような、バイナリーパッケージで提供されている場合もあります。
しかしながら、Linuxディストリビューションのヴァージョンアップを待っていたのでは、危険な脆弱性が発見された場合に、タイムリーに対応することができません。ですから、BINDの場合は、バイナリーインストールの便利さを捨てて、ソースからのビルドを心がけることを強くお勧めします。
BIND9をソースからビルドする
BIND9のソースは、以下のISCのWEBサイトでダウンロード可能です。
https://www.isc.org/downloads/
上のリンク先のページには、BIND9.2から現在までの、すべてのBIND9の各ミドルヴァージョンの最新版のソースコードが公開されています。2009年8月現在、最新ヴァージョンはBIND9.6.1-P1です。このヴァージョンは、2009年7月28日に公表されたDoS攻撃に対する脆弱性対策が施されています。
ISCは、何らかの脆弱性が発見され、これに対応する場合、その時点での最新ヴァージョンのみでなく、一定期間、過去の各ミドルヴァージョンについても対策を施します。たとえば、BIND-9.2, BIND-9.3はEOL(End Of Life)が宣言され、すでにサポートが終了していますが、BIND-9.4, BIND-9.5については、前述の脆弱性対策を施したヴァージョンが、BIND-9.6.1-P1とほぼ同時期にリリースされています。
ここでは、例として最新版BIND-9.6.1-P1を利用することにします。
BIND9のインストールに必要な他のソフトウェア
BIND9にはOpenSSLが必要です。OpenSSLはその演算の性格上、スタックオーバーフローなどをねらう攻撃者のターゲットになりやすく、BIND同様、活発に更新されますが、BIND9はconfig時にOpenSSLのヴァージョンをチェックします。
流通しているLinuxディストリビューションに付属するOpenSSLはほとんどすべて、BIND9のヴァージョンチェックに引っかかります。BIND同様、OpenSSLも、ソースからビルドしておくことをお勧めします。
参考:
「OpenSSLが必要」という記述について、正確に言うとBINDはOpenSSLがインストールされていないサーバでもビルド可能です。BINDでOpenSSLは証明書を使う機能に必須です。たとえば当社のDNSサーバはドメイン情報の査証等を防止するためDNSSECを採用していますが、DNSSECにはOpenSSLが必須です。また、いくつかの管理機能がOpenSSLを使います。
BIND9のソースtarボールを入手し解凍する
ユーザープログラムのソースは、/usr/local/srcに配置するのがUNIX系OSでの習慣ですが、プロダクションサーバにソースを残したくない場合は、/tmp以下で行うことをお勧めします。ここでは/usr/local/src以下で作業することにします。
BIND9のビルドを行うホストからISCのサイトがFTPでアクセス可能である場合、以下の手順で直接BIND-9.6.1-P1のソースtarボールを入手します。
# wget ftp://ftp.isc.org/isc/bind9/9.6.1-P1/bind-9.6.1-P1.tar.gz
ダウンロードが終了したら、解凍、展開します。
configureする
BIND9は、configure実行時にパラメータ指定することにより、インストール場所の指定や機能追加をすることができます。以下のパラメータ指定は、ほとんどの場合に対応可能です。
- –enable-threads
マルチスレッド対応でビルドします。マルチCPU構成のホストでは、複数のCPUに対応したワーカースレッドが使用可能になります。シングルCPUのホストの場合、あまり意味がありませんが、指定しておいても動作に不都合はありません。 - –with-openssl=/usr/local/ssl
OpenSSLのインストール場所を指定します。OpenSSLは、Linux OSをインストールした際にインストールされたものがあります。そちらではなくソースからビルドした最新のOpenSSLを使用するために、この指定が必要です。上記の例は、OpenSSLをデフォルトのインストールパスにインストールした場合です。ライブラリが/usr/local/ssl/lib/、includeファイルが/usr/local/ssl/include/opensslで検索されます。
# ./configure –enable-threads –with-openssl=/usr/local/ssl
正常に終了すれば、次の工程のmakeに必要なMakefileが生成されます。
makeする
以下のようにmakeを実行すると、コンパイルが始まります。
バイナリ版のBINDがインストールされていたら削除する
もし、OSインストール時にBINDがインストールされていたら、この段階でアンインストールしておきます。
以下は、BIND9に関連してインストールされている可能性あるパッケージをリストアップしたものです。X86_64版のFedora8の場合ですが、他のOSでは、異なっているかもしれません。
Package | Arch | Version | Repository | Size |
---|---|---|---|---|
bind-chroot | x86_64 | 32:9.5.0-16.a6.fc8 | fedora | 51 k |
bind-devel | x86_64 | 32:9.5.0-16.a6.fc8 | fedora | 3.1 M |
bind-devel | i386 | 32:9.5.0-16.a6.fc8 | fedora | 3.1 M |
bind | x86_64 | 32:9.5.0-16.a6.fc8 | fedora | 1.7 M |
bind-libs | i386 | 32:9.5.0-16.a6.fc8 | fedora | 930 k |
上記のパッケージがインストールされた際に、以下のものも依存性の関係でインストールされているかも知れません。不要なものはアンインストールしておきます。削除しようとしたときに、他のパッケージとの依存性があることがわかった場合や、わからない場合は、そのままにしておいても結構です。
Package | Arch | Version | Repository | Size |
---|---|---|---|---|
mysql | x86_64 | 5.0.45-4.fc8 | fedora | 2.7 M |
mysql-libs | x86_64 | 5.0.45-4.fc8 | fedora | 3.1 M |
perl-DBI | x86_64 | 1.58-2.fc8 | fedora | 930 k |
unixODBC | x85_64 | 2.2.12-4.fc8 | fedora | 878 k |
RedHat系Linuxの場合以下のいずれかの手順でRPMを削除できます。
削除しようとするRPMモジュールに依存している他のモジュールがある場合、警告とともにエラー終了します。不要なものであれば、依存しているものを先にアンインストールします。たとえば、bind-chrootはbindに依存しますので、bindより先にbind-chrootをアンインストールします。
BIND9をインストールする
以下を実行すると、BIND9のファイルが所定の場所にインストールされます。
その他の作業
bindは本来システム系のプログラムとして/usr/sbinにインストールされます。他のソフトウェアがこの場所を想定している場合を考慮して、BINDの実行ファイルであるnamed、その他のユーティリティプログラムのシンボリックリンクを作成しておきます。
# ln -s /usr/local/sbin/named-checkconf /usr/sbin/named-checkconf
# ln -s /usr/local/sbin/named-checkzone /usr/sbin/named-checkzone
# ln -s /usr/local/sbin/named-checkzone /usr/sbin/named-compilezone
named-compilezoneのリンク先がnamed-checkzoneとなっているのはタイプミスではありません。/usr/local/sbin/named-compilezone自体が、/usr/local/sbin/named-checkzoneへのシンボリックリンクなのです。
ユーティリティプログラムの使用方法については追って、別な回で解説します。
次はいよいよ設定作業
次回は、named.confやzoneファイルの設定を解説します。