【NTP入門 第8回】NTPのセキュリティ ― 時刻をずらす攻撃、monlistの増幅攻撃、公開の制限、対称鍵の認証、NTSの仕組みと使い方

NTP サーバー
スポンサーリンク
スポンサーリンク

「うちのNTPサーバー、インターネットからの問い合わせにも答えているみたいです」
「NTSって最近よく聞きますが、入れたほうがいいんですか?」

NTPは、標準では暗号も認証もないUDPのやり取りです。第1回で見たように、認証・証明書・ログは「時刻は正しい」という前提で動いています。つまり時刻同期は、攻撃されると、ほかの仕組みの安全性まで崩れる土台なのです。

第8回では、NTPへの攻撃と、その守り方(公開の制限、認証、NTS)を扱います。


NTPへの攻撃

NTPサーバーとクライアントのやり取りに対し、①送信元を偽った応答、②中間者が10:00を10:05に書き換え、③行きだけ+50msの遅延の注入、④毎回+10msずつ閾値の下で少しずつずらす攻撃があり、認証で防げるのは①と②で、③は防げないことを示す図
  1. 偽の応答:送信元を偽ったNTPパケットを送り、誤った時刻を信じさせる
  2. 中間者(MITM):通信路の途中で応答を書き換える
  3. 遅延の注入:NTPは行きと帰りの遅延が等しいと仮定して計算するので(第3回)、片方向だけを遅らせると、パケットを書き換えなくても時刻がずれる
  4. 少しずつずらす攻撃:stepの閾値や監視の閾値を超えない小さなずれを繰り返し、気づかれないうちに大きくずらす

ほかに、NTPサーバーを止めるDoSや、踏み台にする増幅攻撃もあります。認証で防げるのは偽の応答と書き換えで、遅延の注入は防げません(RFC 7384)。独立した複数の時刻源を比べることも、防御の一部です。


時刻をずらされると何が起きるか

対象起きること
サーバー証明書進められると有効な証明書が期限切れに見え、通信できない。戻されると期限切れの証明書や古い CRL・OCSP 応答を受け入れる(連載「証明書入門」)
Kerberos既定で5分を超えてずれると認証に失敗し、ドメインのログオンやファイル共有が止まる(連載「Kerberos入門」第4回、連載「Active Directory入門」第8回)
TOTP(認証アプリの6桁、RFC 6238)30秒単位で時刻から作るので、ずれるとコードが通らない。端末の時計を進められると、未来のコードを盗み見られるおそれ
ログ・監査事象の順序が逆転し、改ざんの有無や発生時刻を示せない。偽の時刻で記録を残される
DNSSEC署名の有効期間の判定が狂い、検証に失敗する(または古い署名を受け入れる。連載「DNS入門」第9回)
ジョブ・バックアップ定時の処理の二重実行や未実行、世代の管理やキャッシュの期限が狂う

どれも「時刻は正しい」という前提で作られているため、時刻がずらされると、個々の仕組みに問題がなくても安全性が崩れます。特に「時計を戻す」攻撃は、期限切れの証明書や失効済みの情報を受け入れさせる、という点で危険です。


増幅攻撃(monlist、CVE-2013-5211)

US-CERTの示す増幅率がNTPは約557倍、DNSは28〜54倍であることと、攻撃者が送信元を被害者と偽った小さな要求を古いntpd(monlist有効)に送ると、最大600件の一覧という大きな応答が被害者に集中することを示す図
  • NTPはUDPなので、送信元を偽れる。攻撃者が送信元を被害者のアドレスに偽って、小さな問い合わせを多数のNTPサーバーに送ると、大きな応答が被害者に集中する。これが増幅(リフレクション)攻撃
  • 2013年から2014年にかけて大規模に悪用されたのが、ntpdの監視用の命令monlist。そのサーバーに最近アクセスした最大600件のアドレスを返すため、小さな要求に対して非常に大きな応答になり、US-CERTはNTPの増幅率を約557倍と示している(DNSは28〜54倍)
  • この脆弱性がCVE-2013-5211で、ntpd 4.2.7p26より前の版が既定で応じていた

現在のntpdはmonlistを無効にしており、chronyはmonlistを持ちません。ただし、古い機器や放置されたサーバーは今も残っています。冒頭の「インターネットからの問い合わせに答えている」NTPサーバーは、まさに踏み台の候補です。


公開の制限(chrony・ntpd)

# chrony(/etc/chrony.conf)
allow 192.0.2.0/24        # 社内にだけ配る
ratelimit                 # 既定は8秒に1回・バースト8
cmdport 0                 # chronyc の UDP ポートを閉じる(ローカルの UNIX ソケットは使える)

# ntpd(/etc/ntp.conf)
restrict default -4 nomodify notrap nopeer noquery
restrict default -6 nomodify notrap nopeer noquery
restrict source nomodify notrap noquery
restrict 192.0.2.0 mask 255.255.255.0 nomodify notrap nopeer noquery
  • chrony:既定ではクライアントを受け付けない(allowがなければ純粋なクライアント)。サーバーにするときはallowで配る範囲だけを許可する。監視用のポート(UDP 323)は既定でローカルからだけ
  • ntpd:restrict … noqueryで監視用の問い合わせ(モード6・7)を拒否し、時刻の応答だけを返す(RFC 8633の例)
  • 応答の制限:chronyのratelimit、ntpdのlimited kodで、問い合わせが多すぎる相手への応答を絞る。NATの後ろの多数の端末は1つのアドレスに見える点に注意

外部からのUDP 123の制限

通信向き許可する範囲備考
NTP(UDP 123)社内の NTP サーバー → 外部の時刻源送信元と宛先を限定応答はステートフルに許可
NTP(UDP 123)社内の機器 → 社内の NTP サーバー社内のセグメント機器から外部への直接の NTP は拒否
NTP(UDP 123)インターネット → 社内原則拒否公開するなら専用のサーバーに allow・ratelimit
NTS-KE(TCP 4460)社内の NTP サーバー → NTS サーバー参照先に限定NTS を使うとき
chrony の監視(UDP 323)監視サーバー → NTP サーバー監視サーバーだけ既定はローカルのみ
ntpd の制御(モード6・7)外部 → NTP サーバー拒否noquery
インターネットの外部の時刻源・NTSサーバーとの間で、ファイアウォールが社内のNTPサーバーだけにUDP 123とTCP 4460を宛先を限定して許可し、外から社内へのUDP 123と機器から外へのUDP 123は拒否し、社内の機器は社内のNTPサーバーにUDP 123で、監視サーバーはUDP 323でつなぐことを示す図

クライアントの送信元ポートは123とは限りません(RFC 9109)。応答しないかは、管理下のアドレスに限り、nmap -sU -p 123 --script ntp-infoやw32tm /stripchart /computer:203.0.113.10 /samples:1 /dataonlyで確かめます(Test-NetConnectionはUDPを試せない)。

外とUDP 123で話せる穴は、社内のNTPサーバーの1か所だけにします(第7回の3層)。


対称鍵による認証

  • サーバーとクライアントが同じ鍵(鍵番号と鍵)を持ち、NTPパケットにメッセージ認証コード(MAC)を付けて検証する。偽の応答と書き換えを防げる
  • RFC 5905のMD5は弱い。RFC 8633はAES-128-CMAC(RFC 8573)への移行を勧める。chronyではAES128・AES256、SHA1・SHA256等も選べ、MD5は避けるよう明記されている
  • 弱点は、鍵の配布と更新が手作業になること。台数が多いと運用が重い。ネットワーク機器はMD5しか選べないものも多いので、機種ごとに確認する
  • ADドメインのWindowsは、MS-SNTPでドメインの秘密情報(Netlogonのセッションキー)を使って、DCの応答に署名する。ドメインの外の時刻源は認証されない(第5回)
  • Autokey(RFC 5906)は脆弱性が見つかっており、使わない(RFC 8633)
$ chronyc keygen 10 AES128        # 鍵を生成(出力を両側の鍵ファイルに書く)
10 AES128 HEX:(32桁の16進数)
# /etc/chrony.keys は root と chrony だけが読める権限にする
# クライアント側 /etc/chrony.conf
keyfile /etc/chrony.keys
server ntp1.corp.example.jp iburst key 10

NTSの仕組み

NTS(Network Time Security、RFC 8915、2020年)は、鍵の手配布なしにNTPを守る仕組みで、2段階で動きます。

クライアントがNTS-KEサーバーとTCP 4460でTLS 1.3の接続を張って証明書を検証し、暗号方式の決定とクッキー8個を受け取り、TLSから取り出した鍵とクッキーを保持したうえで、NTPサーバーにUDP 123でNTP+クッキー1枚+認証を送り、時刻+認証+新しいクッキー1枚を受け取ることを同期のたびに繰り返すことを示す図
  1. NTS-KE(鍵の確立):クライアントはNTS-KEサーバーとTCP 4460でTLS 1.3の接続を張り、サーバー証明書を検証したうえで、使う暗号方式(AEAD。AES-SIV-CMAC-256は必須)を決め、TLSから鍵を取り出し、クッキー(通常8個)を受け取る
  2. NTP(UDP 123):通常のNTPの要求に、クッキーと認証用の拡張フィールドを付けて送る。サーバーはクッキーを自分の鍵で復号して鍵を取り出し、応答に認証を付け、新しいクッキーを返す
  • サーバーは状態を持たずに済み、クッキーは使い捨てなので、端末を追跡されにくい
  • 時刻の中身は暗号化されないが、なりすましと書き換えを防げる
  • TLSを使うのは鍵の受け渡しだけ。時刻のやり取りは、従来どおりUDP

NTSを使うときの注意

  • 時刻と証明書の鶏と卵:NTS-KEは証明書の有効期間を検証するので、時計が大きくずれていると接続できない。RTCのない機器では、chronyのnocerttimecheck 1(最初の1回だけ期間の検査を外す)など、初回の同期の方法を決めておく。Ubuntuは初回用のntp-bootstrap.ubuntu.comを用意している
  • TCP 4460を通す:塞がれていると同期できない。Ubuntu 25.10以降の新規インストールはchrony+NTSが既定で、4460を塞ぐ社内では時刻が合わなくなる(NTSなしに戻す手順が公開されている)
  • 名前で指定する:証明書を検証するので、IPアドレスではなくホスト名で指定する
  • 認証なしの時刻源と混ぜるとき:chronyの既定(authselectmode mix)では、認証なしの時刻源は、NTSの時刻源の多数派と一致するときだけ使われる
  • 社内にNTSサーバーを立てる:chronyのntsserverkey・ntsservercert。社内CAの証明書なら、クライアントにntstrustedcertsを書く。証明書を更新したらchronydの再起動が必要(連載「証明書入門」第8回)

NTSの対応状況(2026年9月)

区分対象状況
実装chrony4.0(2020年)以降で対応。最新は 4.9(2026年8月)
実装Windows Time(w32time)Microsoft Learn に NTS 対応の記載なし。ドメイン内は MS-SNTP
OS の既定Ubuntu 25.10 以降(新規インストール)chrony+NTS(ntp.ubuntu.com)が既定
公開サーバーCloudflare time.cloudflare.com対応
公開サーバーNetnod nts.netnod.se、PTB ptbtime1.ptb.de 等対応(stratum 1)
公開サーバーNICT ntp.nict.jp公式の案内なし(TCP 4460 は応答なし)
公開サーバーGoogle、pool.ntp.org未対応。プールで NTS を使う拡張は IETF で検討中

冒頭の「NTSは入れたほうがいいか」への答えです。日本国内の公開NTSサーバーはまだ少なく、海外のサーバーでは遅延が大きく精度が落ちます。社内のNTPサーバーだけが外部とNTSで話し、社内には従来のNTPをallowとファイアウォールで守って配る構成が現実的です。

インターネットのtime.cloudflare.com・nts.netnod.se・ptbtime1.ptb.de(NTS)とntp.nict.jp(NTSなし)を社内のNTPサーバー(chrony、server … nts、ntsdumpdir、allow、ratelimit)が参照し、NICTはNTSの多数派と一致するときだけ使い、社内へはLinuxサーバーにchrony(NTP)をallowとFWで守って、ADのDCからメンバーへはMS-SNTPで、ネットワーク機器へは対応機種のみ対称鍵で配ることと、時計が大きくずれているとNTS-KEに接続できないことを示す図

設定例:chronyでNTSを使う

# 社内の NTP サーバーが外部を NTS で参照する例(/etc/chrony.conf)
server time.cloudflare.com iburst nts
server nts.netnod.se iburst nts
server ptbtime1.ptb.de iburst nts
server ntp.nict.jp iburst          # NTS なし。NTS 側の多数派と一致するときだけ使われる
ntsdumpdir /var/lib/chrony         # クッキーを保存し、再起動時の NTS-KE を省く

$ sudo chronyc -N authdata         # 認証の状態(root で実行。行は chrony の文書の例)
Name/IP address             Mode KeyID Type KLen Last Atmp  NAK Cook CLen
=========================================================================
ntp1.example.net             NTS     1   15  256 135m    0    0    8  100
  • ModeがNTSなら、NTSで認証できている。Atmp(鍵の確立の失敗回数)が2以上なら、ネットワークかサーバーの問題
  • Typeの15はAEAD-AES-SIV-CMAC-256。-Nは名前で表示するオプション
  • WindowsはNTSを使えないため、Windowsのサーバーは社内のNTPサーバー(DC経由)から受け取る構成にする

守りの全体像

NTPを守る4つの層として、①公開を制限する(allow・noquery・ratelimit・cmdport 0)で増幅攻撃と情報の漏えいを、②通り道を1か所にする(FWでUDP 123は社内のNTPサーバーだけ)で外からの問い合わせと機器の直接の外部参照を、③応答を認証する(対称鍵・MS-SNTP・NTS)で偽の応答と書き換えを、④比べて見張る(独立した時刻源を4つ以上・ずれの監視)で遅延の注入や少しずつずらす攻撃を止め、認証は届くまでの時間を守れないので④で補うことを示す図

認証は大事ですが、それだけでは足りません。公開を絞り、通り道を1か所にし、応答を認証し、複数の時刻源で見張る、の4つを重ねて守ります。


考えてみよう

  1. 自社のNTPサーバーは、インターネットからUDP 123の問い合わせに応答していませんか。どう確かめますか。
  2. 社内でNTSを使うとしたら、どこからどこまでをNTSにしますか。TCP 4460と証明書の更新はどう扱いますか。
  3. 攻撃者がサーバーの時刻を1日戻せたら、自社のどのシステムで何が起きますか。

ヒント:この記事の「時刻をずらされると何が起きるか」の表、ファイアウォールの表、NTSの注意点が手がかりです。確認は自社の管理下のアドレスに限り、Linuxはnmap -sU -p 123 --script ntp-info、Windowsはw32tm /stripchart /computer:<アドレス> /samples:1 /dataonlyで応答の有無を見ます。


まとめ

  • NTPへの攻撃は偽の応答・中間者・遅延の注入・少しずつずらす。認証は遅延の注入を防げない
  • 時刻をずらされると、証明書・Kerberos・TOTP・ログ・DNSSECの前提が崩れる
  • monlist(CVE-2013-5211)の増幅率は約557倍。古い機器を残さない
  • chronyはallowで配る範囲を絞り、ntpdはnoquery。外とUDP 123で話すのは社内のNTPサーバーだけ
  • 対称鍵はAES-CMACで。ADはMS-SNTPで署名される
  • NTSはTCP 4460のTLS 1.3で鍵を受け取り、UDP 123を守る。時計のずれ(鶏と卵)とTCP 4460に注意
  • 現実的には外とだけNTS、社内は従来のNTPを囲って配る

次回は、NTPより高い精度が必要な場面で使うPTPを扱います。


連載「NTP入門」全11回

全回の目次と、読む順番・目的別の読み方は、NTP入門の入口のページにまとめています。

  1. なぜ時刻同期が必要か
  2. 時刻の基礎知識
  3. NTPの仕組み
  4. Linuxの時刻同期(chrony)
  5. Windowsの時刻同期
  6. ネットワーク機器・仮想基盤
  7. 設計と推奨構成
  8. NTPのセキュリティ(この記事)
  9. PTPと高精度同期
  10. 時刻同期のトラブルシュート
  11. 時刻同期の設計演習
seichan

ご連絡は X (twitter) の DM へお願いします.

seichanをフォローする
スポンサーリンク
スポンサーリンク
NTP サーバー
シェアする
seichanをフォローする

スポンサーリンク
スポンサーリンク

コメント

タイトルとURLをコピーしました