{CloudFront}署名付き Cookie の使用



https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/private-content-signed-cookies.html


https://dev.classmethod.jp/articles/cloudfront-signed-cookie/

 

 

-- 1. コマンド等のインストール

-- 1.1 aws cli version 2 インストール

curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
aws --version

 

-- 1.2 jqインストール
sudo yum -y install jq


-- 2. S3 バケットを作成する

aws s3 ls

aws s3 mb s3://bucket123

 

 

-- 3. パブリックアクセスブロック設定の編集

-- 3.1 アカウントレベル
aws s3control put-public-access-block \
--account-id 999999999999 \
--public-access-block-configuration "BlockPublicAcls=false,IgnorePublicAcls=false,BlockPublicPolicy=false,RestrictPublicBuckets=false"

aws s3control get-public-access-block \
--account-id 999999999999

-- 3.2 バケットレベル
aws s3api put-public-access-block \
--bucket bucket123 \
--public-access-block-configuration "BlockPublicAcls=false,IgnorePublicAcls=false,BlockPublicPolicy=false,RestrictPublicBuckets=false"

aws s3api get-public-access-block \
--bucket bucket123


-- 4. バケットポリシーの設定

vim b.json

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicReadGetObject",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::bucket123/*",
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": "0.0.0.0/0"
                }
            }
        }
    ]
}

 

aws s3api put-bucket-policy \
--bucket bucket123 \
--policy file://b.json


aws s3api get-bucket-policy \
--bucket bucket123


-- 5. インデックスドキュメントの設定

vim index.html

<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
    <title>My Website Home Page</title>
</head>
<body>
  <h1>Welcome to my website</h1>
  <p>Now hosted on Amazon S3!</p>
</body>
</html>

aws s3api put-object --bucket bucket123 --key index.html --body index.html --content-type text/html

 

 

-- 6. ディストリビューションの作成


aws cloudfront create-distribution \
--origin-domain-name bucket123.s3.ap-northeast-1.amazonaws.com \
--default-root-object index.html

 

aws cloudfront list-distributions

aws cloudfront get-distribution \
--id AAAAAAAAAAAAAA

aws cloudfront get-distribution-config \
--id AAAAAAAAAAAAAA

 


-- 7. 信頼されたキーグループのキーペアを作成する


-- 7.1 パブリックとプライベートのキーペアを作成する

openssl genrsa -out private_key.pem 2048


openssl rsa -pubout -in private_key.pem -out public_key.pem


-- 7.2 パブリックキーを CloudFront にアップロードする

cat public_key.pem

※EncodedKeyの改行部分は\nで置き換える

vim pubkey.json

{
    "CallerReference": "cli-example",
    "Name": "ExampleKey",
    "EncodedKey": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxPMbCA2Ks0lnd7IR+3pw\nwd3H/7jPGwj8bLUmore7bX+oeGpZ6QmLAe/1UOWcmZX2u70dYcSIzB1ofZtcn4cJ\nenHBAzO3ohBY/L1tQGJfS2A+omnN6H16VZE1JCK8XSJyfze7MDLcUyHZETdxuvRb\nA9X343/vMAuQPnhinFJ8Wdy8YBXSPpy7r95ylUQd9LfYTBzVZYG2tSesplcOkjM3\n2Uu+oMWxQAw1NINnSLPinMVsutJy6ZqlV3McWNWe4T+STGtWhrPNqJEn45sIcCx4\nq+kGZ2NQ0FyIyT2eiLKOX5Rgb/a36E/aMk4VoDsaenBQgG7WLTnstb9sr7MIhS6A\nrwIDAQAB\n-----END PUBLIC KEY-----\n",
    "Comment": "example public key"
}


aws cloudfront create-public-key \
--public-key-config file://pubkey.json

aws cloudfront list-public-keys

aws cloudfront get-public-key \
--id DDDDDDDDDDDDDD

 


-- 7.3 キーグループの作成

aws cloudfront create-key-group \
--key-group-config '{
  "Name": "kg01",
  "Items": ["DDDDDDDDDDDDDD"],
  "Comment": "kg01"
}'


aws cloudfront list-key-groups

aws cloudfront get-key-group \
--id 11111111-2222-3333-4444-555555555555

 

--8. ディストリビューションへの署名者の追加


aws cloudfront get-distribution \
--id AAAAAAAAAAAAAA

aws cloudfront get-distribution-config \
--id AAAAAAAAAAAAAA


aws cloudfront get-distribution-config \
--id AAAAAAAAAAAAAA | jq -r .DistributionConfig > distribution.json

vim distribution.json


DefaultCacheBehavior -> TrustedKeyGroups を下記のように修正

    "TrustedKeyGroups": {
      "Enabled": true,
      "Quantity": 1,
      "Items": ["11111111-2222-3333-4444-555555555555"]
    },

 

aws cloudfront get-distribution-config \
--id AAAAAAAAAAAAAA | jq -r .ETag

aws cloudfront update-distribution \
--id AAAAAAAAAAAAAA \
--if-match EEEEEEEEEEEEEE \
--distribution-config file://distribution.json

 


-- 9. 署名付きCookieの生成


date +%s
date -d @1653007998

vim policy.json

{
    "Statement": [
        {
            "Resource": "https://xxxxxxxxxxxxxx.cloudfront.net/*",
            "Condition": {
                "DateLessThan": {
                    "AWS:EpochTime": 1653007998
                }
            }
        }
    ]
}

-- 9.1 CloudFront-Policyの生成

cat policy.json | tr -d "\n" | tr -d " \t\n\r" | openssl base64 | tr '+=/' '-_~'  | xargs | sed 's/ //g'

CloudFrontPolicy=$(cat policy.json | tr -d "\n" | tr -d " \t\n\r" | openssl base64 | tr '+=/' '-_~' | xargs | sed 's/ //g')

echo ${CloudFrontPolicy}

-- 9.2 CloudFrontSignatureの生成

cat policy.json | tr -d "\n" | tr -d " \t\n\r" | openssl sha1 -sign private_key.pem | openssl base64 -A | tr -- '+=/' '-_~'  | xargs | sed 's/ //g'

CloudFrontSignature=$(cat policy.json | tr -d "\n" | tr -d " \t\n\r" | openssl sha1 -sign private_key.pem | openssl base64 -A | tr -- '+=/' '-_~' | xargs | sed 's/ //g')

echo ${CloudFrontSignature}

-- 9.3 Cookieの生成

Cookie="Cookie:CloudFront-Policy=${CloudFrontPolicy};CloudFront-Signature=${CloudFrontSignature};CloudFront-Key-Pair-Id=DDDDDDDDDDDDDD"

echo ${Cookie}

 


-- 10. 動作確認

-- 10.1 署名なしで、S3直アクセス
curl -v -X GET https://bucket123.s3.ap-northeast-1.amazonaws.com/index.html

→ 200


-- 10.2 署名なしで、アクセス
curl -v -X GET https://xxxxxxxxxxxxxx.cloudfront.net/index.html

→ 403 Forbidden


-- 10.3 署名ありで、有効期限内アクセス

curl -v -X GET -H ${Cookie} https://xxxxxxxxxxxxxx.cloudfront.net/index.html

→ 200

-- 10.4 署名ありで、有効期限外アクセス


curl -v -X GET -H ${Cookie} https://xxxxxxxxxxxxxx.cloudfront.net/index.html

→ 403 Forbidden

 


-- 11. クリーンアップ

-- ディストリビューションから署名者の削除

aws cloudfront get-distribution \
--id AAAAAAAAAAAAAA

aws cloudfront get-distribution-config \
--id AAAAAAAAAAAAAA


aws cloudfront get-distribution-config \
--id AAAAAAAAAAAAAA | jq -r .DistributionConfig > distribution.json

vim distribution.json


DefaultCacheBehavior -> TrustedKeyGroups を下記のように修正

    "TrustedKeyGroups": {
      "Enabled": false,
      "Quantity": 0
    },


aws cloudfront get-distribution-config \
--id AAAAAAAAAAAAAA | jq -r .ETag

aws cloudfront update-distribution \
--id AAAAAAAAAAAAAA \
--if-match FFFFFFFFFFFFFF \
--distribution-config file://distribution.json

 


-- ディストリビューションの無効化

aws cloudfront get-distribution \
--id AAAAAAAAAAAAAA

aws cloudfront get-distribution-config \
--id AAAAAAAAAAAAAA


※ distribution.jsonはget-distribution-configコマンドのDistributionConfigから取得し、Enabledをfalseに変更する

aws cloudfront get-distribution-config \
--id AAAAAAAAAAAAAA | jq -r .DistributionConfig > distribution.json

sed -i 's/"Enabled": true/"Enabled": false/' distribution.json

 

aws cloudfront get-distribution-config \
--id AAAAAAAAAAAAAA | jq -r .ETag

aws cloudfront update-distribution \
--id AAAAAAAAAAAAAA \
--if-match GGGGGGGGGGGGG \
--distribution-config file://distribution.json


※ if-matchにはETagの値をセット

無効化されるまで待つ


-- ディストリビューションの削除

aws cloudfront get-distribution \
--id AAAAAAAAAAAAAA

aws cloudfront get-distribution-config \
--id AAAAAAAAAAAAAA

aws cloudfront get-distribution-config \
--id AAAAAAAAAAAAAA | jq -r .ETag

aws cloudfront delete-distribution \
--id AAAAAAAAAAAAAA \
--if-match HHHHHHHHHHHHH

 

aws cloudfront list-distributions


-- キーグループの削除


aws cloudfront list-key-groups

aws cloudfront get-key-group \
--id 11111111-2222-3333-4444-555555555555


aws cloudfront delete-key-group \
--id 11111111-2222-3333-4444-555555555555 \
--if-match IIIIIIIIIIIIII

 

 

-- パブリックキーの削除

aws cloudfront list-public-keys

aws cloudfront get-public-key \
--id DDDDDDDDDDDDDD

aws cloudfront delete-public-key \
--id DDDDDDDDDDDDDD \
--if-match JJJJJJJJJJJJJJ

 


-- バケットの削除
aws s3 ls

aws s3 rb s3://bucket123 --force

-- アカウントレベルのパブリックアクセスブロックの有効化

aws s3control put-public-access-block \
--account-id 999999999999 \
--public-access-block-configuration "BlockPublicAcls=true,IgnorePublicAcls=true,BlockPublicPolicy=true,RestrictPublicBuckets=true"

aws s3control get-public-access-block \
--account-id 999999999999