認証機構

ntpd の認証機構は、対称鍵認証 (Symmetric Key Cryptography) と、公開鍵認証(非対称鍵認証) (Public Key Cryptography) とがある。

対称鍵方式は、通信ピア双方があらかじめ同じキーを用意しておく方法。キーは、合い言葉つまりパスワードであり、且つ、交わされる NTP メッセージの捏造を検査するためのチェックサムの生成にも使用される。対称鍵方式では通信の暗号化は行われない。この方式はシンメトリックピアどうしの認証に使用することができる。また、ntpq, ntpdc ユーティリティの認証は、こちらの方法だけをサポートしている。Red Hat系のディストリビューションでは、ntp パッケージをインストールすると既定でひとつだけキーの書かれた対称鍵ファイルが置かれるが、安全性を高めるため、対称鍵ファイルはきちんと生成しなおしておいたほうがいい(特に使うあてがなくても)。

公開称鍵認証では、秘密鍵と公開鍵のペアをピアそれぞれが持ち、認証だけでなく通信の暗号化も行われる、安全な方法だ。ただし、ntpd の公開鍵認証は autokey とかという特殊なもので、トライしてはみたがうまく機能させることができなかった。うまくいくまでこちらの解説はお預けだ。

いずれの方式も、キーは ntpd 付属の ntp-keygen プログラムを使って生成することになる。

対称鍵方式 (Symmetric Key Cryptography)

ntp-keygenユーティリティ

ntp-keygenntpd のためのキーファイル操作ユーティリティ。同ユーティリティの名前は NTP パッケージ Ver.4.1.x で一度 ntp-genkeys となったが、 4.2.x で再び ntp-keygen に戻った。しかし、4.0.x の頃の ntp-keygen とは仕様がかなり異なり、コマンドラインオプションもがらりと変化しているので、最新の情報は man や ntp-genkeys - generate public and private keys で確認したほうがいいだろう。このプログラムが動作するためにはシステムに OpenSSL がインストールされていることが必要だが、日本で入手可能な Linux ディストリビューションで、OpenSSL がインストールされていないないものはまずありえないだろう。

ここでは、対称鍵の作成に的を絞って説明する。

ntp-keygen のヘルプで表示される主なコマンドラインオプション (ntpd 4.2.x)
-c enc_type RSA-MD5, RSA-SHA1, DSA-SHA1 などを指定。keys の生成では使わない
-d デバグメッセージを出力
-M これが今回の本命。 MD5 の対称鍵ファイルを生成する
-p pwd ホストキーなどを暗号化する。その時のハッシュパスワード。暗号化した場合には、/etc/ntp/crypto/pw ファイルに `crypto pw pwd ' を書いておく必要がある
-q pwd ホストキーなどが暗号化してある場合に、それを読み取るためのパスワードを指定する
ntp-genkeys の場合 (ntpd 4.1.x)
-c conf_file ntp.conf ファイルのパスを指定。通常は指定の必要なし
-d デバグメッセージを出力
-g [d][m][r] 引数 d を指定すると Diffie-Hellman パラメータファイル ntp_dh を作成。
m は MD5 キーファイル ntp.keys.num を作成。
r は RSA のプライベートキーファイル ntpkey と パブリックキーファイル ntp_host を作成する。
rsaref20 がコンパイルされていない場合 dr は無意味で、m は指定しなくてもキーファイルは MD5 で作られるので、結局このオプションは不必要
-k k_file 吐き出すキーファイルのパスや名称を指定。デフォルトは ntp.keys.num となる。num は勝手に付く10ケタのタイムスタンプ
-l ntp-genkeys は、特に何も指定しない通常動作では、ntp.keys.num と、それを指すシンボリックリンク ntp.keys を自動的に作る。しかし -l オプションを付けるとシンボリックリンクは作られない
-t 上記で説明した通常動作の際に、既存の古いキーファイルやリンクを削除する
-h "here" の意。今いるディレクトリにキーファイルを吐き出す。シンボリックリンクは作られない
-n テストモード。実際にファイルは作らず、何が行われるかのメッセージだけを stdout に出力

ところが、実際は、ほとんどのオプションがうまく働かない。以下に、最も確実な方法を示す。

  1. root でログインするか、su - (単なる "su" ではなく必ず ログインシェルを移る "su -" )
  2. キーを保存するディレクトリに移動:
    cd /etc/ntp (通常)
    cd /etc/ntp/crypto (NTP 4.2.4 且つキーを暗号化する場合)
  3. 古いキーファイルとシンボリックリンクがあれば削除 (または別ディレクトリに一旦避難させる):
    rm keys ntpkeys_* ntp.keys*
  4. 対称鍵ファイルを生成する:
    ntp-keygen -M (NTP 4.2.x で、キーを暗号化しない場合)
    ntp-keyten -M -p passwd -q passwd (NTP 4.2.x で、且つホスト秘密鍵を暗号化する場合)

    この時 "RAND_load_file /root/.rnd not found or empty" というエラーが出てキーが作れないことがる。これは OpenSSL が吐いているエラーで、その場合は root のホームディレクトリにランダムシードファイル .rnd を作っておく必要がある。 .rnd を作るには、例えば:
    dd if=/dev/urandom of=/root/.rnd bs=1024 count=1
    または、他の場所にある既存のランダムシードファイルを使うなら、 OpenSSL に環境変数 RANDFILE でその在処を伝えるてやる手もある。下記のようにすれば、環境変数でパスを与えて ntp-keygen が実行できる:
    env RANDFILE=/path/to/random_seed_file ntp-keygen -M

    以下のファイルやシンボリックリンクができる(RHEL/CentOS 4/5)
    ファイル名 説明 推奨属性
    ntpkey_RSAkey_hostname.timestamp ホスト秘密鍵ファイル root:root 600
    ntpkey_host_hostname ホスト秘密鍵ファイルへのシンボリックリンク  
    ntpkey_RSA-MD5cert_hostname.timestamp ホスト公開鍵(MD5ダイジェスト)ファイル。今回は使用しない root:root 644
    ntpkey_cert_hostname ホスト公開鍵へのシンボリックリンク。今回は使用しない  
    ntpkey_MD5key_hostname.timestamp 対称鍵ファイル root:root 600
    ntpkey_MD5_hostname 対称鍵ファイルへのシンボリックリンク  
    RHEL/CentOS 6/7
    ファイル名 説明 推奨属性
    ntpkey_MD5key_hostname.timestamp 対称鍵ファイル root:root 600
    ntpkey_md5_hostname 対称鍵ファイルへのシンボリックリンク  
  5. セキュリティをより高めるなら、実ファイルのパーミッションを上の表の通りに変更する。
  6. 対称鍵ファイルへのシンボリックリンクファイル ntpkey_MD5_hostname へのシンボリックリンク /etc/ntp/keys (または ntp.keys) を作る。()

※ 4.2.x より前の特定のバージョンの NTP パッケージで、ntp.keys.num がルートディレクトリにできてまうことがあった。しかも、 シンボリックリンク /etc/ntp/ntp.keys のリンク先は相対指定で "ntp.keys.num" となっているという破滅的状態。その場合は、ntp.keys.num/etc/ntp に移動:
mv /ntp.keys.* ./

ntpkey_MD5key_hostname.timestamp ファイルはこういった内容になっている:

※ キー文字列の文字数やデフォルトで生成されるキーの個数は NTP スィートのバージョンによって何度か変わってきている。いちいち追従してドキュメントするのも疲れるので、テキトーに読み替えていただきたい。

# ntpkey_MD5key_hoge.cxm.3299580246
# Mon Dec 24 02:31:11 2012
 1 MD5  E}_QO~<(wV"<w_U	# MD5 key
 2 MD5  AD2SY"%?SaKF6!]	# MD5 key
 3 MD5  /;QyS=2Pr/ku?W8	# MD5 key
 4 MD5  ~t)d@nJ>fdI\@DB	# MD5 key
 5 MD5  WB2{RU/6qT3ww~x	# MD5 key
 6 MD5  Q!7(&5[5ooTv)qY	# MD5 key
 7 MD5  ]j~]sZRFnYp>'rv	# MD5 key
 8 MD5  ~suDb8-)}]e:<M5	# MD5 key
 9 MD5  n%6"o^vOy"eq'QX	# MD5 key
10 MD5  e5rUiB8eny~djzF	# MD5 key
11 MD5  CAVLiS4Vi@5N"F$	# MD5 key
12 MD5  w4IkEk]*Lu+C@{J	# MD5 key
13 MD5  O$V}L+2v@Pt&XjL	# MD5 key
14 MD5  `U0TK;c:2Z[>_{7	# MD5 key
15 MD5  =!RjkWsgtR;]??^	# MD5 key
16 MD5  G4HwD[rK,0.U@3I	# MD5 key

1 から 16 の数字で始まる行それぞれがキーで、16 個のキーができている。各行のフォーマットは:

KEYID TYPE KEY_STRING # COMMENT

KEYID は 32 bit で管理されており、1 ~ 65534 まで数字。TYPE の部分の MD5 (古いNTPでは M) は、キー文字列が MD5 ハッシュであることを示すキーワード。それに続くランダムな文字列が、キーそのものだ。MD5 の場合、16文字以内と決められており、デフォルトでは 15文字から成るキーが生成される (以前は 16文字だった)。

ピア認証を使う予定がなく、なお且つ、ntpqntpdc ツールをローカルでもリモートでもまったく使うつもりがないか使うとしてもステータスの確認だけの場合は、ここまででやっておけばいい。

対称鍵をntpqやntpdcに利用する場合

ntpqntpdc の認証に使う場合、認証の際にキーを人間が打ち込む必要があるので、デフォルトで生成されるランダムな文字列のままでは扱いにくい。そのため、対称鍵ファイルを編集し、いずれかのキーを書き換えるか、末尾に新たなキーを加えてやる必要がある。下記のような塩梅だ:

998 MD5  PaSSwOrd

ここではキーIDを 998 としたが、 ファイル内で重複しない 65534 までの数字であれば何でもいい。キー文字列のタイプは、ntpqntpdc が要求してくるのは必ず MD5 であることから、必ず MD5 (古~い ntpd では M) を指定。かつて、キー文字列が 16文字に満たない場合には右側を 0 で埋めて16文字きっかりにする必要があったが、最近の ntp ではツールどうしが裏で自動的にゼロパディングして遣り取りしているらしく、その必要はなくなった。なお、ntpqntpdc の場合、実際の認証時にはコンソール上でキーIDとパスワードを直接タイプすることとなり、それがサーバ上でキーファイルと比較されるだけなので、操作端末にこのファイルをコピーしておく必要はない。

それに加えて、前出 ntp.conf の最後の 3行のコメント記号 (#) を外して下記の設定を生かす。

trustedkey 1 998
requestkey 998
controlkey 998

trustedkey ステートメントで ID 1 のキーも含めているが、複数指定できるということを示すために書いてみただけで、特に必要というわけではない。また、ここでは ntpdc 用キーの指定である requestkey と、 ntpq 用キーの指定である controlkey に同一のキーID を指定しているが、別々にすることも可能だ。

感覚的には ntpq が reQuest、ntpdc が Controlkey に対応するのが自然なのだが、実際は逆なので注意。

ntpqntpdc で設定に影響を及ぼす操作を行うには、ツール起動側のアドレスに対するサーバのアクセス制限 (restrict) は開放しておかなくてはならない。たいていはループバックアドレスと自分の実アドレスには規制を掛けないのが通例なので、ローカル上でツールを起動して自機の ntpd を操作するなら邪魔はされない (キーとパスワードの入力は必要)。しかし、リモートから行う場合には、ntp.conf のアクセス規制セクションに注意が必要だ。例えば、リモートコンソールとして使うマシンのアドレスが 192.168.0.200 だとしよう。例の ntp.conf では、このアドレスは 192.168.0.0 mask 255.255.255.0 に内包され、その restrict には noquery が含まれているので、設定変更どころか、これらツールの使用するモード 6 およびモード 7 の問い合わせそのものを完全に無視してしまう。設定やステータスを変更するような操作を行いたい場合は:

restrict 192.168.0.200

を書き加えればいい。設定内容や状態を見るだけだとしても、例えば、

restrict 192.168.0.200 nomodify

のように、noquery は書いてはいけない。

シンメトリックピアどうしの認証に使う場合

こちらの用途に使うためには、NTP通信をするピア双方の対称鍵ファイルには、同じキーID に同じキーフレーズが書かれていなければならない。ファイルを丸ごとコピーしてもいいのだが、使用するキー (つまり行) だけコピーしておいたほうが、セキュリティ的にはより安全だろう。ピア認証では、キーフレーズの遣り取りは ntpd が自動的に行うので、ntpdc/ntpq 用の時のように人間の覚えやすい文字列に変える必要はない。

ntp.conf は、修正ポイントが 2箇所ある。まず、ピア認証に使うキーのキーID を trustedkey に加えておくこと。ntpq/ntpdc でのランタイム変更機能を使わないのであれば requestkeycontrolkey はコメントアウトして構わない。下記は、ピア認証にはキーID 8番のキーを使い、ntpqntpdc も使う場合の記載例:

trustedkey 8 998
requestkey 998
controlkey 998

ntp.conf のもう 1点の変更は、シンメトリックピアを指定した peer 行への `key 8' パラメータの追加だが、詳しくは peerディレクティブ の項を参照されたし。

ntpd の起動

これにて準備は整ったので ntpd デーモンを起動する。`/etc/init.d/ntpd start' でも `service ntpd start' でもお好きなように。起動してすぐにクロックが合うわけではなく、ntpd はまず、指定したタイムサーバのうちどれが信頼に値するかを数分掛けて比較検討し、それから徐々に、ローカルのクロックをタイムサーバの正しい時間に近づけていく。

うまく起動せず、ntpd がすぐに exit してしまう場合は、カーネルクロックが 1000 秒以上狂っていることが原因かもしれない。その場合は:

root# ntpdate -b -v server
root# hwclock --systohc

で、一旦、参照予定のタイムサーバにカーネルクロックを強制的に合わせ(※)、ハードウェアクロックもカーネルクロックの時間にシンクロさせておく。それから改めて ntpd を起動すれば、今度はうまくいくはずだ。きちんと作動しているかどうかは、数分後に ntpq ユーティリティを使えば分かる。 ntpdate については、捕捉程度だが別項にまとめた。

※ RedHat系の NTPパッケージに含まれる rcスクリプトでは、 /etc/ntp/step-tickers というファイルに参照先 NTPサーバを書いておくと、 ntpd を起動させる直前でそのアドレスを参照して ntpdate による一次時間合わせを行う仕掛けになっている。また、 step-tickers が空でも、 /etc/sysconfig/ntpOPTIONS 変数に -x が含まれていれば、 rcスクリプトは ntpd 主設定ファイル (ntp.conf) から peer または server 行を探してアドレスを拾い、やはり ntpdate を実行しようとする (なお且つ step-tickers にアドレスが書いてあれば「探す」手間が省ける)。つまり、どちらか (あるいは両方) やっておけば、マシンの時計が大きく狂っていたとしても ntpd はきちんと起動してくれる。

ntpdをchrootする

安全性をより高めるため、ntpdchroot 環境で動かすのもいい考えだ。これは Xen ホストOS上で時間合わせを行う時に思いついたことだ。

NTP 4.2 から (?) は ntpd-i オプションが使えるようになった。このオプションを `-i /dir/to/chroot' といった具合に付けると、ntpd は自らをそこへ jail して動く。もう数年前にリリースされた Fedora Core 5 でさえ NTP 4.2.0 が乗っていて、やってみると実際にこれが通用した。 -i オプションは -u オプションと併用しないと意味がない。root権限で動いているプログラムを chroot してもほとんど無意味だからだ。以下に、jail ディレクトリを /var/chroot/ntpd/ だとして構築法をまとめる。

ディレクトリ構造:
/var/chroot/ntpd/                        <- [root:root 755] chroot後の ntpd にとって / となる
              \_ etc/                    <- [root:root 755]
                   \_ ntp.conf           <- [root:root 644]
                      localtime          <- [/etc/localtime と同じ] `cp -p' でコピーしてくる
                      ntp/               <- [root:root 755]
                        \_ keys          <- ntpkey_MD5_HOSTNAME への symlink
                           ntpkey_MD5_HOSTNAME         <- 下記への symlink
                           ntpkey_MD5key_HOSTNAME.num  <- [root:root 600]
                        \_ crypto/       <- [root:ntp 750] ntpd-4.2.4の場合のみ
                             \_ pw       <- [ntp:ntp 600] ntpd-4.2.4の場合のみ
              \_ var/                    <- [root:root 755]
                   \_ lib/               <- [root:root 755]
                        \_ ntp/          <- [ntp:ntp 755]
                             \_ drift    <- 必要時に自動的に作られる
                   \_ run/               <- [root:root 755]
                        \_ ntpd.pid      <- 実際には作られない
              \_ dev/                    <- [root:root 755]
                   \_ log                <- syslogソケット
/etc/
   \_ ntp.conf                     <- /var/chroot/ntpd/etc/ntp.conf への symlink
      ntp/
        \_ keys                    <- /var/chroot/ntpd/etc/ntp/keys への symlink
           ntpkey_MD5_HOSTNAME     <- /var/chroot/ntpd/etc/ntp/ntpkey_MD5_HOSTNAME への symlink
           ntpkey_cert_HOSTNAME    <- 上同様
           ntpkey_host_HOSTNAME    <- 上同様
           step-tickers            <- jail へのコピー不要
        \_ crypto/                 <- [root:ntp 750] ntpd-4.2.4の場合のみ
                \_ pw              <- /var/chroot/ntpd/etc/ntp/crypto/pw への symlink (ntpd-4.2.4のみ)
/var/run/
       \_ ntpd.pid                 <- PIDファイルは実際にはこちらにできる

chroot階層構築のポイント;

何度もやっていたら面倒くさくなったので、ここでやるべきことをシェルスクリプトにしてみた -> ntpchroot.sh。ただし sysconfig/ntpd 及び syslog の設定まではカバーしていない。利用する前にファイル冒頭の設定変数を確認/変更するのを忘れずに。また、このスクリプトは /etc/ntp/(crypto/) 下のキーファイル類を一旦削除して jail 下に改めて生成し、強制的にリンクを張り戻すようになっているので、必要に応じてバックアップを採ってから行うこと。

付属ユーティリティの使い方

ntpq

ntpq は、NTP デーモン一般 (ntpd とは限らない) の稼働状態を確認するためのプログラム。通信には UDP プロトコルの NTP mode 6 パケットが使われる。

ntpq [host]

という風に起動すれば、対話モードの ntpq> プロンプト状態に入る。host は、IPアドレスでも、DNS名や /etc/hosts ファイルに書いてある名前でも構わない。host を指定すれば指定したリモートの NTP サーバへつなごうとするし、指定しない場合には、localhost つまり自分自身の中の NTP サーバに接続しようとする。プロンプトに入ってしまえば、help と打てば使用可能なコマンドの一覧、"? command " と打てばそのコマンドに関する簡略なヘルプが表示される。 ntpq の解説は ntpq - standard NTP query program で読める。

また、ntpq の起動時にしかるべきオプションを付けて、コマンドラインモード、つまりコマンドの終了とともに即 exit させることもできる。よく使うのは、稼働確認や、参照している NTP サーバのどれが優先参照先 (system peer) になっているかといった情報を得たい時だ;

ntpq -p

オプションを -pn に変えれば、サーバの名前が名前解決されず数字のままとなる。ちなみに、ntpq にはコマンドラインオプションのヘルプを出すためのオプションはないので、どんなオプションがあるかを知るには、存在しないオプション (-h-v) を付けてコールすればいい。 ntpq -p の出力は下記のようなものになる (いろいろな例を示すため、設定例の ntp.conf とは異なるコンフィグを使っている);

     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
+ntp2.jst.mfeed. mf-isdn4.mfeed.  2 u   15   64  377   23.887   -0.824   0.551
*orion.asahi-net p011.gate.atson  2 u   19   64  377   22.809   -0.672   0.757
 LOCAL(0)        LOCAL(0)        10 l   17   64  377    0.000    0.000   0.015
+ns.wakayama-u.a clock.nc.fukuok  2 u   20   64  377   48.459    2.210  44.989
xthink.itsc.cuhk bill.itsc.cuhk.  2 u   31   64  377  202.293   62.274   1.787
 time.nonex.net  0.0.0.0         16 u    -   64    0    0.000    0.000 4000.00 
出力の読み方:
列系統
remote 参照しているサーバの DNS 名。 -n オプションを付けたときはアドレス
refid 各タイムサーバが基準にしているさらにひとつ上位のサーバ名かアドレス。探知できない場合は 0.0.0.0
st ストレータム (stratum) つまり、そのタイムサーバの階級
t そのサーバとの通信タイプ。u = ユニキャスト, m = マルチキャスト, b = ブロードキャスト, l = ローカル
when 直近の通信が何秒前に行われたか
poll 現段階でのポールインターバル
reach Reachability。過去 8回のポーリングの成功/失敗履歴。1 Poll 毎に上位(左) へシフトする 8 bit長の 0(失敗)/1(成功) の並びを、8進数にして表している...これだけでは分かるまい。とても数行では説明できないので別項にて解説する
delay そのサーバとの通信に要する時間。ミリ秒単位
offset 現在のカーネルクロックとのずれ。ミリ秒単位
jitter 時間の刻みの揺らぎ。分散 (dispersion) と呼ばれることもある。ミリ秒単位。値が小さいほど、そのクロックは安定している
行の先頭に付く記号
* 優先参照先 (system peer) に選択されているタイムソース
+ system peer に昇格する可能性のある補欠ソース
- ntpdのクラスターアルゴリズムに基づいて落選となったソース
x クロックが不正確 (経路的要因を含む) なので無効とされたソース
# タイムソース候補数制限 (tosの項を参照) に基づいて除外されたソース
  行頭がスペースのものは、通信できないか、時間合わせにこのサーバ自体を使っている (ループ)、シンクロ先としては遠すぎる、のいずれかの理由で無効とされた (ただし、通信タイプが local であるものを除く)

通信できていない場合は、refid, reach など、ほとんどの列が 0 になっていて、 jitter4000.00 などになる。どれもこれもがそうなるのなら、ファイヤーウォールかルータで UDP 123 番ポートのパケットがブロックされているのかもしれない。また、いつまで経ってもどれにも * が付かないのも異常だ。

Reachabilityとは

reach の値は非常に意味が掴みづらく、筆者も長いこと鼻をつまんで見て見ぬ振りをしてきたのだが、LINUX JOURNALこの記事のおかげでやっとスッキリすることができた。この値は、単純に数字の大小で現れるいわゆる「成功率」ではない。表示上は 8進数なのだが、実は、過去 8回のポーリングの成功/失敗を示すビット循環式の「ログ」そのものなのだ。

前出の `ntpq -p' コマンド出力例に見られる 377 (8進) は 2進表記に戻すと 11111111 となる。"1" は成功、"0" は失敗を意味する。もし次のポーリングが何らかの理由で失敗したとすると、ログは、新幹線の車内にある電光ニュース掲示板のように、左に 1コマ押し出されて 11111110 になる。8進数に変換、つまり表示上では 376 だ。仮に、その後 8回ずっとポーリングが成功したとしよう。すると、循環式ビットログは下記のように推移することになる。

376    11111110
375    11111101
373    11111011
367    11110111
357    11101111
337    11011111
277    10111111
177    01111111
377    11111111

これを実地検証するために、`ntpq -pn' の出力から reach を分かりやすく表示する perl スクリプトを作ってみた。ntpd の動いているサーバ上で下記のスクリプトを root 権限で実行すると、下のような出力が得られる。遊んでいただきたい。

ntpqreach.pl

出力例:

     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*192.168.1.1     202.224.32.4     3 u   64   64   57    0.389    3.570   2.693
 reachability log: xxoxoooo (00101111)

ntpdc

ntpdc は、ntpd 専用のクエリツールで、ローカル及びリモートにある ntpd の状態の確認や設定変更ができる。通信には、UDP プロトコルの NTP mode 7 パケットが使われる。詳細は ntpdc - special NTP query programntpq 同様に;

ntpdc [host]

とだけすれば対話モードに入り、 ntpdc> のプロンプト表示になる。様々なステータスや変数を表示させることはもちろん、認証関係の設定も含め、ntpd のすべての設定項目がリアルタイムに変更できる。これは、生半可なことでは ntpd の再起動や停止ができない重要な位置を占めるタイムサーバで、緊急的な設定変更に迫られた場合に非常に便利だ。 ntpd を再起動すれば、システムピアが決定されるまでの数分間は、他ホストからのリクエストにも応えることができない。一方、ntpdc での書き換えはメモリ上の ntpd に対して直接行われるので、サービスが途絶えない (設定ファイルが書き換わるわけではない)。その反面、悪用されれば恐ろしいツールでもある。使えるコマンドは help で調べることができ、`? command ' のようにコマンドまで指定すれば当該コマンドの簡単な使い方が表示される。

また、しかるべきオプション付きでコールすると、コマンドラインモードで走ってすぐに終了する。コマンドラインオプションは:

-c command 対話モードで使用するコマンドを引数に付けて実行する
-i 強制的明示的に対話モードに入る
-l 参照先として認識しているタイムサーバをリストアップ
-p 参照先サーバのリストを各々の状態とともに表示。`ntpq -p' の出力とは少々異なる
-s 上記と同じだが、こちらのほうがやや `ntpq -p' に近い。`ntpdc -c dmpeers' と同義
-n ホスト名を DNS 名前解決しないで表示。-l, -p, -s と組み合わせて使用

設定に変更を加えるようなコマンドをそのセッションで初めて発行した際には、キーID とパスワードを求めるプロンプトが行われる。キーID には、サーバ側の ntp.confrequestkey キーワードで設定しておいたキーID を入力。パスワードプロンプトでは、サーバ側の keys ファイルの当該のキーID に書いておいたキーフレーズを入力する。昔の ntpパッケージでは、キーフレーズが 16文字に満たない時には後ろを 0 で埋めて 16文字きっかりにしないと通らなかったことを付け加えておく。

なお、ntpdc プログラムは、遠く (ネットワーク的に) 離れた ntpd サーバの保守には使えないようにできている。 ntpd が、リモートによるハッキングを困難にするために、パケットのタイムスタンプをチェックしているのだ。 ntpdc は、同一LAN内や、近くのネットワークセグメントでしか使えないと思ったほうがいい。

ntpdate

デーモンとしてではなく随時起動のプログラムとしてカーネルクロックを調整するユーティリティ。しかし困ったことに ディストリビューション添付の man ファイルのアップデートが間に合っていないようで、オプションなど詳しい使い方を知るにはオフィシャルサイトの WEB ドキュメントを読まなければならない。そのドキュメントによると、このプログラムは「じきに廃止されるだろう」と書いてあり、使用は、時間のズレが非常に大きくて (1000秒以上) ntpd が起動できない時か、Linux を Windows Server に対して時刻合わせしなければならない時くらいに限定した方がいいようだ。基本的なコマンドフォーマットは;

root# ntpdate [options] server [server ...]

重要: ntpdatentpd が稼働していると "NTP socket in use" というエラーを吐くばかりで動作を拒絶する。 ntpdate を使うには一旦 ntpd デーモンを終了しなければならない。

ntpdatentpd と同様に slew モードと step モード (ntpd 起動オプション-x オプション参照) を自動的に使い分ける。デフォルトでは、参照サーバとの時間のズレが +-128ms (?? 0.5秒という記述もありどちらか不明) 以内の場合は slew モードで働き、それ以上のズレがある場合には step モードで動作する。 ntpd を即時終了モード (-q オプション -- 次項参照) で使用した時との違いは、 ntpd がじっくりと腰を据えて参照先を選別してから exit するのに対し、 ntpdate は step モードにしろ slew モードにしろ複数の参照サーバを指定したにしろ (おそらく簡易的な選定アルゴリズムを使って) 即刻 exit するという点だ。オプションはかなりたくさんあるが、主なものだけを以下に列挙する。

ntpdateオプション

オプション 説明
-B 参照サーバとの時間のズレの大小にかかわらず常に slew モードで動作。 ntpd-x オプションに当たる
-b 参照サーバとの時間のズレの大小にかかわらず常に step モードで動作。 ntpd にはない機能
-d デバグモード。サーバ参照や様々な判断の過程を表示する。実際の時間合わせは行わない
-U user (U は大文字) 指定したユーザとして実行する
-v 冗長モード。よりたくさんのメッセージを表示する
-4 参照先サーバを IP でなくホスト名で書いた場合に、 IPv4 として解決を試みる。 IPv6 なら -6
-s STDOUT(標準出力) の出力を syslog へ送る。ファシリティやログレベルは不明だが、実験したところ messages に記録された

cronで実行する時の例

設定のいい加減なしかも管轄外の Windows 2003 Server の Windows Time を参照して時刻合わせをしなければならないなど悲しい事情のある場合には、`ntpd -q' をあきらめてこれをやらなければならない。少しでも美しく行うには、まず、下記のようなシェルスクリプトを用意する。仮にこのスクリプトを /etc/cron.misc/timecheck.sh としよう;

#!/bin/sh -
/usr/sbin/ntpdate -b -4 -s -U ntp server &>/dev/null || :

このように -s で時刻合わせ記録を syslog へ送り、その代わりこのスクリプトはいかなるメッセージも奈落 (/dev/null) へ送り、なお且つ、エラーが起きても常に TRUE で exit する (エラー発生時の crond から root へ宛てた告知メールを抑止するため)。参照先サーバをホスト名で書く場合は、最近の Linux ディストリビューションは IPv6 が有効になっているが実際には IPv4 しか利用していない場合が多いので、無駄な DNSクエリをなくすために -4 を指定した方がいい。もちろん timecheck.sh には実行ビットを立てておく (755など)。これをドライブする crontab エントリは下のような塩梅。 0:31, 2:31, 4:31 ... という具合に 2時間毎に実行されるよう /etc/crontab ファイルに定義を書く場合の例を挙げる;

 31 */2 * * * root /etc/cron.misc/timecheck.sh

仕上げに `service crond reload' して完了。