NTP (Network Time Protocol) はネットワークを介してシステムの時刻を同期させるためのプロトコルです。まず、コンピュータは信頼できる時刻の発信源となるサーバから、時刻を取得します。次にコンピュータ自身が時刻の発信源となって、ネットワークに時刻を提供します。つまり、目的は 2 つ存在することになります。絶対時刻を管理することと、ネットワーク内にある全マシンの時刻を同期させることです。
システム時刻の正確性は、様々な状況下で重要となります。内蔵のハードウエア時計は、データベースやクラスタなどのアプリケーションの要件に適合するほど正確なものではありませんし、だからといって手作業で時刻を修正してしまったりすると、時刻が逆戻りすることによって、重要なアプリケーションの動作に問題が発生したりしてしまいます。ネットワークに接続されているコンピュータであれば、通常は全てのマシンのシステム時刻を同期させる必要がありますが、この場合も手作業での修正は好ましくありません。 NTP ではこれらの問題を解決する仕組みを備えています。 NTP では、ネットワーク経由でシステムの時刻を信頼できる時刻に少しずつ調整する仕組みを提供しています。このほか、ラジオ制御の時計など、ローカルの参照時計を管理する機能もあります。
openSUSE Leap 15 以降では、 chrony
が NTP の既定の実装になっています。 chrony
は 2 種類のパーツから構成されています。 1 つは chronyd
と呼ばれるデーモンで、システムの起動時に開始されるものです。もう 1 つは chronyc
と呼ばれるもので、 chronyd
の状態を監視したり、動作中にパラメータを変更したりするためのコマンドラインインターフェイスです。
openSUSE Leap 15.2 以降では、 YaST モジュールの NTP クライアントは chrony
をデーモンを使用せずに実行するよう設定する際、 cron デーモンではなく systemd-timer を使用するようになっています。
Active Directory を利用して時刻同期を行う場合は、 手順7.2「 に示されている手順に従ってください。 を利用した Active Directory ドメインへの参加」
chrony
パッケージに付属する NTP デーモン (chronyd
) は、ローカルコンピュータのハードウエア時計を参照先として使用するように事前設定されています。ハードウエア時計の正確さは、その時刻の発信源に大きく依存しています。たとえば原子時計や GPS レシーバは正確な時刻源となりますが、一般的な PC に搭載されている RTC チップは、信頼できる時刻源とは言えません。このような場合は、 YaST を利用して時刻同期を行ってください。
YaST NTP クライアント設定 (
› ) のウインドウでは、 NTP デーモンの起動のタイミングや設定元の種類、そして独自のタイムサーバの指定を行うことができます。NTP デーモンの起動については、下記のいずれかを選択することができます:
必要な場合にのみ chrony
デーモンを手作業で起動したい場合は、 を選択してください。
chrony
を恒久的に起動したりせず、定期的にシステム時刻を設定したい場合は、 を選択してください。なお、 で間隔を指定することもできます。
システムの起動時に chronyd
を開始したい場合は、 を選択してください。こちらを選択しておくことをお勧めします。
のドロップダウンボックスでは、 または のいずれかを選択します。お使いのサーバが固定の (公開されている) NTP サーバを利用する場合は を、 DHCP を介して NTP サーバの情報を提供しているネットワークの場合は を選択してください。
時刻の問い合わせ先となるタイムサーバの設定は、
ウインドウの下半分に書かれています。この一覧は、 , , の各ボタンで変更することができます。新しいタイムサーバを追加するには、
を押します:欄には、そのマシンの同期先となるタイムサーバの URL か、タイムサーバのプールの URL を指定します。入力が終わったら を押すと、タイムサーバとの通信を確認することができます。
chronyd
の起動時に多くの要求を送信して同期を高速化するには、 を選択します。
chronyd
を素早く起動することができます。これは、システムの起動時にインターネットに接続できない環境のほか、 NetworkManager でネットワーク接続を管理しているような場合に便利な機能です。
を押して閉じます。
chronyd
は /etc/chrony.conf
にある設定ファイルを読み込みます。お使いのコンピュータの同期を維持するため、 chrony
に対してどのタイムサーバを使用するのかを指定します。タイムサーバの指定は完全修飾ホスト名のほか、 IP アドレスでも指定することができます。たとえば下記のようになります:
0.suse.pool.ntp.org 1.suse.pool.ntp.org 2.suse.pool.ntp.org 3.suse.pool.ntp.org
下記のようにして pool (プール) を指定することもできます。プールは複数の IP アドレスに展開される仕組みです:
pool pool.ntp.org
同じネットワーク内にある複数のコンピュータの時刻を同期するにあたっては、それら全てを外部のサーバと同期させる構成はお勧めできません。その代わりに、いずれか 1 台のコンピュータを外部のタイムサーバと同期させ、残りのコンピュータをそのコンピュータに同期させることをお勧めします。この場合は、サーバ側の /etc/chrony.conf
内に local
ディレクティブを指定して、信頼できるタイムサーバと区別するようにしてください:
local stratum 10
chrony
を開始するには、下記のように実行します:
systemctl start chronyd.service
chronyd
の準備が完了すると、時刻が安定して受信され、ローカルコンピュータの時計の調整を行うためのドリフトファイルが作成されるまで、しばらくの時間がかかります。ドリフトファイルは、コンピュータが起動されてからのハードウエア時計のズレの計算結果を表したファイルです。補正は直ちに開始されるため、これによってシステム時刻の安定性を高めるようになっています。
システムの起動時に chrony
サービスを開始するには、下記のように実行します:
systemctl enable chronyd.service
yast-timesync.service
サービスとの競合についてchronyd.service
に加えて、 openSUSE Leap には yast-timesync.service
という名前のサービスが含まれています。 yast-timesync.service
はタイマーで 5 分おきに動作するよう設定され、 chronyd
に -q
オプションを付けて動作させたあと、終了するようになっています。ただし、 chronyd
は同時に 1 つまでしか起動できない仕様であることから、 chronyd
サービスを動作させている場合は、このサービスを有効化または起動してはなりません。
Network Time Protocol (NTP) はネットワーク内の 1 つまたは複数のホストに対して、システム時刻の同期と維持を行うためのプロトコルです。本記事では、 Network Time Security (NTS) を利用した機密保持機能の設定方法を説明しています。
NTP プロトコルにはセキュリティ機能が含まれていないため、タイムサーバとクライアントとの間でやり取りされる通信に認証や暗号化を追加できません。 Network Time Security (NTS) はそのような NTP に対して、セキュリティ機能を提供します。 chrony
は NTS に対応していますので、時刻ソースからの情報を認証し、特定の種類のネットワーク攻撃から保護できるようになっています。
下記の手順では、より安全な時刻同期のため、タイムサーバとクライアントとの間で設定すべき事項について概要を説明しています。
NTS を利用して時刻の更新を行うようタイムサーバを設定しておくことをお勧めします。これにより、同期処理の最初から安全に時刻を取得できるようになります。まずは /etc/chrony.conf
内にある NTS 非対応の時刻ソースをコメントアウトし、少なくとも 1 つ以上の NTS 対応サーバを指定します。たとえば下記のようになります:
server time.cloudflare.com iburst nts
nts
オプションを指定すると、 NTS に対応しているサーバであれば NTS を使用するようになります。対応していないサーバの場合は従来の NTP として通信します。
あとは chronyd
サービスを再起動します。
>
sudo
systemctl restart chronyd.srvice
あとは設定済みの時刻ソースとの同期状況を確認します。
>
chronyc sources -v
MS Name/IP address Stratum Poll Reach LastRx Last sample =============================================================================== ^? time.cloudflare.com 3 6 1 2 -947ms[ -947ms] +/- 12ms ^? pyrrha.fi.muni.cz 2 6 1 1 -948ms[ -948ms] +/- 39ms ^* whitesoft-intex16.c.cbsn> 1 6 1 2 -948ms[ -948ms] +/- 5444us ^? mail.combatostrich.dev 2 6 1 1 -948ms[ -948ms] +/- 28ms
^*
で始まる行が、最適な時刻ソースとして判断されたサーバを表します。
あとは NTS モードで同期しているかどうかを確認します。
>
chronyc -N authdata
Name/IP address Mode KeyID Type KLen Last Atmp NAK Cook CLen ========================================================================= [...] time.cloudflare.com NTS 1 15 256 3 0 0 8 96
なお、サーバ側で allow
オプションを指定していると、そのタイムサーバと同期可能なクライアントを指定することができます。たとえば下記のようになります:
allow 192.168.1.0/24
タイムサーバがファイアウオール内で動作している場合は、 NTP と NTS の両方を許可するように設定してください。既定で NTP はポート 123, NTS はポート 4460 を使用します。
また、 TLS 証明書と対応する機密鍵を取得し、それらを /var/lib/chrony/
内にコピーします。また、それらのファイルが chrony
から読み取れる用に設定します。たとえば下記のようになります:
>
sudo
install -m 0440 -o chrony -g chrony nts.key /var/lib/chrony/>
sudo
install -m 0440 -o chrony -g chrony nts.crt /var/lib/chrony/
TLS 証明書に関する詳細情報については、 こちらの記事 をお読みください。
また、 /etc/chrony.conf
ファイルを編集して、 ntsdumpdir /var/lib/chrony
オプションを有効化してください。これに加えて、 TLS 鍵と証明書のパスを指定してください。
ntsdumpdir /var/lib/chrony ntsserverkey /var/lib/chrony/nts.key ntsservercert /var/lib/chrony/nts.crt
あとは chronyd
サービスを再起動します。
>
sudo
systemctl restart chronyd.service
まずは既存の NTP タイムソースを無効化します。たとえば下記のように設定します:
#server 192.168.1.1 iburst
タイムソースの設定は /etc/chrony.conf
内に直接記述するか、もしくは /etc/chrony.d/
ディレクトリ内にファイルを作成して記述します。
クライアント側では、サーバ側に設定されている TLS 証明書の発行元となるルート証明機関 (CA) を信頼するように設定する必要があります。証明機関 (CA) ストアの管理方法に関する詳細は、 こちらの記事 で説明しています。
あとはクライアント側の chrony
設定ファイルである /etc/chrony.conf
に対して、 手順18.1「NTS タイムサーバの設定」 で設定した NTS タイムサーバを指定します。具体的には下記のように設定します:
server サーバアドレス iburst nts
あとは chronyd
サービスを再起動します。
>
sudo
systemctl restart chronyd.service
再起動が終わったら下記を実行して、クライアント側で正しく時刻ソースが設定されているかどうか、および接続認証が働いているかどうかを確認します。
>
sudo
chronyc sources -v>
sudo
chronyc -N authdata
NTS タイムサーバ側では、 NTS 接続に対するクライアント統計情報を確認します。
>
sudo
chronyc -N clients -k
chronyc
による動作中の chronyd
の設定 #Edit sourcechronyd
の動作中に何らかの変更を行いたい場合は、 chronyc
を使用することができます。 chronyc
では、 chronyd
の操作に関する状態レポートを生成することもできます。
chronyc
は対話モードと非対話モードの両方に対応しています。 chronyc
を対話モードで起動したい場合は、コマンドラインに chronyc
とだけ入力してください。これによりプロンプトが表示され、コマンドの入力を待機するようになります。たとえば NTP の対向でオンラインのものとオフラインのものの数を知りたい場合は、下記のように実行します:
#
chronyc
chronyc> activity 200 OK 4 sources online 2 sources offline 1 sources doing burst (return to online) 1 sources doing burst (return to offline) 0 sources with unknown address
chronyc
のプロンプトを終了するには、 quit
もしくは exit
と入力してください。
対話プロンプトが必要ない場合は、コマンドを直接指定して実行することもできます:
#
chronyc
activity
chronyc
を利用した変更は恒久的なものではありません。 chronyd
を再起動すると、元の設定に戻ってしまいます。設定を恒久化させたい場合は、 /etc/chrony.conf
を編集してください。
利用可能な chronyc
のコマンド一覧について、詳しくはマニュアルページ ( man 1 chronyc
) をお読みください。
システムの起動時にネットワークの接続が利用できないような環境では、 chronyd
は起動できるものの、設定ファイル内に書かれたタイムサーバの DNS 名が解決できないことになります。
chronyd
では server
, pool
, peer
の各ディレクティブで指定したタイムサーバ名を、成功するまで間隔を増やしながら解決を試みます。
chronyd
の起動時にはタイムサーバに接続できないことがわかっている場合は、下記のようにして offline
オプションを指定してください:
server サーバアドレス offline
上記のように設定すると、 chronyd
は下記のコマンドを送信するまで、サーバへの問い合わせを行わないようになります:
#
chronyc online サーバアドレス
なお、 auto_offline
オプションを指定すると、 chronyd
はタイムサーバに対して 2 回リクエストを送信しても応答がない場合、そのタイムサーバがオフライン状態にあるものと判断するようになります。これにより、ネットワーク接続が切れている状態でも offline
コマンドを実行する必要がなくなります。
ソフトウエアパッケージ chrony
は、他のプログラム (たとえば gpsd
) を利用して SHM や SOCK ドライバ経由でタイミングデータを取得することができます。 /etc/chrony.conf
内に refclock
ディレクティブを指定することで、ハードウエア参照時計を同期先として使用することができます。このディレクティブには、 2 種類の必須パラメータがあります。 1 つはドライバ名で、もう 1 つはドライバ固有のパラメータです。 2 つのパラメータは 0 個以上の refclock
オプションの後ろに続きます。 chronyd
では、下記のドライバに対応しています:
PPS - カーネルの Pulse Per Second
API 向けのドライバです。たとえば下記のように設定します:
refclock PPS /dev/pps0 lock NMEA refid GPS
SHM - NTP 共有メモリドライバです。たとえば下記のように設定します:
refclock SHM 0 poll 3 refid GPS1 refclock SHM 1:perm=0644 refid GPS2
SOCK - Unix ドメインソケットドライバです。たとえば下記のように設定します:
refclock SOCK /var/run/chrony.ttyS0.sock
PHC - PTP ハードウエアクロックドライバです。たとえば下記のように設定します:
refclock PHC /dev/ptp0 poll 0 dpoll -2 offset -37 refclock PHC /dev/ptp1:nocrossts poll 3 pps
個別のドライバのオプションについて、詳しくは man 8 chrony.conf
をお読みください。