見出し画像

ITエンジニア必見!「時刻合わせ」の深淵へようこそ:システム信頼性を支えるNTPの世界

ノア: アオラニさん、こんにちは! 今、クラウド環境の構築を勉強していて、ふと「サーバの時刻ってどうやって合わせているんだろう?」って疑問に思ったんです。やっぱり、全部手動でやるのは無理ですよね?

アオラニ: いい質問だね、ノア。もちろんだ、手動なんて現実的じゃない。君の疑問の核心にあるのは、時刻同期の必要性なんだ。

なぜ時刻を合わせる必要があるのか、いくつか理由を挙げよう。


1. ログの記録に失敗する

システムの運用で最も重要なことの一つが、ログの分析だ。何かトラブルが起きたとき、ログを見れば何がいつ、どういう順序で起こったかがわかる。 でも、もし複数のサーバで時刻がバラバラだったらどうなる?

例えば、Webサーバが「10:00:01」にエラーログを吐き出し、その直後にデータベースサーバが「10:00:05」に処理失敗のログを吐いたとする。 実際にはデータベースサーバの処理失敗が原因でWebサーバがエラーになったのに、ログのタイムスタンプがずれているせいで、原因と結果の順序が逆に見えてしまう可能性がある。これじゃあ、まともなトラブルシューティングなんてできないよね。


2. セキュリティが破綻する

時刻のズレは、セキュリティにも致命的な影響を及ぼす。代表的な例が Kerberos認証 だ。 これは、Active Directory(AD)環境などで使われる認証プロトコルで、認証情報の有効期限を時刻で管理している。クライアントと認証サーバ(KDC)の間で時刻が5分以上ずれていると、認証が失敗するように設計されているんだ。これは、認証情報のリプレイ攻撃(盗聴した情報を再利用する攻撃)を防ぐための仕組みで、セキュリティを維持するためには必須なんだよ。


時刻同期の標準プロトコル「NTP」


ノア: なるほど、ログも認証も、時刻が正確じゃないとダメなんですね。それで、その時刻合わせは、どうやって実現しているんですか?

アオラニ: ここで登場するのが、NTP(Network Time Protocol) だ。

NTPは、ネットワーク経由でコンピュータの時刻を同期させるためのプロトコル。UDPポート123番を使って通信する。NTPは、ただ時刻を合わせるだけでなく、いくつかの工夫で信頼性と精度を高めているんだ。


NTPとSNTPの違い

ついでに、よく似たプロトコルに SNTP(Simple Network Time Protocol) がある。 SNTPはNTPを簡易化したもので、クライアントが単一のNTPサーバに時刻を問い合わせて、その時刻に合わせるだけの単純な動作をする。 一方、NTPは複数のサーバを参照し、より複雑なアルゴリズムで時刻を補正する。高精度が求められるサーバやネットワーク機器ではNTPを、そこまで厳密な精度が不要なIoT機器などではSNTPを使うことが多い。 プロトコルとしては同じUDPポート123番を使うから、NTPサーバとSNTPクライアント間で通信することは可能だよ。


タイムラグを考慮した賢い時刻合わせ


アオラニ: NTPのすごいところは、ただサーバの時刻をもらってきて合わせるだけじゃないんだ。通信にかかるタイムラグ遅延を考慮して、正確な時刻を計算している。

ノア: タイムラグ? 通信の遅れのことですか? それをどうやって計算するんですか?

アオラニ: その通り。NTPの通信には、4つのタイムスタンプが使われる。

  1. Origin Timestamp (T1):クライアントがリクエストパケットを送信した時刻。

  2. Receive Timestamp (T2):サーバがリクエストパケットを受信した時刻。

  3. Transmit Timestamp (T3):サーバがレスポンスパケットを送信した時刻。

  4. Receive Timestamp (T4):クライアントがレスポンスパケットを受信した時刻。

この4つのタイムスタンプを使って、クライアントは「往復にかかった時間」と「クライアントとサーバの時刻のズレ」を計算する。

  • 往復時間(ディレイ):(T4​−T1​)−(T3​−T2​)

  • 時刻のズレ(オフセット):2(T2​−T1​)+(T3​−T4​)​

この計算式によって、たとえ通信に遅延があっても、その影響を打ち消し、より正確な時刻を導き出せるんだ。 NTPは、これを複数回、複数のサーバに対して実行し、統計的に最も信頼性の高い時刻を算出する。まさに、高度な数学的アプローチだね。


階層構造で最上位の負荷を軽減する「Stratum」


ノア: 複数のサーバを参照するってことは、たくさんのコンピュータが一斉に時刻合わせをするんですよね? それって、最上位のサーバにすごく負荷がかかりませんか?

アオラニ: いい視点だ! その負荷問題を解決するために、NTPには Stratum(ストラタム) という階層構造が導入されている。 Stratumは、時刻源からの距離を示す指標で、数字が小さいほど信頼性が高い時刻源に物理的に近いことを意味する。

  • Stratum 0原子時計GPSなど、非常に高精度な時刻源そのものを指す。ネットワーク上には存在しない。

  • Stratum 1:Stratum 0に直接接続されたNTPサーバ。

  • Stratum 2:Stratum 1のサーバに時刻を同期しているサーバ。

  • Stratum 3:Stratum 2のサーバに同期しているサーバ。

このように、階層を設けることで、すべてのクライアントが最上位のサーバに直接アクセスする必要がなくなり、負荷が分散される。普段私たちが使っている公開NTPサーバの多くは、Stratum 2や3だ。


時刻を大きく変えると何が起きる?


ノア: 時刻のズレは、自動で補正してくれるんですよね。じゃあ、特に意識しなくてもいいってことですか?

アオラニ: いや、それが一番危険な考え方だ。時刻の補正方法には、システムに大きな影響を与える可能性がある。

NTPには、時刻を補正する2つのモードがある。


1. slewモード

  • 動作: 時刻のズレを、時計の進みを遅くしたり速くしたりすることで、少しずつ補正していく方法。

  • 特徴: システム時刻が過去に戻ったり、急に進んだりしないため、ログの時系列が狂うことがない。アプリケーションによっては、時刻が急激に変化すると誤動作するものもあるため、このモードが望ましい。


2. stepモード

  • 動作: 時刻のズレを検知したとき、一気に正しい時刻にジャンプさせる方法。

  • 特徴: 時刻が急に過去に戻ったり、大きく進んだりするため、ログの時系列に不整合が生じたり、処理中のタイムアウトが正しく働かなくなったりする可能性がある。

多くのNTP実装では、ズレが小さいときはslewモード、ズレが大きいときはstepモードで動作するようになっている。この閾値はデフォルトで128ミリ秒くらいに設定されていることが多い。この「一気に時刻が飛ぶ」挙動が、システムに予期せぬトラブルを引き起こすことがあるんだ。


ネットワークエンジニアとしての時刻同期の鉄則


アオラニ: ここからは、実際にシステムを運用する上で、プロとして知っておくべきポイントをいくつか話そう。


1. 参照するNTPサーバは1つにしない

時刻参照先は、必ず複数用意すること。一つしか用意しないと、そのNTPサーバがダウンしたり、応答が遅くなったりしたときに、時刻同期ができなくなる。複数のサーバを参照し、多数決相互補正によって最も信頼性の高い時刻を選ぶことで、単一障害点(SPOF)をなくし、より堅牢なシステムを構築できる。


2. Active Directory(AD)環境内での時刻同期を優先する

Windows環境でADを使っている場合、クライアントPCやメンバーサーバは、外部のNTPサーバではなく、ADのドメインコントローラ(DC)を時刻源として参照させるべきだ。Kerberos認証をはじめ、ADの様々な機能はドメイン内の時刻同期を前提としている。ドメイン内の時刻を統一し、その上でドメインのPDCエミュレーターという特別な役割を持つDCが、外部の信頼できるNTPサーバと時刻を同期するように構成するのがベストプラクティスだ。


3. 仮想サーバの時刻同期はホストに任せない

VMwareやHyper-Vなどの仮想化環境では、ホストOS(仮想化基盤)がゲストOS(仮想サーバ)に時刻同期機能を提供していることが多い。でも、基本的にこの機能は使ってはいけない。なぜなら、ホスト側の時刻がずれると、ゲストの時刻も一斉にずれてしまうし、ホストとゲスト間の通信遅延によって時刻精度が低くなるからだ。ゲストOS自身でNTPクライアントを動かし、外部の信頼できるNTPサーバと直接時刻同期させるのが鉄則だ。



踏み台にされない!NTPリフレクション攻撃と対策


ノア: ところで、インターネット上のNTPサーバって、誰でも使えるんですか? 何かセキュリティ的な問題はないんでしょうか?

アオラニ: 鋭い質問だ、ノア。時刻同期のプロトコルであるNTPも、悪意のある攻撃に利用されることがある。それが NTPリフレクション攻撃 だ。


NTPリフレクション攻撃とは

この攻撃は、UDPの特性(送信元のIPアドレスを偽装できる)を悪用した、DDoS(分散型サービス拒否)攻撃の一種だ。攻撃者は、攻撃対象のIPアドレスを送信元に偽装し、インターネット上の多数の公開NTPサーバに、特定のコマンド(monlistなど)を含む小さなリクエストパケットを送る。このコマンドは、過去に接続したクライアントのリストなど、大きなデータを含むレスポンスを返す性質がある。NTPサーバは、偽装されたIPアドレス、つまり攻撃対象に、巨大なレスポンスパケットを送信してしまう。結果として、攻撃対象には大量のデータが一斉に送りつけられ、サービスが停止に追い込まれるんだ。


対策

この攻撃の踏み台にされないためには、不要なNTPサービスは公開しないことが重要だ。 具体的には、

  • インターネットに公開しているサーバで、NTPサーバ機能が必要ない場合は無効にする。

  • 必要な場合は、外部からのmonlistなどの特定のコマンドを無効化する設定を行う。

  • ファイアウォールで外部からのUDPポート123番へのアクセスを厳しく制限する。

自分のサーバが、気づかないうちに誰かを攻撃する加害者にならないよう、セキュリティ対策は怠らないようにしよう。


最後に


ノア: アオラニさん、ありがとうございました! 時刻合わせがこんなに奥深いとは思いませんでした。ただの機能じゃなくて、システムの信頼性やセキュリティを根底から支える、すごく重要なものなんですね。

アオラニ: そうだろ? ITエンジニアの仕事は、一見地味なことの中にこそ、本質的な知識が隠れているものだ。 君が将来、どんなシステムを設計・構築するにしても、時刻同期の重要性を忘れずにいてほしい。 目の前の課題だけでなく、その背景にある「なぜ?」を深く考える癖をつけること。それが、君を一流のエンジニアへと成長させてくれるはずだ。 応援しているぞ!

いいなと思ったら応援しよう!

aolaniengineer よろしければ応援お願いします! いただいたチップはクリエイターとしての活動費に使わせていただきます!