エキサイトの武藤です。
オンプレ環境のサーバをAWS EC2へ移行する際に、サーバ時刻の同期について注意点があります。
サーバ時刻を扱うアプリケーション
アプリケーションによっては、サーバ時刻をアプリケーションの実装に利用するケースがあります。 例えば、JWTを使った認証処理です。
JWTでは、トークン内にclaimといわれる情報を含めることができ、その情報を使って認証を行います。時刻に関するclaimを下記に列挙します。
The "exp" (expiration time) claim identifies the expiration time on or after which the JWT MUST NOT be accepted for processing. The processing of the "exp" claim requires that the current date/time MUST be before the expiration date/time listed in the "exp" claim.
exp
は、有効期限の日時です。
The "nbf" (not before) claim identifies the time before which the JWT MUST NOT be accepted for processing. The processing of the "nbf" claim requires that the current date/time MUST be after or equal to the not-before date/time listed in the "nbf" claim. Implementers MAY provide for some small leeway, usually no more than a few minutes, to account for clock skew. Its value MUST be a number containing a NumericDate value. Use of this claim is OPTIONAL.
nbf
は、トークンが有効になる開始日時です。
The "iat" (issued at) claim identifies the time at which the JWT was issued. This claim can be used to determine the age of the JWT.
iat
は、トークンが発行された日時です。
複数台構成で起きうる不具合
複数台で構成された認証システムの場合、時刻同期を厳密に設定しておかないと、思わぬ不具合に繋がります。
例えば、クライアントがサーバAからトークンを受け取り、サーバBにトークンを付与してリクエストする場合を考えます。このとき、サーバAがサーバBより10秒進んでいるとします。
サーバBがそのトークンの iat
を検証すると、未来の日時で発行されたトークンとなるため、不正になります。
反対に、サーバBで生成したトークンをサーバAで認証する場合、正常に動作します。 大雑把に言えば、2回に1回程度リクエストが失敗するような挙動になります。
オンプレ時代は、オンプレネットワーク内のNTPサーバと同期を取っていましたが、AWSに移行したタイミングで同期ズレが起きてしまいます。
EC2のサーバの時刻同期をする
AWSには、Amazon Time Sync Service という世界標準時刻と同期するためのサービスがあります。
全てのインスタンスから 169.254.169.123
でアクセスできます。
今回は、Ubuntuインスタンスの場合のntpサーバと同期する手順を紹介します。
/etc/ntp.conf
の設定ファイルにNTPサーバのIPを追加します。
server 169.254.169.123
追加後、再起動すると設定が有効になります。
sudo /etc/init.d/ntp restart
上記の操作では、即時に反映されないので少し待つ必要があります。
即時に同期させたい場合は下記の手順を行います。
sudo /etc/init.d/ntp stop sudo ntpdate 169.254.169.123 sudo /etc/init.d/ntp start
一度ntpを停止する必要がありますので、注意してください。
まとめ
今回は、オンプレからAWSにマイグレーションしたEC2における、サーバ時刻の同期ズレによる不具合について説明しました。 確率で再現性が低くなるので意外と見落としてしまうかもしれません。移行の際はこの辺の確認も必要です。
ご参考になれば幸いです。