Windowsの時刻同期サービス解説の最終回。UNIXベースのNTPサーバと連携する方法やシステム内で独立したNTP階層を作成する方法についてまとめる。
本連載では、Windows XPやWindows 2000 Server/Windows Server 2003における時刻同期サービスについて解説しています。Windows Vista、Windows 7、Windows Server 2008/R2を対象とした時刻同期サービスについては、以下の改訂版記事を参照してください。
・連載「Windowsネットワーク時刻同期の基礎とノウハウ(改訂版)」(2012年版)
NTPプロトコルはWindows OSのみならず、UNIX(Linux)システムにも当然取り入れられており、本来はUNIXシステム上で運用されてきた経緯がある。よってUNIXベースで稼働するNTPサーバ・デーモンとWindows Timeサービスを組み合わせて時刻同期を行わせたいシステム管理者も少なくないだろう。
第1回と第2回では、Windows環境における時刻同期サービス(Windows Timeサービス)について解説してきた。最終回となる今回は、UNIX(Linux)ベースのNTPサーバとWindows Timeサービスの間で時刻同期を行わせる方法や注意点、またシステム内で独立したNTP階層を作成する方法などについてまとめておく。ただし、筆者の手元には、いわゆる商用UNIX環境がないので、今回はRedHat系Linuxに実装されたNTPアプリケーションを利用した。実際はほかの商用UNIXを利用するケースも往々にあるだろうが、必要に応じて読み替えていただければ幸いである。
例えば、業務システム内に時刻同期環境を導入する場合、組織内に基準となるNTPサーバを設置し、組織内の各コンピュータはそのNTPサーバから時刻同期を行うようにする方法はよく取られる手法である。通常は、基準となるNTPサーバにはLinux(以下、特に断らない限りUNIXも含む)に含まれるntpd(古いバージョンではxntpdと呼ばれていた)、いわゆるNTPデーモン・プログラムが利用されることが一般的だが、Windows Timeサービスを利用して設置することも不可能ではない。どちらを利用するにしても、システム要件によって2つのパターンがあるだろう。
この方法の場合、外部の信頼あるNTPサーバから時刻同期を行ったコンピュータをシステム内の基準NTPサーバとして、これに対して時刻同期するよう、各コンピュータを設定すればよい。小規模なシステムであれば1つの基準NTPサーバでリソースは十分である(NTPプロトコルのパケットサイズは90bytes程度である)と考えられるが、フォールト・トレラント(耐障害性)を考える場合は、同じ設定(同じ外部参照先から同期する)のNTPサーバをもう1台加えればいいだろう。
2台の基準NTPサーバを設置した場合、両者が保持する時刻の整合性を考慮する必要があるが、上記では両方が同じ参照先NTPサーバから時刻同期を行っているので、事実上同じ時刻を保持していると考えられる。従って、互いを同期しあうような設定は特に必要ないと筆者は考えている。
この方法の場合、Windows Timeサービスまたはntpdの設定を「権威あるサーバ(基準時刻を自身が保持するサーバ)」として設定し、これに対して時刻同期を行うよう、各コンピュータを設定する。第1回で示したように、通常NTPサーバは(信頼に足る時刻を保持する)上位NTPサーバから時刻同期をすることで自身の整合性を保っているが、閉じたネットワークで外部NTPサーバから時刻同期を行わない場合、自身が持つローカル・クロックを標準時刻とする設定を行うことで、ほかのコンピュータが時刻同期を行うことが可能となる。
そのほかの注意点は1の方法と同様だが、フォールト・トレラントを考慮して複数台の基準NTPサーバを設置する場合、この方法では両者が保持する時刻の整合性を考慮する必要があるだろう。そのためには3台の基準NTPサーバを用意し、1台を最上位NTPサーバとして「権威あるサーバ」に設定し、残りの2台を最上位NTPサーバから時刻同期を行う基準NTPサーバとして設定し、各コンピュータはこの2台のNTPサーバから時刻同期する構成とするのがよいだろう。
いままでWindows Timeサーバについて述べてきたが、ここでLinuxの標準的なプログラムに含まれるntpd(NTPデーモン・プログラム)とWindows Timeサービスを時刻同期させるうえでの、考慮すべき点について述べる。
ntpdはNTPプロトコルの仕様に基づいて、ネットワーク上でほかのNTPサーバから、なるべく正確な時刻を選択同期することを念頭に置いた実装やチューニングが行われている。例えば、「ゆらぎ(分散)」という、ネットワーク上の各NTPサーバが統計学的にどの程度時刻が正確であるかを数値化する概念があるが、こういった数値を材料として、最終的に同期するNTPサーバが選択されるのがntpdである。
一方Windowsでは、Windows TimeサービスがKerberos認証の必要性から実装された背景から、Active Directory環境で最大限の機能を発揮するよう自動的にチューニングされるものと考えられ、外部の異種OS上のNTPサーバから時刻を同期するには、手動によるチューニングが別途必要な場合がある。
外部の標準時刻を取り込んで、その時刻をすべてのコンピュータに反映させるシステム構成を利用する場合、外部NTPサーバから時刻同期を継続的に行うNTPサーバを標準のNTPサーバとする必要がある。この場合は、まずは標準NTPサーバの役割を持たせるコンピュータが、外部のNTPサーバに時刻同期を行うように設定を行い、次にほかのコンピュータがその標準NTPサーバから時刻を同期するようにする。
標準NTPサーバを設定するには、WindowsでもLinuxでも通常のNTP設定方法で外部の参照先NTPサーバを指定すればよい。
WindowsのWindows Timeサービスを設定するには、NTPServerレジストリ値にて参照先サーバや同期方法を設定する。必要に応じて同期間隔なども設定すればよいだろう(詳細は第1回を参照)。
Linuxのntpdを設定するには、通常は/etc/ntp.confファイルをvi(Windowsのメモ帳に相当する、基本的なテキスト・エディタ)などで編集し、ntpdプログラムを再起動させることで反映させる。以下に設定例を示す。
# 明示的に許可を与えたコンピュータやネットワークに対してだけ同期できるよう初期化する
restrict default ignore
# 自分自身に対して無条件のアクセス許可を与える
restrict 127.0.0.1
# 自身のネットワークに属するほかのNTPサーバやクライアントが同期できるようアクセス許可を与える
restrict 192.168.0.0 mask 255.255.255.0 notrust nomodify noquery
# 外部の参照先NTPサーバから時刻を同期できるようアクセス許可を与える
restrict ntp1.jst.mfeed.ad.jp mask 255.255.255.255 nomodify notrap noquery
# 外部参照先NTPサーバを指定する
server ntp1.jst.mfeed.ad.jp
# ローカル・クロック時刻をほかのNTPサーバやクライアントにも提供できるようにする
server 127.127.1.0
fudge 127.127.1.0 stratum 10
# ドリフトファイルのパス(デフォルト設定のままとする)
driftfile /var/lib/ntp/drift
broadcastdelay 0.008
# 認証キーのパス(デフォルト設定のままとする)
keys /etc/ntp/keys
なおntp.confファイル内容の詳細な解説はここでは行わないので、必要に応じてインターネット検索などで確認してほしい。
インターネット環境から切り離されたシステムの場合、システム内に外部NTPサーバと同様に権威のあるNTPサーバを設定することで、標準時刻を保持するNTPサーバとして利用することができる。各NTPクライアントは、このサーバを参照先として、時刻同期を行うように設定すればよいだろう。
以下の方法で、コンピュータのローカル・クロック(Windows OS が、マザーボード上のリアルタイム・クロックなど、ハードウェアベースの時計機能から取得している時刻)を標準時刻とするNTPサーバを設定することが可能となっている。
Windows Timeサービスでは、いくつかの設定を行う必要がある。まず、下記AnnounceFlags値を設定することで、Windows Timeサービスが権威あるNTPサーバとして設定される。
項目 | 内容 |
---|---|
キー | HKEY_LOCAL_MACHINEのSYSTEM\CurrentControlSet\Services\W32Time\Config |
値の名前 | AnnounceFlags |
型 | DWORD |
値の内容 | 0x5 (初期値は0xa) |
Windows Timeサービスを権威あるNTPサーバにするための設定 |
またほかの参照先NTPサーバに時刻同期は行わないため、これに関する項目は空欄とする必要がある。なお、自分自身のIPアドレスは指定する必要はない。
項目 | 内容 |
---|---|
キー | HKEY_LOCAL_MACHINEのSYSTEM\CurrentControlSet\Services\W32Time\Parameters |
値の名前 | NTPServer |
型 | REG_SZ |
値の内容 | (空欄) |
ほかのNTPサーバとの同期をしないようにするための設定 |
また、自身のローカル・クロックについての分散の値(ゆらぎ値)を変更する必要がある。筆者が確認した限り(RedHat Fedra Core 4およびRedHat Linux 8.0を利用)では、下記の例以外の値では、ntpdは権威あるNTPサーバとして設定されたWindows Timeサービスから、時刻同期を行うことはなかった(ntpqコマンドで明示的に同期が行われているかどうか確認した)。これはntpdがStratum 1のNTPサーバに直接時刻同期を行うような場合、ローカル・クロックの分散の値がごく小さい場合以外、十分に精度のある時刻と見なさず、ポーリングを行っても実質同期しないためと考えられる。
項目 | 内容 |
---|---|
キー | HKEY_LOCAL_MACHINEのSYSTEM\CurrentControlSet\Services\W32Time\Config |
値の名前 | LocalClockDispersion |
型 | DWORD |
値の内容 | 0x0 (初期値は0xa) |
ローカル・クロックの分散値の設定 |
この設定を行い、Windows Timeサービスを再起動させれば設定が反映する。また再起動直後にほかのコンピュータから時刻同期を行うと同期できないことがあるが、これはNTPプロトコルの実装上、ローカル・クロックを権威ある時刻と認めるまでに若干時間を要するためなので、特に心配する必要はないだろう。
なお上記の設定に関しては、以下の資料を参照していただきたい。
ntpdを設定する場合、ntp.confファイル上で、自身をstratum 1(NTP階層の最上位)とすればいいだろう。例を以下に示しておく。
# 明示的に許可を与えたコンピュータやネットワークに対してだけ同期できるよう初期化する
restrict default ignore
# 自分自身に対して無条件のアクセス許可を与える
restrict 127.0.0.1
# 自身のネットワークに属するほかのNTPサーバやクライアントが同期できるようアクセス許可を与える
restrict 192.168.0.0 mask 255.255.255.0 notrust nomodify noquery
# ローカル・クロック時刻をほかのNTPサーバやクライアントにも提供できるようにする
server 127.127.1.0
fudge 127.127.1.0 stratum 1
# ドリフトファイルのパス(デフォルト設定のままとする)
driftfile /var/lib/ntp/drift
broadcastdelay 0.008
# 認証キーのパス (デフォルト設定のままとする)
keys /etc/ntp/keys
この設定は上記と同様ntpdの再起動で反映されるが、再起動後すぐには事実上反映されない。これは実装上、起動後すぐに自身のローカル・クロックへの同期結果が有効とならないためなので、若干の時間が経過すれば、問題はないはずだ。
なお、(通常われわれが利用している)コンピュータのローカル・クロックは一般的に精度が悪く、数日の間に数秒の誤差が出る場合も珍しいことではない。よって上記の設定を行っても、外部NTPサーバと同程度の精度を代替するNTPサーバを配置したことにはならない、ということに注意していただきたい。閉じたネットワーク上で高度に正確な時刻の保持や同期が必要な場合、そういった目的に特化した専用ハードウェアを別途導入する必要があるだろう。
【2012/01/17】ntp.confファイルの設定例の2つのリスト「/etc/ntp.confファイルの内容」において、同期先のサーバの指定を当初公開した記事では、「server 127.1.1.0」「fudge 127.1.1.0 stratum 〜」のように記述しておりましたが、正しくは「server 127.127.1.0」「fudge 127.127.1.0 stratum 〜」でした。お詫びして訂正させていただきます。
Copyright© Digital Advantage Corp. All Rights Reserved.