コンピュータの時計が 1 秒ズレるだけで何が起きるか

あなたの PC やスマートフォンの時計は、驚くほど正確に見えます。しかし、コンピュータの内蔵時計は水晶発振器の精度で動いているため、放っておけば 1 日に数秒の単位でズレていきます。このズレを放置すると、TLS 証明書の検証が失敗し、二要素認証のワンタイムパスワードが無効になり、ログのタイムスタンプが信頼できなくなり、分散システムのデータ整合性が崩壊します。

NTP (Network Time Protocol) は、この「時刻のズレ」をインターネット経由で修正するプロトコルです。

NTP - 1985 年から時を刻み続けるプロトコル

NTP は David L. Mills が設計したプロトコルで、最初の仕様 RFC 958 は 1985 年 9 月に発行されました。以後版を重ね、2010 年の RFC 5905 で規定された NTPv4 が広く使われています。NTP は階層構造 (Stratum) で動作します。

  • Stratum 0: 原子時計、GPS 受信機などの高精度時刻源。直接ネットワークに接続されない
  • Stratum 1: Stratum 0 に直接接続された NTP サーバー。「一次参照時計」
  • Stratum 2: Stratum 1 から時刻を取得するサーバー。多くの公開 NTP サーバーがここ
  • Stratum 3 以降: 順次下位のサーバーから時刻を取得。最大 Stratum 15 まで

NTP は単にサーバーの時刻をコピーするのではなく、ネットワーク遅延を計測して補正します。複数のサーバーから時刻を取得し、統計的に最も信頼できる値を選択するアルゴリズムを使用しています。

時刻がズレると壊れるもの

TLS 証明書の検証

TLS 証明書には有効期間 (Not Before / Not After) が設定されています。クライアントの時計が大きくズレていると、有効な証明書を「期限切れ」と判定したり、まだ有効でない証明書を「有効」と判定したりします。証明書の透明性の仕組みも、正確な時刻に依存しています。

TOTP (時刻ベースのワンタイムパスワード)

Google Authenticator などの認証アプリは、現在時刻を元に 30 秒ごとに変わるコードを生成します。仕様 (RFC 6238) はネットワーク遅延の吸収として 1 ステップ (30 秒) 程度の許容を認めているため、少しのズレなら通ります。しかし時刻差がその許容枠を超えると、正しく入力したコードでも一致せずログインできなくなります。

Kerberos 認証

Active Directory で使われる Kerberos 認証は、デフォルトで 5 分以上の時刻差を許容しません。企業ネットワークで NTP が停止すると、全社員がログインできなくなる事態が発生します。

分散データベース

Google Spanner のような分散データベースは、トランザクションの順序を時刻で決定します。Google は TrueTime という独自の時刻基盤を開発し、原子時計と GPS を組み合わせるとともに、時刻を「点」ではなく「誤差幅を含んだ区間」として返す API を用意しました。ズレをゼロにするのではなく、ズレの上限を保証してその範囲でトランザクションの順序を守るという発想です。

ログの信頼性

セキュリティインシデントの調査では、複数のサーバーのログを時系列で突き合わせます。時刻がズレていると、イベントの因果関係を正しく再構成できません。

うるう秒 - 時刻同期の最大の敵

地球の自転速度は一定ではありません。そのため、原子時計が刻む一定の 1 秒を積み上げた時刻と、地球の自転に基づく時刻 (UT1) との間には少しずつ差が生まれます。この差を一定範囲に収めるため、私たちが使う UTC には「うるう秒」が挿入されることがあります。23:59:59 の次に 23:59:60 という通常存在しない秒が追加されるのです。

2012 年 6 月 30 日のうるう秒挿入時には、Linux カーネルのうるう秒処理の不具合を引き金に、Reddit や Mozilla など Linux 上で動くサービスが相次いで障害を起こしました。多くのソフトウェアが「1 分は 60 秒」を前提としており、61 秒目の存在を想定していなかったためです。

この問題を受けて、Google は「うるう秒スミア (leap smear)」という手法を開発しました。うるう秒を 1 秒として一度に挿入するのではなく、24 時間かけて少しずつ時刻を調整する方法です。2022 年、国際度量衡総会 (CGPM) は決議 4 で、UT1 と UTC の差の許容限度を 2035 年までに引き上げること、つまりうるう秒の挿入を事実上やめることを決定しました。

まとめ

時刻同期は、インターネットの「見えないインフラ」の中でも特に地味ですが、その重要性は計り知れません。TLS、2FA、Kerberos、分散データベース、ログ分析 - これらすべてが正確な時刻に依存しています。IP 確認さんで接続情報を確認するとき、その通信を支える TLS ハンドシェイクも、正確な時刻同期の上に成り立っています。

この記事の関連用語

TLS 証明書の有効期間検証に正確な時刻が必要。時刻ズレで証明書エラーが発生する。 二要素認証 TOTP は現在時刻からコードを生成するため、時刻ズレでログイン不能になる。 IP アドレス NTP サーバーへの接続にも IP アドレスが使用される。 DNS DNSSEC の署名検証にも正確な時刻が必要。 HTTPS TLS 証明書の有効期間チェックを通じて、時刻同期に依存する。

よくある質問

NTP とは何ですか?

1985 年から稼働する時刻同期プロトコルです。原子時計や GPS を頂点とする Stratum 階層構造で、ネットワーク遅延を補正しながらコンピュータの時計を正確に保ちます。

時刻がズレると何が壊れますか?

TLS 証明書の検証失敗、TOTP ワンタイムパスワードの不一致、Kerberos 認証の拒否、分散データベースのデータ不整合、ログのタイムスタンプの信頼性喪失など、広範な影響が出ます。

うるう秒とは何ですか?

地球の自転速度のズレを補正するために UTC に挿入される 1 秒です。2012 年のうるう秒挿入時には Reddit などが障害を起こし、2022 年の国際度量衡総会では 2035 年までに挿入をやめることが決まりました。