Amazon S3の署名バージョン2廃止に伴うAWS SDK/AWS CLIの対応方法まとめ

AWSのS3において、ひっそりと署名バージョン2の廃止がアナウンスされています。これにより、2019年6月24日以降は署名バージョン4で署名しないとS3にアクセス(アップロード/ファイル取得など)ができなくなります。

廃止に関するリリースは見当たりませんが、開発者ガイド内に「Amazon S3 における AWS 署名バージョン 2 の廃止」という見出しの記載があります。

【2019/06/19追記】
AWSから廃止時期の延期と変更がアナウンスされました。
署名バージョン2の廃止は2020年6月24日以降に作成された新しいバケットのみを対象とし、既存のバケットについては引き続き署名バージョン2のサポートが行われます。
ただし、AWSではセキュリティと効率性から既存のバケットに関しても署名バージョン4へ移行することを推奨しています。

弊社でも一部のサービスで廃止予定の署名バージョンを利用しており、対応が必要なことが分かりました。サービス影響が大きい部類のアップデートだと思うのですが、今ひとつ認知されていないように思うので、私なりに情報を整理してまとめてみました。

AWS S3での署名バージョン2廃止に関する基礎知識

AWS 署名バージョンって何?

AWSにAPIリクエストを送る際にリソースに対する操作権限を持つかの認証に署名が使われます。

現在、S3では署名バージョン2署名バージョン4の2種類があるのですが、署名バージョン2のサポートが2019年6月24日に終了となり、それ以降は署名バージョン4しか使用できなくなります。

一部のリージョンでは既に(リージョン開設時から)署名バージョン4を使用する必要があります。

AWS SDKやAWS CLIを使っていれば大丈夫?

IAMでユーザーを作成したときに発行される「アクセスキー ID」と「シークレットアクセスキー」を用いて署名を作成していて、公式で提供されているAWS SDKAWS Command Line Interface (AWS CLI) を利用していても、使用しているバージョンによっては署名バージョン2の廃止の影響を受けます

いつ発表されたの?

公式のリリースが見つけられなかったので正確な日付は分かりませんが、少なくとも今年の2月19日に開発者ガイドのGitHubリポジトリに修正が加えられていることを確認しました。

対応しないとどうなる?

S3へのアップロード(putObject)はもちろん、ファイル一覧取得(listObjects)すらできなくなります。2019年6月24日以降は署名バージョン2で署名されたS3へのAPIリクエストは署名の認証失敗とともにエラーメッセージが返されるようになります。

恐らく、既に署名バージョン4の利用が必須のリージョンで署名バージョン2を使用したときのように「The authorization mechanism you have provided is not supported. Please use AWS4-HMAC-SHA256.」というエラーメッセージを含むレスポンスが返ってくるようになるのではないでしょうか。

AWS SDK、AWS CLIの対応状況

前述している通り、公式で提供されている「AWS SDK」や「AWS CLI」を利用していても影響を受ける可能性があります。弊社は主に「AWS SDK for PHP」と「AWS CLI」を使用しているので、左記に関してのみ影響の有無を記載します。その他のAWS SDKについては署名バージョン 2 から署名バージョン 4 への移行をご覧ください。

AWS SDK for PHP v1

署名バージョン2を利用しているため、2019年6月24日以降利用できなくなります。SDK内には署名バージョン4に関するクラスがあるようですが、AmazonS3クラスのauthenticateメソッド内にバージョン2の署名を生成する処理が直接実装されていました。

AWS SDK for PHP v3にアップグレードが必要です。

AWS SDK for PHP v3はPHP5.5以上が必須です。PHP5.4以下の場合はAWS SDK for PHP v2を使用する方法を検討してみてください。(既にEOLを迎えているバージョンなので、この機会にPHP自体のバージョンアップを検討してみてはいかがでしょうか。)

AWS SDK for PHP v2

開発者ガイドには「主要バージョン V3 にアップグレード」と記載がありますが、2.8系のバージョンであればAws\S3\S3ClientのcreateSignatureメソッドで署名バージョンの指定のオプションを入れることで、署名バージョン4を利用することができそうです。

もちろん、AWS SDK for PHP v3にアップグレードしても回避できます。

AWS SDK for PHP v3

v3ではデフォルトで署名バージョン4を利用しているため、対応不要です。

AWS CLI

バージョン1.11.108以上にアップグレードする必要があります。

自分のシステムで署名バージョン4を利用しているか確認したい

「上記の対応を行ったが署名バージョン4を使っているか心配」や「独自実装してるから署名バージョンが分からない」という場合は下記のような方法で2019年6月24日以降も使用できるか確かめることが可能です。

署名バージョン4しか使用できないリージョンのS3で検証

上述したように、既に署名バージョン2が利用できないリージョンが存在します。そのリージョンにバケットを作成し、検証させることで署名バージョン4で署名できているか確認することができます。

署名バージョン4しか使用できないリージョンで、署名バージョン2を利用している場合は以下のような内容のレスポンス(status=400)が返ってきます。

<?xml version="1.0" encoding="UTF-8"?>
<Error>
    <Code>InvalidRequest</Code>
    <Message>The authorization mechanism you have provided is not supported. Please use AWS4-HMAC-SHA256.</Message>
    <RequestId>*****************</RequestId>
    <HostId>****************************************************************************</HostId>
</Error>

署名バージョン4を使用して署名する必要があるリージョン一覧 (2019/04/05時点)

・米国東部 (オハイオ) リージョン
・カナダ (中部) リージョン
・アジアパシフィック (ムンバイ) リージョン
・アジアパシフィック (ソウル) リージョン
・欧州 (フランクフルト) リージョン
・欧州 (ロンドン) リージョン
・中国 (北京) リージョン

CloudWatchにログを出力して確認

APIアクセスをCloudTrailを使用して証跡を追い、CloudWatch Eventで署名バージョン2を使用しているイベントを抽出・SNSトピックを発行することで署名バージョン2を使用していないことを確認することができます。

まとめ

廃止前後でのサービスへの影響は大きく、もっと騒がれてもいいアップデートだと思うのですが、今ひとつ周知されてないと思うので、この記事で1人でも問題に気づけた方がいれば幸いです。弊社でも対策に乗り出したばかりで調査不足なところもあるので、この記事自体もアップデートしていけたらと思います。

【2019/06/19追記】
冒頭でも追記したとおり、廃止予定の期日直前になってAWSから廃止時期の延期と変更がアナウンスされました。
署名バージョン2廃止のアナウンスよりも後に発表されたS3 path-styleの廃止予定は発表後10日あまりで廃止予定を変更しており、今回の署名バージョン2廃止もそれに準じた対応に見直されたということです。
弊社では5月中には署名バージョン4への移行作業をすべて終えていたので少し拍子抜けしたというのが本音ですが、まだ署名バージョン2を使っているという方もそのままにせず、この機会に署名バージョン4への移行を進めてみてください。