
モダンな時刻同期基盤の構築:chrony の基本設定と運用上の留意点
これまでの記事では、NTPの基礎、Stratum構造と時刻同期の仕組みを解説しました。今回は、実際にNTPサーバーを構築し安全かつ高精度に運用するために、chronyを使用した具体的な設定手順とベストプラクティスをご紹介します。
💾 サーバー構築に推奨されるソフトウェア:chrony
前回も触れましたが、現在では多くのLinuxディストリビューションで、従来のntpdよりも高速で安定性に優れるchronyが標準のNTP実装として推奨されています。今回はchronyを例に解説を進めます。
1. chrony のインストールと起動
ほとんどのLinux環境ではパッケージ管理ツールから簡単にインストールできます。
RHEL/CentOS系:
sudo dnf install chronyDebian/Ubuntu系:
sudo apt update
sudo apt install chronyインストール後、サービスを有効化し、起動します。
sudo systemctl enable chronyd
sudo systemctl start chronyd※ディストリビューションによってはサービス名がchronyの場合もあります。また、RHEL/CentOS系の古いバージョンでは dnf ではなく yum を使用する場合があります。
2. 基本設定ファイル (chrony.conf) の編集
chronyの主要な設定ファイルは、通常 /etc/chrony.conf です。
A. 参照元(上位NTPサーバー)の設定
信頼できるStratum 1やStratum 2サーバーを指定します。特に日本国内でNTPサーバーを指定する場合は、NICTのNTPサーバー(ntp.nict.jp)を利用するのが一般的です。
# NTP Pool Projectからの推奨サーバー (geo-specific)
# pool <ホスト名> iburst maxsources 4
# NICT (情報通信研究機構) の公開NTPサーバー
server ntp.nict.jp iburst
# 複数のサーバーを指定することで冗長性を確保
server ntp.nict.jp iburst
server ntp.nict.jp iburst💡 iburstオプション: クライアント起動時に、より迅速に時刻を同期させるため、一度に複数のパケットを送信するオプションです。
💡 NICTのNTPサーバーは、同一のFQDNで複数のNTPサーバーが動作しており、上記のように同じFQDNを複数記述することで冗長性を確保することができます。
B. ローカルクライアントへのアクセス許可
このサーバーを社内ネットワークやローカル環境のクライアントに提供する場合、クライアントからのアクセスを許可する必要があります。
# ネットワーク内の特定のサブネットからのアクセスを許可
allow 192.168.1.0/24⚠️ 注意: allow 0.0.0.0/0 などとして外部インターネット全体からのアクセスを許可することは、セキュリティ上のリスクとなるため設定してはいけません。
3. 設定後の確認コマンド
設定ファイルを保存し、chronyサービスを再起動した後、状態を確認します。
sudo systemctl restart chronyd
# 同期状態を確認
chronyc sources
# 動作状況(オフセット、周波数調整など)を確認
chronyc tracking💡chronyc sourcesの出力で、サーバーの左側に * が付いているものが現在時刻の同期元として選択されているサーバーです。
chronyc sources を実行して同期状態を確認すると、以下のように同期しているNTPサーバーが表示されます。ここではpoolを8行記述していますので8つのNTPサーバーが表示されています。
MS Name/IP address Stratum Poll Reach LastRx Last sample
======================================================
^- 2001:ce8:78::2 1 10 377 155 -4079us[-4079us] +/- 13ms
^+ ntp-a3.nict.go.jp 1 10 377 390 +1701us[+1701us] +/- 6043us
^+ ntp-a2.nict.go.jp 1 10 377 375 -201us[ -201us] +/- 3517us
^- ntp-k1.nict.jp 1 10 377 143 -53us[ -53us] +/- 8156us
^+ ntp-b3.nict.go.jp 1 10 377 24m +397us[ +456us] +/- 3326us
^* ntp-b2.nict.go.jp 1 10 377 1098 -165us[ -105us] +/- 3000us
^+ ntp-a2.nict.go.jp 1 10 377 858 +157us[ +157us] +/- 3379us
^+ ntp-a3.nict.go.jp 1 10 377 148 -514us[ -514us] +/- 3663us
🔒 セキュリティのためのベストプラクティス
NTPサーバーは、DDoS攻撃の踏み台にされるなど、セキュリティ上のターゲットとなることがあります。以下の対策は必須です。
1. アクセス制御の徹底(必須)
上記「ローカルクライアントへのアクセス許可」で説明した通り、allowディレクティブでアクセス元IPアドレスを厳密に制限する必要があります。
2. ファイアウォール設定
NTPはUDPポート123を使用します。ファイアウォールで、信頼できるネットワークからのUDP/123ポートのみを開放し、それ以外のすべての外部からのアクセスをブロックしてください。また、上位NTPサーバーへのアクセスも同じポートを使用しますので、NTPサーバーから外向きの通信を制限しないようにご注意ください。
3. NTS (Network Time Security) の検討
NTSは、NTPの通信にTLS(Transport Layer Security)ベースの暗号化と認証を追加する新しい標準です。NTPv4の時代から利用が進んでおり、Man-in-the-Middle攻撃(中間者攻撃)やなりすましを防ぐ上で非常に有効です。
💡chronyのNTSサポート: chronyはバージョン4.0以降でNTSをサポートしています。より高いセキュリティレベルが求められる環境では、NTS対応の公開NTPサーバー(例えば、CloudflareやAkamaiが提供)を参照し、NTSを有効化することを強く推奨します。
✨ 運用上の注意点と高精度を保つコツ
1. 複数のサーバーを参照する(冗長性)
最低でも3つ以上の独立したNTPサーバーを参照することで、1つが誤った時刻を返した場合でも、正確な時刻を選択し続ける「クォーラム(多数決)」機能が有効に働きます。
2. restrictディレクティブでの保護
chronyやntpdには、制御パケット(chronycやntpqコマンド)のアクセスを制御するrestrictディレクティブがあります。リモートからの制御コマンド実行を拒否し、ローカルホスト(127.0.0.1)からのみ許可するように設定することで、サーバーの設定改ざんを防ぎます。
3. ハードウェアクロックとの連携
Linuxシステムは、OSのソフトウェアクロックの他に、マザーボード上のハードウェアクロック(RTC/CMOSクロック)を持っています。
chronyは、ソフトウェアクロックを正確に保った上で、makestepディレクティブやrtcsyncディレクティブを用いて、正確な時刻をハードウェアクロックにも書き込むことが可能です。これにより、再起動時などに大幅な時刻のズレが発生することを防ぎます。
♨︎ 最後に
NTPサーバーの構築は、システムのログの整合性、タイムスタンプが関わる取引の正確性、そしてセキュリティ確保の基盤となります。特にchronyのようなモダンなソフトウェアを活用し、適切なアクセス制御とセキュリティ設定を行うことで、堅牢で信頼性の高い時刻同期環境を実現できます。


