2007/02/14

NTP認証: ユニキャスト・共通鍵認証篇

NTP認証シリーズの第一回。ユニキャスト(unicast)で設定したサーバ=クライアント間で、共通鍵(symmetric key: 共有鍵・対称鍵)を使って認証を行う場合について。「認証を行わないユニキャストによる時刻同期ができている」という前提に、共通鍵認証だけを加える。

サーバ側
まず、共通鍵認証を行うためには当然、共通鍵を作る必要がある。これは、手作業で行うこともできるが、自動的に生成させるのが簡単だ。FC5ではntpdのバージョンは、4.2なので、ntp-keygenというコマンドが入っているはずだ。このコマンドは基本的に、公開鍵認証を行うための秘密鍵と証明書を生成するためのものだが、-Mオプションをつけて実行すると、16個の共通鍵が自動的に生成される。鍵や証明書は、/etc/ntpに生成されるので、rootで作業する必要がある。
# ntp-keygen -M
# cd /etc/ntp
# ls
keys
ntpkey_cert_ntpserver.localnet
ntpkey_host_ntpserver.localnet
ntpkey_MD5key_ntpserver.localnet.3533248690
ntpkey_MD5_ntpserver.localnet
ntpkey_RSAkey_ntpserver.localnet.3533248690
ntpkey_RSA-MD5cert_ntpserver.localnet.3533248690
ntpservers
step-tickers
このntpkey_*が新たに生成されたもの。ファイルスタンプを時刻を表す整数として、ntpkey_*_ホスト名.ファイルスタンプの形式になっているものが実ファイル。そうでないものは、それらに対するシンボリックリンクだ。これらのファイルは、所有者rootで、パーミッションを600にしておいた方が無難だ。
# chown root.root ntpkey_*
# chmod 600 ntpkey_*
この内、共通鍵認証に使うの共通鍵ファイルは、ntpkey_MD5key_*。既存の共通鍵ファイルを退避し、代わりにこのファイルに対するシンボリックリンクを作成する。
# mv keys keys.org
# ln -s ntpkey_MD5_ntpserver.localnet keys
以上で共通鍵の生成は終了だ。なお、この共通鍵ファイルの中身は、次のようになっているはずだ。
# ntpkey_MD5key_ntpserver.localnet.3533248690
# Mon Feb 12 11:04:55 2007
1 MD5  Vbevc\~F{3Yg(p6 # MD5 key
2 MD5  dPw#mEg+9=yc5Y] # MD5 key
<<略>>
10 MD5  ;XlkqE~Q2Uc#*&2 # MD5 key
<<略>>
15 MD5  lF943;ZrNNVHqYw # MD5 key
16 MD5  XKw$i#m%.TQ]lD" # MD5 key
#」から行末までは、お馴染みの通り無視されるつまり、コメント。各行は、空白区切りのカラムから成っている。第一カラムは、鍵識別子(key identifier)。1から65,535までの整数を指定する。第二カラムは、鍵形式(key format)。現在のバージョンでは、MD5だけが許されている。第三カラムは、鍵そのもの。16文字以下の印刷可能文字列を指定する。この文字列には、空白および「#」を含めてはいけない。

次に、/etc/ntp.confの変更。FC5では、共通鍵ファイルを指定するkeysコマンドは既に記述されているはず。それに加えて以下の太字の部分を追加する。
keys /etc/ntp/keys
trustedkey 10
ここで、trustedkeyコマンドに続けた引数10は、keysコマンドで指定した共通鍵ファイル中の鍵識別子。ここで指定した鍵識別子で指定した鍵のみが時刻同期時の認証で有効。鍵を複数指定する場合は、鍵識別子を空白で区切って並べる。設定変更を終えたら、ntpdを再起動する。
# service ntpd restart


なお、コマンドntp-keygenを実行した際に、「RAND_load_file /root/.rnd not found or empty」といったようなメッセージが出力され、鍵を生成できない場合がある。これは、メッセージの通り、/root/.rndを以下のように生成すればよい。
# dd if=/dev/urandom of=/root/.rnd bs=1024 count=1
1+0 records in
1+0 records out
1024 bytes (1.0 kB) copied, 0.240445 seconds, 4.3 kB/s
#


クライアント側
まず、共通鍵ファイル/etc/ntp/keysを準備する。鍵は、サーバと同じのものを準備する必要がある。上のサーバの例では、鍵識別子10の鍵だけが有効になっているので、クライアント側の共通鍵ファイルには、少なくともこの鍵をコピーしておく必要がある。逆に言えば、他の鍵はコピーしておく必要はない。むしろ、セキュリティの観点から言えば、コピーしない方がいいだろう。共通鍵ファイルの内容は、以下の通り。
10 MD5  ;XlkqE~Q2Uc#*&2 # MD5 key
このファイルは、所有者をrootにして、パーミッションを600にしておく。
# cd /etc/ntp
# chown root.root keys
# chmod 600 keys


次に、/etc/ntp.confを変更する。クライアント・サーバで鍵識別子10を使用するとしよう。認証なしでサーバと時刻同期が取れているなら、serverコマンドのオプションとして、key 10を付ける。また、trustedkeyコマンドにやはり鍵識別子10を指定する。
server 192.168.55.133 key 10
keys /etc/ntp/keys
trustedkey 10

設定変更を終えたら、ntpdを再起動する。
# service ntpd restart


確認
クライアント側でntpqを起動し、peerコマンドを使って確認すればよい。ただし、時刻同期は即時に行われるとは限らない。以下の実行例は、ntpdを再起動してしばらくたった後のものであることに注意して欲しい。

正常に動作している場合は、次のようになるはずだ。
# ntpq
ntpq> peer
remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*ntpserver.local 209.132.176.4    2 u  531 1024  377   10.367    3.617   4.396
LOCAL(0)        LOCAL(0)        10 l    5   64  377    0.000    0.000   0.001
ntpq>
もし、クライアント側でtrustkeyコマンドを追加していないか、鍵識別子を間違っているなどの問題があった場合は、次のような表示になる。
ntpq> peer
remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
ntpserver.local .NKEY.          16 u    -   64    0    0.000    0.000 4000.00
LOCAL(0)        LOCAL(0)        10 l    2   64    1    0.000    0.000   0.001
ntpq>
上の実行例で、refid.NKEY.になっていることに注目して欲しい。この場合、syslogには、次のようなメッセージが記録されているはずだ。
Feb 14 17:28:43 ntpclient ntpd[16217]: transmit: key 10 not found for 192.168.55.133


一方、サーバとクライアントの鍵識別子の指定が違っている場合、例えば、サーバ側では鍵識別子11を、クライアント側では鍵識別子10を指定しているような場合は、
ntpq> peer
remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
ntpserver.local .INIT.          16 u    -   64    0    0.000    0.000 4000.00
*LOCAL(0)        LOCAL(0)        10 l   59   64   37    0.000    0.000   0.001
ntpq>
のように、refid.INIT.、stratumが最大値の16になる。

第一回:『NTP認証: ユニキャスト・共通鍵認証篇
第二回:『NTP認証: ブロードキャスト・共通鍵認証篇
第三回:『NTP認証: ntp-keygenコマンドとX.509証明書
第四回:『NTP認証: ユニキャスト・公開鍵認証篇
第五回:『NTP認証: マルチキャスト・共通鍵認証篇

0 件のコメント: