INSIGHT

情報・インサイト

S3の署名バージョンアップ方法

2019.08.19

こんにちは。

皆さん、AWSのS3は使用されていますか?

画像ファイルや、CSVファイルなどを保存することができ、比較的に運用コストも安いので使用されている方も多いのではないでしょうか?

初めに

少し前に社内でこんな話題がありました。

「AWS署名バージョン2の廃止の影響で、対応しないとアクセスができなくなる!?」

急いで確認を行うと、そのまさかでした・・・

という事で、今回は対応方法と、確認方法について紹介したいと思います!

前提

Javaを使用し、S3の操作ができている環境が整っている事が前提です。

確認方法

AWSのCloudTrialというサービスを使用し、S3にアクセスされたときの情報を取得し、バージョンの確認を行います。

CloudTrialとは

簡単に言うと、誰がいつどんな操作を行ったのかを監視し、保存してくれるサービスです。

証跡情報を作成

AWSのコンソール画面にログインを行い、サービス一覧の画面から「CloudTrial」を選択

java aws s3

CloudTrialのトップページで、証跡の作成を押下

java aws s3

証跡情報の作成画面で必要な情報を追加していきます。

特に重要な、データイベントストレージの場所の設定については詳しくご紹介します。

まずは初めに証跡名など、管理イベントですが、今回はあくまでも署名バージョンの確認を行うだけなので、あまりこだわる必要はないかと思います。

今回は証跡名は「s3-version-confirm」とし、管理イベントはデフォルトとしておきます。

次にデータイベントですが、ここではどんなイベントが発生したときの情報が必要かを設定します。

今回はすべてのバケット操作に対して情報が欲しい!と設定してみます。

java aws s3

チェックを入れるだけです。

最後にストレージの場所ですが、これは

実際にイベントを監視し、取得した情報をS3のバケットに追加することができますよ?

どうしますか?

もし、使用するとしたらどんなバケット名にしますか?

という項目です。

ですがこの設定に関しては別途使用量が発生する場合があります。

今回は結果を取得すればOKなので、最後に削除するのをお忘れなく。

java aws s3

作成するバケット名は「s3-version-confirm-json」としておきます。

最後に作成ボタンを押下し、S3のバケット一覧に「s3-version-confirm-json」が追加されていれば完了です!

署名バージョンの確認方法

では実際にS3のイベントを発生させます。

すると、S3のバケット一覧の「s3-version-confirm-json」の中に見覚えのないフォルダが出力されているはずです。

どんどん中に進んでいくと、ログファイルがありますので、ダウンロードします。

ログファイルの確認方法

このダウンロードしたログファイルの中はjson形式で表記されています。

vscodeなどを使用し、フォーマットを整えてください。

サンプルで用意したものがこちらになります。


{
    "Records": [
        {
            "eventVersion": "1.05",
            "userIdentity": {
                "type": "Root",
                "principalId": "******",
                "arn": "******",
                "accountId": "******",
                "accessKeyId": "******",
                "sessionContext": {
                    "attributes": {
                        "creationDate": "2019-05-31T07:04:24Z",
                        "mfaAuthenticated": "false"
                    }
                },
                "invokedBy": "signin.amazonaws.com"
            },
            "eventTime": "2019-05-31T07:13:19Z",
            "eventSource": "s3.amazonaws.com",
            "eventName": "HeadBucket",
            "awsRegion": "ap-northeast-1",
            "sourceIPAddress": "******",
            "userAgent": "signin.amazonaws.com",
            "requestParameters": {
                "bucketName": "******",
                "Host": "******"
            },
            "responseElements": null,
            "additionalEventData": {
                "SignatureVersion": "SigV4",
                "CipherSuite": "******",
                "bytesTransferredIn": 0.0,
                "AuthenticationMethod": "******",
                "x-amz-id-2": "******",
                "bytesTransferredOut": 0.0
            },
            "requestID": "******",
            "eventID": "******",
            "readOnly": true,
            "resources": [
                {
                    "type": "AWS::S3::Object",
                    "ARNPrefix": "******"
                },
                {
                    "accountId": "******",
                    "type": "AWS::S3::Bucket",
                    "ARN": "******"
                }
            ],
            "eventType": "AwsApiCall",
            "recipientAccountId": "******",
            "vpcEndpointId": "******"
        }
    ]
}

いろいろ内容を伏せていますがこんな感じのファイルが出力されます。

確認するところはSignatureVersionの項目に出力されている内容です。

上記のサンプルでは”SignatureVersion : SigV4″と出力されていますが、”SignatureVersion : SigV2″と表示されている方は対応が必要となります。

という事で、無事これで確認を行うことはできました。

対応が必要ではない方はこれで終了となります。

対応が必要な方は次に行きましょう!

署名バージョン対応方法

対応はとても簡単です!

S3をJavaから操作する時にクライアントの生成を行ってから実際の操作を行うと思います。

その生成時に「署名バージョンはSigV4ですよ~」って教えてあげるだけ!

実際のコードを見てみましょう!

/**
 * S3にファイルをアップロード
 */
public void uploadFile(String bucketPath, File file){
    // S3クライアントのインスタンスを取得
    AmazonS3Client client = getS3Client(accessKey, accessSecretKey);
    // ファイルのアップロード処理をつらつらと・・・
}

/**
 * S3クライアントの取得
 */
private AmazonS3Client getS3Client(String accessKey, String accessSecretKey){
    // 認証オブジェクトを作成
    AWSCredentials credentials = new BasicAWSCredentials(accessKey, accessSecretKey);
    // Configuration
    ClientConfiguration clientConfiguration = new ClientConfiguration();
    // プロキシとかタイムアウトとか何かいろいろ設定をつらつらと・・・


    // 署名バージョンの設定
    System.setProperty(SDKGlobalConfiguration.ENABLE_S3_SIGV4_SYSTEM_PROPERTY, "true");

    // AmazonS3Clientをインスタンス化
    return new AmazonS3Client(credentials, clientConfiguration);
}

uploadFileメソッドではクライアントの取得しか行ってませんが、実際はファイルをアップロードする処理を書いている想定ですが割愛しております。

見てほしいのはgetS3Clientメソッドで行っている署名バージョンの設定です。

たった1行で対応が可能となっております。

あとは、上記の確認方法を参考に、しっかりと署名バージョンが変更されていることを確認しましょう!

最後に

いかがでしたでしょうか?

意外と簡単に対応できたと感じていただけたら幸いです!

CloudTrialの証跡情報の削除をお忘れなく!!!

また、皆さんのお役に立てるような記事を投稿していけたらと思っておりますので、よろしくお願いします。

☆☆☆ 新しいことにチャレンジしたい!仲間と一緒に成長したい!やりがいのある仕事で充実した毎日を過ごしたい!そんな熱意をお持ちの方、私たちと一緒に働きませんか?ウィズテクノロジーでは一緒に働いていただけるエンジニアを大阪・東京で募集しています。☆☆☆

WORKS

導入事例

ウィズテクノロジーは大阪を拠点に、システム開発の分野で20年の実績を持つパートナー企業です。
業務効率化やDX支援など、さまざまな課題にワンストップで対応。
経験豊富なエンジニアが、企業の成長を技術面からしっかりサポートします。

導入事例一覧を見る
導入事例一覧を見る

RECRUIT

採用情報

未来に、価値ある選択を。

All WhizzTechnologyは、期待を超える価値をともにつくり、より良い未来へ導く仲間を募集しています。