GnuDIPでDynamicDNSサービスを作ってみる

NetBSD/i386 6.1はDynamic DNSに対応したBIND 9.9.2-P1が含まれているので、パッケージでApache 2.4.4とPerl 5.16.2をインストールして、GnuDIP 2.3.5でDynsmicDNSサービスを作ってみた。

ダウンロードとインストール

まずはGnuDIP公式サイトから、GnuDIP 2.3.x Web Page→gnudip-www/→current release/download→src/の順にリンクを辿って現時点の最新版であるgnudip-2.3.5.tar.gzをダウンロードして解凍し、含まれているgnudipディレクトリを/usr/localに配置する。(wgetNetBSD/i386 6.1に含まれていないのでパッケージでインストールした。また、NetBSD/i386 6.1はデフォルトで/usr/localが無いので予め作成しておく必要がある。)

wget http://gnudip2.sourceforge.net/gnudip-www/src/gnudip-2.3.5.tar.gz
tar zxf gnudip-2.3.5.tar.gz
mv gnudip-2.3.5/gnudip /usr/local

GnuDIPの設定

デフォルトではMySQLを使う設定になっているので、ファイルシステムを使ったフラットファイルデータベースを使うために設定ファイルのシンボリックリンクを変更する。

cd /usr/local/gnudip/lib
ln -sf dbprefs_flat.pm dbprefs.pm
ln -sf dbusers_flat.pm dbusers.pm

サンプルのキーファイルを削除して、dnssec-keygenでキーファイルを新規に作成する。
秘密鍵のKgnudip-key.+157+xxxxx.privateと公開鍵のKgnudip-key.+157+xxxxx.key(xxxxxはランダムな5桁の数字)の2つのファイルが作成される。

rm /usr/local/gnudip/etc/Kgnudip-key.*
dnssec-keygen -a HMAC-MD5 -b 512 -K /usr/local/gnudip/etc -r /dev/urandom -n HOST gnudip-key
chmod 400 /usr/local/gnudip/etc/Kgnudip-key.*

GnuDIPの設定ファイル /usr/local/gnudip/etc/gnudip.conf にはサンプルのファイル名が記されているので、これを先ほど作った秘密鍵のファイル名に書き換える。

nsupdate = -k /usr/local/gnudip/etc/Kgnudip-key.+157+36000.private

.htaccessの内容がGnuDIPのドキュメントにあるhttpd.confの変更と同じ内容でApache 2.4では上手く動作しないので削除する(あとでhttpd.confは適切に変更する)。また、ヘッダのファイル名が httpd-autoindex.conf の定義と違うので、正しく認識される大文字のファイル名に変更する。

rm /usr/local/gnudip/html/.htaccess
mv /usr/local/gnudip/html/header.html /usr/local/gnudip/html/HEADER.html

/usr/local/gnudip/cgi-binにあるcgiファイルと、/usr/local/gnudip/sbinにあるplファイルに記されたPerlのパス(/usr/bin/perl)はパッケージで追加したもの(/usr/pkg/bin/perl)と異なるので書き換える。
1つ1つ書き換えるのは面倒なので、今回は下記のようにして一括で書き換えた。

for x in /usr/local/gnudip/cgi-bin/*.cgi; do cp $x $x.bak; done
for x in /usr/local/gnudip/cgi-bin/*.cgi; do sed -e '1s:#!/usr/bin/perl:#!/usr/pkg/bin/perl:' $x.bak > $x; done
for x in /usr/local/gnudip/cgi-bin/*.cgi.bak; do rm $x; done
for x in /usr/local/gnudip/sbin/*.pl; do cp $x $x.bak; done
for x in /usr/local/gnudip/sbin/*.pl; do sed -e '1s:#!/usr/bin/perl:#!/usr/pkg/bin/perl:' $x.bak > $x; done
for x in /usr/local/gnudip/sbin/*.pl.bak; do rm $x; done

管理者を設定するために /usr/local/gnudip/sbin ディレクトリにあるgdipadmin.pl に管理者のユーザー名とパスワードを任意に入力して実行する。
今回は管理者のユーザー名にadminを入力した。

/usr/local/gnudip/sbin/gdipadmin.pl ユーザー名 パスワード

データベースが作られる /usr/local/gnudip/run の下と、キーファイルや設定ファイルのある /usr/local/gnudip/etc の下を、Apacheから参照できるように所有者を変更する。

chown -R www:www /usr/local/gnudip/run/*
chown -R www:www /usr/local/gnudip/etc/*

BINDの設定

dnssec-keygenで作成した秘密鍵のファイル内容を表示して「Key :」に続く共有秘密鍵の文字列を確認する。

cat /usr/local/gnudip/etc/Kgnudip-key.*.private

BINDの設定ファイル /etc/named.conf に共有秘密鍵を書くことになるので、他人が見れないようにパーミッションを変更しておく。

chmod 600 /etc/named.conf

既にBINDでDynamic DNSサービスで使用するつもりのドメインが設定されて動作しているものとする。ゾーンファイルは特に手を加える必要は無い。
BINDの設定ファイル /etc/named.conf に Keyステートメントでdnssec-keygenで作成する際に指定したキー名と、secretで共有秘密鍵を定義して、Dynamic DNSサービスで使用するドメインのゾーンファイル定義にupdate-policyでDynamic DNSサービスで使用されたくないホスト名をキー名と共にdenyで設定した後、Dynamic DNSサービスで使うドメイン名をキー名と共にgrantで設定する。

(前略)
key "gnudip-key" {
        algorithm hmac-md5;
        secret " fegHlhVt3op(中略)PIiK8V4cjLw==";
};

zone "example.jp" {
        type master;
        file "example.jp";
        update-policy {
                deny gnudip-key name ns.example.jp.;
                deny gnudip-key name www.example.jp.;
                deny gnudip-key name ftp.example.jp.;
                deny gnudip-key name mail.example.jp.;
                grant gnudip-key subdomain example.jp.;
        };
};

「rndc reload」または「/etc/rc.d/named restart」でBINDの設定ファイルを読み込み直す。

Apacheの設定

既にApacheがインストールされて動作しているものとする。
Apacheの設定ファイル /usr/pkg/etc/httpd/httpd.conf でCGIを有効にして、GnuDIPの各ディレクトリを認識するように設定を追加/変更する。(GnuDIPのドキュメントにある設定だとApache 2.4では上手く動作しなかった。)

LoadModule cgid_module lib/httpd/mod_cgid.so
(中略)
<IfModule alias_module>
(中略)
    Alias /gnudip/html /usr/local/gnudip/html
    ScriptAlias /gnudip/cgi-bin/ "/usr/local/gnudip/cgi-bin/"
</IfModule>
<Directory "/usr/local/gnudip/html">
    Options Indexes FollowSymLinks
    Require all granted
</Directory>
<Directory "/usr/local/gnudip/cgi-bin">
    Options ExecCGI
    Require all granted
</Directory>
(中略)
<IfModule mime_module>
(中略)
    AddHandler cgi-script .cgi
</IfModule>
(中略)
Include etc/httpd/httpd-autoindex.conf

Apacheがパッケージで追加したPerlを見つけられるように /etc/rc.conf にパス設定を追加する。

export PATH=$PATH:/usr/pkg/sbin:/usr/pkg/bin:/usr/local/sbin:/usr/local/bin

「apachectl restart」または「/etc/rc.d/apache restart」でApacheの設定ファイルを読み込み直す。

初回設定

Webブラウザで http://www.example.jp/gnudip/cgi-bin/gnudip.cgi を開いて、作成した管理者のユーザー名とパスワードでログインする。
基本的に元のメニューに戻るにはブラウザの戻るボタンを使うことになり、ログアウトに相当する操作は存在しないので適当にブラウザを閉じる。
Add DomainのGoで、Domain NameにDynamic DNSサービスで使うドメイン名を入力、Allow Password ChangesとSelf Registrationにチェックを入れてAdd Domainした後、ブラウザの戻るボタンを2回押して元のメニューに戻る。
あとはAdministrative SettingsのGoで、Allow self registrationにチェックを入れて管理者以外でもログイン画面から新規ユーザー登録が出来るようにし、Require and validate E-mail addressesのチェックをはずして新規ユーザー登録の際にメールアドレスの入力を不要にして、Save Settingsで保存する。
以後はログイン画面にSelf Registerボタンが表示されるので、これで新規ユーザー登録を誰もが行える。
尚、Administrative Settings(管理設定)のCheck for robot before sending E-mail(メールを送信する前に画像認証が必要)は、認証用の画像をImageMagickに含まれるconvertコマンドでhelveticaフォントから作成しているので、これらのパッケージを導入して動作する状態になっている必要がある。

日本語化

/usr/local/gnudip/lib/htmlgen.pm の charset=iso-8859-1 とある箇所を charset=UTF-8 に書き換えて、他の英語メッセージ部分をUTF-8の日本語で書き換える。画像認証のメッセージは /usr/local/gnudip/lib/gdipmailchk.pm にあるので、こちらも書き換える。Helpは /usr/local/gnudip/html 以下と /usr/local/gnudip/client 以下のhtmlファイルを書き換えることになる。

クライアント

GnuDIP純正クライアントもあるが、DiCEも使える。
プラグインは同じGnuDIPを使っているdynDNS.it.plgあたりを元にして、[ServiceInfo]のNameとURL、[Updater]のScriptのホスト名部分、[Domains]のドメイン名を書き換える。文字コードは日本語EUC、改行コードはLFが使われていることに注意。