blog

システム運用|NTSでNTPを保護する

NTP はまだ一般的に使われている数少ない安全でないインターネットプロトコルの一つです。...

Oct 22, 2025 · 8 min. read
シェア

NTPはまだ一般的に使われている数少ない安全でないインターネットプロトコルの1つです。クライアントとサーバー間のネットワークトラフィックを監視できる攻撃者は、クライアントに偽のデータを提供し、クライアントの実装や設定に応じて、システムクロックを任意の日時に設定させることができます。クライアントのシステムクロックが不正確な場合、一部のプログラムやサービスが動作しないことがあります。たとえば、クライアントのシステムクロックに基づいてウェブサーバの証明書の有効期限が切れているように見える場合、ウェブブラウザは正しく動作しません。を使用して NTP を保護することができます。

Fedora 33 は、新しい NTP 認証メカニズムである NTS をサポートする最初の Fedora リリースです。NTSは新しいNTP認証メカニズムで、クライアントがサーバーから受信したパケットが転送中に変更されていないことを確認できるようにします。NTSが有効になっている場合、攻撃者ができることはパケットのドロップまたは遅延のみです。NTSの詳細については、 参照してください。

NTPは対称鍵を使って安全に保護されています。残念ながら、サーバはクライアントごとに異なる鍵を持つ必要があり、鍵は安全に配布されなければ動作しません。これはローカルネットワーク上のプライベートサーバーには実用的かもしれませんが、何百万ものクライアントを持つパブリックサーバーにはスケールしません。

NTSには、サーバーとクライアント間で使用される暗号鍵を自動的に作成するプロトコルが含まれています。これはTCPポート4460で使用されます。これは、精度への影響を最小限に抑えながら、非常に多くのクライアントに拡張できるように設計されています。サーバはクライアント固有の状態を保存する必要はありません。サーバはクライアントにクッキーを提供しますが、このクッキーは暗号化されており、NTPパケットの認証に必要なキーが含まれています。プライバシーはNTSの目標の1つです。クライアントはサーバーが応答するたびに新しいクッキーを取得するため、クッキーを再利用する必要はありません。これにより、受動的なオブザーバーがネットワーク間を移動するクライアントを追跡することを防ぎます。

Fedora のデフォルトの NTP クライアントは Chrony で、バージョン 4.0 で NTS サポートが追加されましたが、デフォルトの設定は変更されませんでした。

現在、NTSをサポートするパブリックNTPサーバーはほとんどありません。RFC1985世界中の様々な場所にあります。netnodサーバーはスウェーデンにあります。将来的には、NTSをサポートするパブリックNTPサーバーが増えるかもしれません。

最適な信頼性を得るために、NTPクライアントを構成する際の一般的な推奨事項は、少なくとも3つの動作するサーバーを持つことです。最高の精度を得るには、ネットワーク遅延と非対称ネットワークルーティングによる非対称性を減らすために、近くにあるサーバーを選択することをお勧めします。きめ細かな精度にこだわらない場合は、この推奨を無視して、信頼できるNTSサーバーであれば、その所在地に関係なく使用することができます。

高い精度が必要だが、近くにNTSサーバーがない場合は、遠くのNTSサーバーと近くの非NTSサーバーを混在させることができます。しかし、このような構成はNTSサーバーだけを使用する構成ほど安全ではありません。攻撃者はクライアントに任意の時刻を受け入れさせることはできませんが、クライアントの時計とその推定精度をよりコントロールすることができます。

インストーラでクライアントNTSを有効にする

Fedora 33 をインストールする際、"Time & Date" ダイアログボックスの "Network Time" 設定で NTS を有効にすることができます。ボタンをクリックした後、サーバーの名前を入力し、NTS のサポートをチェックします。NTS を使用して、1 つまたは複数のサーバーまたはプールを追加できます。デフォルトのサーバープールを削除するには、"使用 "列の対応するフラグのチェックを外します。

設定ファイルでのクライアントNTSの有効化

Fedora のバージョンからアップグレードする場合、またはインストーラーで NTS を有効にしなかった場合、/etc/chrony.conf で直接 NTS を有効にすることができます。推奨の iburst オプションに加えて、特定のサーバーに nts オプションを使用することができます。例えば

  1. server time.cloudflare.com iburst nts
  2. server nts.sth1.ntp.se iburst nts
  3. server nts.sth2.ntp.se iburst nts

クライアントが起動するたびにNTS-KEセッションを繰り返す必要がないように、NTSキーとクッキーをディスクに保存することも許可してください。以下の行をchrony.confに追加してください:

  1. ntsdumpdir /var/lib/chrony

DHCPが提供するNTPサーバーとあなたが指定するNTPサーバーを混在させたくない場合は、 chrony.conf 以下の行を削除するかコメントアウトしてください:

  1. sourcedir /run/chrony-dhcp

chrony.conf 編集し終わったら、変更を保存してchronydサービスを再起動します:

  1. systemctl restart chronyd

顧客ステータスの確認

rootユーザーで以下のコマンドを実行し、NTSキーの作成が成功したかどうかを確認します:

  1. # chronyc -N authdata
  2. Name/IP address Mode KeyID Type KLen Last Atmp NAK Cook CLen
  3. =========================================================================
  4. time.cloudflare.com NTS 1 m 0 0 8 001
  5. nts.sth1.ntp.se NTS 1 m 0 0 8 001
  6. nts.sth2.ntp.se NTS 1 m 0 0 8 001

KeyID、Type、KLenカラムは0以外の値でなければなりません。それらがゼロの場合、システムログにchronydからのエラーメッセージがないか確認してください。失敗の原因として考えられるのは、ファイアウォールがクライアントのサーバのTCPポートへの接続をブロックしていることです。

失敗のもう1つの原因として考えられるのは、クライアントのクロックエラーのために証明書が検証できないことです。これはNTSの鶏が先か卵が先かの問題です。NTSを動作させるには、手動で日付を修正するか、一時的にNTSを無効にする必要があります。コンピュータにリアルタイム・クロック(ほとんどすべてのコンピュータに搭載)があり、バックアップ用の良好なバッテリがあれば、この操作は1回で済むはずです。

いくつかの一般的な小型ARMコンピュータのように、コンピュータにリアルタイムクロックやバッテリーがない場合は、シャットダウンまたは再起動時に保存された時間を復元するために /etc/sysconfig/chronyd -sオプションを追加することができます。時計は実時間より遅れますが、コンピュータが長時間シャットダウンされておらず、サーバーの認証情報が有効期限間近に更新されていなければ、時間チェックが成功するのに十分なはずです。最後の手段として、nocerttimecheckディレクティブで時間チェックを無効にすることができます。詳細はchrony.conf(5)のマニュアルページを参照してください。

以下のコマンドを実行して、クライアントがNTP測定を行っていることを確認します:

  1. # chronyc -N sources
  2. MS Name/IP address Stratum Poll Reach LastRx Last sample
  3. ===============================================================================
  4. ^* time.cloudflare.com 3 6 5us[ +375us] +/- 11ms
  5. ^+ nts.sth1.ntp.se 1 6 7us[ +237us] +/- 23ms
  6. ^+ nts.sth2.ntp.se 1 6 0us[ -170us] +/- 22ms

上記の値377は8進数で、直近の8つのリクエストで有効な応答があったことを 示します。NTSが有効になっている場合、検証チェックはNTS認証を含みます。値が常に低いか、377 に達しない場合、NTP リクエストまたは応答はネットワークで失われます。主要なネットワークオペレータの中には、ntpdの監視プロトコルを使用した増幅攻撃を軽減するために、大きなNTPパケットをブロックしたり、レート制限をかけたりする仲介デバイスがあることが知られています。残念ながら、NTSで保護されたNTPパケットは増幅を起こさないにもかかわらず、このような影響を受けます。NTPワーキンググループでは、この問題の解決策として、NTPの代替ポートを検討しています。

サーバーでのNTSの有効化

chronydを実行している独自のNTPサーバーがある場合は、そのサーバーのNTSサポートを有効にして、クライアントが安全に同期できるようにすることができます。そのサーバーが他のサーバーのクライアントである場合、そのサーバーと同期するためにNTSまたは共通鍵を使用する必要があります。クライアントはマスタータイムサーバーまでの全てのサーバー間の同期チェーンが安全であると仮定します。

サーバNTSを有効にするのは、ウェブサーバでHTTPSを有効にするのと似ています。必要なのは秘密鍵と証明書だけです。例えば、証明書はcertbotユーティリティを使用してLet's Encryptオーソリティによって署名されます。鍵と証明書のファイルが手に入ったら、chrony.confの以下のディレクティブで指定します:

  1. ntsserverkey / etc / pki / tls / private / foo.c.b.key;
  2. ntsservercert / etc / pki / tls / certs / foo.obj.b.foo;

クライアント設定にあるntsdumpdirディレクティブがchrony.confにあることを確認してください。これによってサーバは鍵をディスクに保存し、サーバが再起動したときにクライアントが新しい鍵とクッキーを取得する必要がなくなります。

chronyd 再起動します:

  1. systemctl restart chronyd

サーバーにファイアウォールがある場合は、UDP 123とTCPポート4460でNTPとNTS-KEの両方のサービスを許可する必要があります。

以下のコマンドで、クライアント・マシンで簡単なテストを行うことができます:

  1. $ chronyd -Q -t 3 'server foo.example.net iburst nts maxsamples 1'
  2. TZ chronyd version 4.0 starting (+CMDMON +NTP +REFCLOCK +RTC +PRIVDROP +SCFILTER +SIGND +ASYNCDNS +NTS +SECHASH +IPV6 +DEBUG)
  3. TZ Disabled control of system clock
  4. TZ System clock wrong by -0. seconds (ignored)
  5. TZ chronyd exiting

System clock wrong "というメッセージが表示された場合は、正しく動作しています。

サーバーでは、次のコマンドを使用して、処理したNTS-KE接続と認証済みNTPパケットの数を確認できます:

  1. # chronyc serverstats
  2. NTP packets received :
  3. NTP packets dropped :
  4. Command packets received :
  5. Command packets dropped : 0
  6. Client log records dropped :
  7. NTS-KE connections accepted: 401
  8. NTS-KE connections dropped : 0
  9. Authenticated NTP packets : 12539

NTS-KE connections accepted(NTS-KE接続の受け入れ)」および「Authenticated NTP packets(認証済みNTPパケット)」がゼロでない場合は、少なくとも一部のクライアントがNTS-KEポートに接続し、認証済みのNTPリクエストを送信できていることを意味します。-KE ポートに接続し、認証された NTP リクエストを送信できていることを意味します。

  1. Fedora 33 Beta のインストーラーには、古いプレリリースバージョンの Chrony が含まれており、NTS-KE ポートが変更されたため、現在の NTS サーバーでは動作しません。その結果、インストーラのネットワーク時間設定では、サーバーは常に動作しないと表示されます。インストール後、現在のサーバーで動作するように chrony パッケージを更新する必要があります。

Read next