Jump to contentJump to page navigation: previous page [access key p]/next page [access key n]
適用先 openSUSE Leap 15.7

18 NTP を利用した時刻同期 Edit source

概要

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「Windows ドメインメンバーシップ を利用した Active Directory ドメインへの参加」 に示されている手順に従ってください。

18.1 YaST を利用した NTP クライアントの設定 Edit source

chrony パッケージに付属する NTP デーモン (chronyd) は、ローカルコンピュータのハードウエア時計を参照先として使用するように事前設定されています。ハードウエア時計の正確さは、その時刻の発信源に大きく依存しています。たとえば原子時計や GPS レシーバは正確な時刻源となりますが、一般的な PC に搭載されている RTC チップは、信頼できる時刻源とは言えません。このような場合は、 YaST を利用して時刻同期を行ってください。

YaST NTP クライアント設定 ( ネットワークサービス › NTP 設定 ) のウインドウでは、 NTP デーモンの起動のタイミングや設定元の種類、そして独自のタイムサーバの指定を行うことができます。

NTP 設定ウインドウ
図 18.1: NTP 設定ウインドウ

18.1.1 NTP デーモンの開始 Edit source

NTP デーモンの起動については、下記のいずれかを選択することができます:

手動でのみ起動

必要な場合にのみ chrony デーモンを手作業で起動したい場合は、 手動でのみ起動 を選択してください。

デーモンを使用せずに同期する

chrony を恒久的に起動したりせず、定期的にシステム時刻を設定したい場合は、 デーモンを使用せずに同期する を選択してください。なお、 同期間隔 [分] で間隔を指定することもできます。

今すぐ開始し、システム起動時に開始するよう設定

システムの起動時に chronyd を開始したい場合は、 今すぐ開始し、システム起動時に開始するよう設定 を選択してください。こちらを選択しておくことをお勧めします。

18.1.2 設定元の種類 Edit source

設定元 のドロップダウンボックスでは、 動的 または 静的 のいずれかを選択します。お使いのサーバが固定の (公開されている) NTP サーバを利用する場合は 静的 を、 DHCP を介して NTP サーバの情報を提供しているネットワークの場合は 動的 を選択してください。

18.1.3 タイムサーバの設定 Edit source

時刻の問い合わせ先となるタイムサーバの設定は、 NTP 設定 ウインドウの下半分に書かれています。この一覧は、 追加 , 編集 , 削除 の各ボタンで変更することができます。

新しいタイムサーバを追加するには、 追加 を押します:

タイムサーバの追加
図 18.2: タイムサーバの追加
  1. アドレス 欄には、そのマシンの同期先となるタイムサーバの URL か、タイムサーバのプールの URL を指定します。入力が終わったら テスト を押すと、タイムサーバとの通信を確認することができます。

  2. chronyd の起動時に多くの要求を送信して同期を高速化するには、 初期同期の高速化 を選択します。

  3. オフライン起動 を選択すると、システムの起動時に chronyd を素早く起動することができます。これは、システムの起動時にインターネットに接続できない環境のほか、 NetworkManager でネットワーク接続を管理しているような場合に便利な機能です。

  4. OK を押して閉じます。

18.2 ネットワーク内での NTP の手動設定 Edit source

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 サービスを動作させている場合は、このサービスを有効化または起動してはなりません。

18.3 NTS の設定 Edit source

Network Time Protocol (NTP) はネットワーク内の 1 つまたは複数のホストに対して、システム時刻の同期と維持を行うためのプロトコルです。本記事では、 Network Time Security (NTS) を利用した機密保持機能の設定方法を説明しています。

NTP プロトコルにはセキュリティ機能が含まれていないため、タイムサーバとクライアントとの間でやり取りされる通信に認証や暗号化を追加できません。 Network Time Security (NTS) はそのような NTP に対して、セキュリティ機能を提供します。 chrony は NTS に対応していますので、時刻ソースからの情報を認証し、特定の種類のネットワーク攻撃から保護できるようになっています。

下記の手順では、より安全な時刻同期のため、タイムサーバとクライアントとの間で設定すべき事項について概要を説明しています。

手順 18.1: NTS タイムサーバの設定
  1. NTS を利用して時刻の更新を行うようタイムサーバを設定しておくことをお勧めします。これにより、同期処理の最初から安全に時刻を取得できるようになります。まずは /etc/chrony.conf 内にある NTS 非対応の時刻ソースをコメントアウトし、少なくとも 1 つ以上の NTS 対応サーバを指定します。たとえば下記のようになります:

    server time.cloudflare.com iburst nts
    ヒント
    ヒント

    nts オプションを指定すると、 NTS に対応しているサーバであれば NTS を使用するようになります。対応していないサーバの場合は従来の NTP として通信します。

  2. あとは chronyd サービスを再起動します。

    > sudo systemctl restart chronyd.srvice
  3. あとは設定済みの時刻ソースとの同期状況を確認します。

    > 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
  4. なお、サーバ側で allow オプションを指定していると、そのタイムサーバと同期可能なクライアントを指定することができます。たとえば下記のようになります:

    allow 192.168.1.0/24
  5. タイムサーバがファイアウオール内で動作している場合は、 NTP と NTS の両方を許可するように設定してください。既定で NTP はポート 123, NTS はポート 4460 を使用します。

  6. また、 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 証明書に関する詳細情報については、 こちらの記事 をお読みください。

  7. また、 /etc/chrony.conf ファイルを編集して、 ntsdumpdir /var/lib/chrony オプションを有効化してください。これに加えて、 TLS 鍵と証明書のパスを指定してください。

    ntsdumpdir /var/lib/chrony
    ntsserverkey /var/lib/chrony/nts.key
    ntsservercert /var/lib/chrony/nts.crt
  8. あとは chronyd サービスを再起動します。

    > sudo systemctl restart chronyd.service
手順 18.2: NTS クライアントの設定
  1. まずは既存の NTP タイムソースを無効化します。たとえば下記のように設定します:

    #server 192.168.1.1 iburst

    タイムソースの設定は /etc/chrony.conf 内に直接記述するか、もしくは /etc/chrony.d/ ディレクトリ内にファイルを作成して記述します。

  2. クライアント側では、サーバ側に設定されている TLS 証明書の発行元となるルート証明機関 (CA) を信頼するように設定する必要があります。証明機関 (CA) ストアの管理方法に関する詳細は、 こちらの記事 で説明しています。

  3. あとはクライアント側の chrony 設定ファイルである /etc/chrony.conf に対して、 手順18.1「NTS タイムサーバの設定」 で設定した NTS タイムサーバを指定します。具体的には下記のように設定します:

    server サーバアドレス iburst nts
  4. あとは chronyd サービスを再起動します。

    > sudo systemctl restart chronyd.service
  5. 再起動が終わったら下記を実行して、クライアント側で正しく時刻ソースが設定されているかどうか、および接続認証が働いているかどうかを確認します。

    > sudo chronyc sources -v
    > sudo chronyc -N authdata
  6. NTS タイムサーバ側では、 NTS 接続に対するクライアント統計情報を確認します。

    > sudo chronyc -N clients -k

18.4 chronyc による動作中の chronyd の設定 Edit source

chronyd の動作中に何らかの変更を行いたい場合は、 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 ) をお読みください。

18.5 動作中の動的な時刻同期 Edit source

システムの起動時にネットワークの接続が利用できないような環境では、 chronyd は起動できるものの、設定ファイル内に書かれたタイムサーバの DNS 名が解決できないことになります。

chronyd では server , pool , peer の各ディレクティブで指定したタイムサーバ名を、成功するまで間隔を増やしながら解決を試みます。

chronyd の起動時にはタイムサーバに接続できないことがわかっている場合は、下記のようにして offline オプションを指定してください:

server サーバアドレス offline

上記のように設定すると、 chronyd は下記のコマンドを送信するまで、サーバへの問い合わせを行わないようになります:

# chronyc online サーバアドレス

なお、 auto_offline オプションを指定すると、 chronyd はタイムサーバに対して 2 回リクエストを送信しても応答がない場合、そのタイムサーバがオフライン状態にあるものと判断するようになります。これにより、ネットワーク接続が切れている状態でも offline コマンドを実行する必要がなくなります。

18.6 ローカル参照時計の設定 Edit source

ソフトウエアパッケージ 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 をお読みください。

このページを印刷