序章

ネットワークタイムプロトコルであるNTPは、さまざまなオペレーティングシステムで時刻を同期する方法を提供する標準化されたプロトコルです。 OpenNTPd は、元々 OpenBSD プロジェクトの一部として開発された、ネットワークタイムプロトコル(NTP)の無料で使いやすい実装です。 リモートNTPサーバーからローカルクロックを同期する機能を提供し、サーバー自体としても機能します。

このチュートリアルでは、FreeBSDにOpenNTPdをインストールする方法を説明します。

前提条件

このチュートリアルに従うには、次のものが必要です。

  • rootユーザーがいる1つのFreeBSD10.2ドロップレット。 DigitalOceanのデフォルトのfreebsdユーザーは問題ありません。

FreeBSD Dropletには、リモートアクセス用のSSHキーが必要です。 SSHキーの設定については、FreeBSDサーバーでSSHキーベースの認証を構成する方法をお読みください。 FreeBSD Dropletへのログインと基本的な管理の詳細については、 Get Getting Started withFreeBSDチュートリアルシリーズをご覧ください。

ステップ1—OpenNTPdをインストールする

OpenNTPdをインストールする前に、pkgで使用されるリポジトリ情報を更新してください。

  1. sudo pkg update

次に、OpenNTPdパッケージをインストールします。

  1. sudo pkg install openntpd

デフォルトのOpenNTPd構成は、デフォルトのタイムサーバーとしてpool.ntp.orgを使用し、クライアントマシンとしてのみ機能するように構成されています。 このチュートリアルの残りの部分では、使用するタイムサーバーを変更する方法と、OpenNTPdをタイムサーバーとして構成する方法を示します。

手順2—タイムサーバーの変更((オプション)

次のいくつかの手順では、デフォルトの構成ファイルである/usr/local/etc/ntpd.confを編集します。 eevi、またはお好みのテキストエディタを使用して構成ファイルを編集します。

  1. sudo ee /usr/local/etc/ntpd.conf

AskBjørnHansenのGeoDNSを利用して、pool.ntp.orgは通常、お住まいの国またはその近くのサーバーのIPアドレスを返します。 ほとんどのユーザーにとって、これは最良の結果をもたらします。

または、br.pool.ntp.orgde.pool.ntp.orgru.pool.ntp.orgなどのカントリーゾーンを使用して、個人のニーズに合わせて結果を強制/制限することもできます。 NTPプールプロジェクトの詳細については、pool.ntp.orgにアクセスしてください。

このチュートリアルの例では、 NTP.br を使用します。これは、ブラジルの領土で法定時間を保存および配布するブラジルのプロジェクトです。 ブラジルにいない場合は、お住まいの国または地域で同様のプロジェクトを使用してください。

pool.ntp.brを選択したタイムサーバーに置き換えて、このように目的のタイムサーバーを定義します。

/usr/local/etc/ntpd.conf
# $OpenBSD: ntpd.conf,v 1.2 2015/02/10 06:40:08 reyk Exp $
# sample ntpd configuration file, see ntpd.conf(5)

# Addresses to listen on (ntpd does not listen by default)
#listen on *

# sync to a single server
#server ntp.example.org

# use a random selection of NTP Pool Time Servers
# see http://support.ntp.org/bin/view/Servers/NTPPoolServers
servers pool.ntp.br

# use a specific local timedelta sensor (radio clock, etc)
#sensor nmea0

# use all detected timedelta sensors
#sensor *

# get the time constraint from a well-known HTTPS site
#constraints from "https://www.google.com/search?q=openntpd"

ステップ3—制約を変更する

カスタムクライアントセットアップは、制約にサポートを追加することもできるため、ntpdはTLSを介して信頼できるHTTPSサーバーからDate:ヘッダーを照会できます。

ntpd.conf(5)のマンページには、「時間情報が制約に近い範囲外にある受信NTPパケットは破棄され、そのようなNTPサーバーは無効としてマークされます」と記載されています。 これにより、クロックの精度を維持しながら、一部のMITM攻撃を防ぐことができます。

/usr/local/etc/ntpd.confに制約を追加します。 必ず1つ以上の信頼できる有名なHTTPSサイトを使用してください。 以下で強調表示されている最初の#文字を削除することにより、ファイルで提供されているサンプル行のコメントを解除できます。

/usr/local/etc/ntpd.conf
# $OpenBSD: ntpd.conf,v 1.2 2015/02/10 06:40:08 reyk Exp $
# sample ntpd configuration file, see ntpd.conf(5)

# Addresses to listen on (ntpd does not listen by default)
#listen on *

# sync to a single server
#server ntp.example.org

# use a random selection of NTP Pool Time Servers
# see http://support.ntp.org/bin/view/Servers/NTPPoolServers
servers pool.ntp.br

# use a specific local timedelta sensor (radio clock, etc)
#sensor nmea0

# use all detected timedelta sensors
#sensor *

# get the time constraint from a well-known HTTPS site
# constraints from "https://www.google.com/search?q=openntpd"

ステップ4—OpenNTPdをタイムサーバーとして設定する

このセクションでは、OpenNTPdのデフォルトの動作を変更し、FreeBSDをIPv4およびIPv6で時間を処理できるNTPサーバーに変更する方法を示します。

サーバー構成の最終結果は次のようになり、your_server_ipがサーバーのIPv4またはIPv6アドレスに置き換えられます。

/usr/local/etc/ntpd.conf
# $OpenBSD: ntpd.conf,v 1.2 2015/02/10 06:40:08 reyk Exp $
# sample ntpd configuration file, see ntpd.conf(5)

# Addresses to listen on (ntpd does not listen by default)
listen on your_server_ip

# sync to a single server
#server ntp.example.org

# use a random selection of NTP Pool Time Servers
# see http://support.ntp.org/bin/view/Servers/NTPPoolServers
servers pool.ntp.br

# use a specific local timedelta sensor (radio clock, etc)
#sensor nmea0

# use all detected timedelta sensors
#sensor *

# get the time constraint from a well-known HTTPS site
#constraints from "https://www.google.com/search?q=openntpd"

ステップ5—起動時にOpenNTPdを開始する

OpenNTPdのデフォルトのサービス設定は、FreeBSDのブートプロセス中にデーモンを起動しません。 FreeBSDでntpdが提供するNTPサービスを追加するには、以下を実行します。

  1. sudo sysrc openntpd_enable="YES"

出力は次のようになります。

Output
openntpd_enable: -> YES

起動直後に時刻を設定したい場合は、-sopenntpd_flagsに追加してください。 -vを使用して、adjtimeへのすべての呼び出しがログに記録されるようにすることもできます。 -sntpdに渡すと、デーモンはフォアグラウンドに最大15秒間留まり、構成されたNTPサーバーの1つが応答するのを待機します。 これはデフォルトではなく、次のようにカスタムセットアップを構成する必要があります。

  1. sudo sysrc openntpd_flags="-s -v"

出力は次のようになります。

Output
openntpd_flags: -> -s -v

ステップ6—OpenNTPdサービスの管理

すべてのニーズに合うように構成ファイルを編集およびカスタマイズしたので、OpenNTPdが提供するサービスを開始できます。

サービスを開始するには:

sudo service openntpd start

正常に起動すると、次のように表示されます。

Output
Starting openntpd.

OpenNTPdデーモンのフラグがデバッグ情報をログに記録するように構成されている場合、出力の開始は次のようになります。

Output
Starting openntpd. constraint certificate verification turned off ntp_adjtime returns frequency of 8.643158ppm

OpenNTPdサービスは、通常のコマンドstatusrestartなどで管理できます。

ステップ7—トラブルシューティング(オプション)

OpenNTPdは、ntpdntpctlの2つのバイナリを使用します。 1つ目はデーモン自体であり、クライアントまたはサーバーマシンに提供されるNTPサービスを担当します。 2つ目は、実行中のデーモンに関する情報を表示するために使用されます。

このセクションでは、ntpctlnc、およびsockstatを使用して、OpenNTPdとそのデーモンによって提供されるNTPサービスのトラブルシューティングを行う方法を示します。 実行中のサービスがある場合、またはサービスが実行されているかどうかを確認する別の方法が必要な場合は、このセクションを使用してください。

ステータスとピアの取得

OpenNTPdのntpctlは、OpenNTPdデーモンとの通信にローカルソケットを使用します。 デフォルトは/var/run/ntpd.sockです。 このチュートリアルでは、ntpctlで実行できる2種類のクエリstatuspeersについて説明します。

statusは、ピアとセンサーのステータス、およびシステムクロックが同期されているかどうかを示します。 システムクロックが同期されると、階層が表示されます。 システムクロックが同期されていない場合、adjtimeシステムコールによって報告されたシステムクロックのオフセットが表示されます。 中央値制約が設定されている場合、現地時間へのオフセットが表示されます。

ntpctlを使用してステータスを表示するには:

  1. sudo ntpctl -s status

出力は次のようになります。

出力
8/8 peers valid, clock synced, stratum 2

peersは、各ピアに関する次の情報を表示します:weight(wt)、trustlevel(tl)、stratum(st)、およびピアへの次の更新(次のポーリング)までの秒数。 オフセット、ネットワーク遅延、およびネットワークジッターの値はミリ秒単位です。 システムクロックがピアに同期されると、そのピアの重み列の左側にアスタリスク( * )が表示されます。

ntpctlを使用してピア情報を表示するには:

  1. sudo ntpctl -s peers

次の出力は、OpenNTPdが実行され、「200.160.7.193」( pool.ntp.br から解決)として応答するストラタム1サーバーに同期され、OpenNTPdデーモンが時刻を更新するという情報を示しています。 31秒でNTP経由:

Output
peer wt tl st next poll offset delay jitter 200.160.0.8 from pool pool.ntp.br 1 10 2 8s 30s -0.005ms 44.814ms 0.023ms 200.160.7.193 from pool pool.ntp.br * 1 10 1 26s 31s -0.012ms 44.814ms 0.027ms 200.20.186.76 from pool pool.ntp.br 1 10 1 18s 31s 0.023ms 37.481ms 0.031ms . . .

リスニングソケット

sockstatを使用して、開いているIPv4、IPv6、およびUNIXドメインソケットを一覧表示できます。 NTP over IPv4およびIPv6に関連するリスニングソケットを一覧表示するには、次の手順に従います。

  1. sudo sockstat -4 -6 -p 123
出力
USER     COMMAND    PID   FD PROTO  LOCAL ADDRESS         FOREIGN ADDRESS     
_ntp     ntpd       44208 7  udp4   203.0.113.123:16987  200.160.0.8:123
_ntp     ntpd       44208 8  udp4   203.0.113.123:38739  200.160.7.193:123

. . .

ネットワーク経由で時間を提供するためにOpenNTPdを実行している場合、LOCAL ADDRESS列にIPアドレスの行が表示されます。 your_ipv4_address:123はIPv4ソケットを表し、your_ipv6_address:123はリスニングIPv6ソケットを表します。

インターネットへの接続

ncを使用して、NTPだけでなく、多くのネットワークデーモンとそのソケット(UNIX、TCP、またはUDP)のトラブルシューティングを行います。 マンページには次のように書かれています。「telnetとは異なり、netcatスクリプトは、エラーメッセージをtelnetのように標準出力に送信するのではなく、標準エラーにうまく分離します」。

IPv4を介してNTPサーバーまたはプールホストに到達できるかどうかを確認するには、次の手順に従います。

  1. sudo nc pool.ntp.br 123 -z -4 -u -v
Output
Connection to pool.ntp.br 123 port [udp/ntp] succeeded!

IPv6を介してNTPサーバーまたはプールホストに到達できるかどうかを確認するには、次の手順に従います。

  1. sudo nc pool.ntp.br 123 -z -6 -u -v
Output
Connection to pool.ntp.br 123 port [udp/ntp] succeeded!

ntpdateを使用する

ntpdateを使用して、使用する可能性のあるいくつかのサーバーのトラブルシューティングを行います。 NTPサービスを実行しているマシンに関する情報を取得できます:stratumoffset、およびdelay

  1. sudo ntpdate -q -4 ntp.cais.rnp.br

出力は次のようになります。

Output
server 200.144.121.33, stratum 3, offset -0.000049, delay 0.09001 1 Sep 17:28:54 ntpdate[66740]: adjust time server 200.144.121.33 offset -0.000049 sec

ntpdateの機能が、FreeBSDのntpdプログラムで利用できるようになったことに注意してください。 FreeBSDのntpdマンページの-qコマンドラインオプションを参照するか、ntpqを使用してください。

警告:ntpdateユーティリティは間もなく廃止されます。

マニュアルページを読む

OpenNTPdのntpdntpd.confntpctlはFreeBSDのベースシステムの一部ではないため、そのマニュアルページもオペレーティングシステムのデフォルトのMANPATHの一部ではありません。 OpenNTPdのマニュアルページを確実に読むには、man-M /usr/local/manで実行する必要があります。 FreeBSDのデフォルトのntpd(8)マンページと混同しないでください。

  1. man -M /usr/local/man ntpd

同じ手順を繰り返して、OpenNTPdのntpctl(8)またはntpd.conf(5)のマンページを読みます。

結論

時間は、ワークステーション、サーバー、ルーター、およびネットワークの機能にとって本質的に重要です。 同期された時間がないと、デバイス間の情報を正確に関連付けることは、不可能ではないにしても困難になります。 セキュリティに関しては、各ルーターとすべてのネットワークサーバー間でログを正常に比較できない場合、インシデントの信頼できる全体像を作成するのは非常に困難です。