オンプレからマイグレーションした AWS EC2 のサーバ時刻同期に注意

エキサイトの武藤です。

オンプレ環境のサーバを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における、サーバ時刻の同期ズレによる不具合について説明しました。 確率で再現性が低くなるので意外と見落としてしまうかもしれません。移行の際はこの辺の確認も必要です。

ご参考になれば幸いです。

参考

www.rfc-editor.org

docs.aws.amazon.com