透過 S3 存取點,我們可以針對不同的應用程式設定讀寫或唯讀許可權,而無需直接修改 S3 儲存桶政策。這對於需要管理多個應用程式存取同一個 S3 儲存桶的場景特別有用,可以有效避免許可權設定過於複雜或互相干擾。文章中提供的程式碼範例,示範瞭如何使用 AWS CLI 建立存取點,並透過 IAM 政策精確控制每個應用程式的存取許可權。

設定 S3 存取點的 IAM 策略時,需注意 Principal、Action 和 Resource 三個關鍵元素。Principal 指定允許存取的實體,例如 EC2 instance profile;Action 定義允許的操作,例如 GetObject 和 PutObject;Resource 則指定存取點的 ARN。透過適當的組合,可以實作細粒度的存取控制,確保每個應用程式只能執行被授權的操作。此外,文章也提到了使用 sed 命令自動化生成策略檔案,簡化了設定流程,並減少了人為錯誤的可能性。

為 S3 儲存桶組態應用程式特定存取許可權

問題

您有一個 S3 儲存桶和兩個應用程式。您需要授予一個應用程式讀寫存取許可權,而另一個應用程式僅具有唯讀存取許可權。您不想使用 S3 儲存桶政策,因為您預計未來需要新增更多具有細粒度安全需求的應用程式。

解法

建立兩個 S3 存取點,並對每個存取點套用政策,分別授予 S3:PutObjectS3:GetObject 操作給第一個應用程式,以及 S3:GetObject 給第二個應用程式。然後,組態您的應用程式以使用各自的存取點 DNS 名稱(參見圖 3-9)。

  • 圖 3-9:兩個應用程式使用相同的 S3 儲存桶的 S3 存取點

程式碼解析:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "EC2_INSTANCE_PROFILE"
      },
      "Action": ["s3:GetObject", "s3:PutObject"],
      "Resource": "arn:aws:s3:AWS_REGION:AWS_ACCOUNT_ID:accesspoint/ACCESS_POINT_NAME/object/*"
    }
  ]
}

內容解密:

此 JSON 檔案定義了一個 IAM 政策,用於授予特定 EC2 例項角色對指定 S3 存取點的讀寫許可權。其中,“Principal” 指定了允許存取的主體,“Action” 定義了允許的操作(在本例中為 s3:GetObjects3:PutObject),“Resource” 指定了該政策適用的資源 ARN。透過此政策,您可以精確控制哪些主體可以對哪些資源執行哪些操作。

前提條件

  • 在兩個可用區中建立的具有隔離子網路的 VPC,以及相關聯的路由表。
  • 已佈署兩個 EC2 例項,用於測試存取許可權。
  • 一個 S3 儲存桶。

準備工作

請按照本章節程式碼儲存函式庫中相關資料夾內的步驟進行準備。

建立 S3 存取點並組態存取許可權

  1. 在您的 VPC 中,為應用程式 1 建立一個存取點:
    aws s3control create-access-point --name cookbook305-app-1 \
    --account-id $AWS_ACCOUNT_ID \
    --bucket $BUCKET_NAME --vpc-configuration VpcId=$VPC_ID
    
  2. 為應用程式 2 建立另一個存取點。
    aws s3control create-access-point --name cookbook305-app-2 \
    --account-id $AWS_ACCOUNT_ID \
    --bucket $BUCKET_NAME --vpc-configuration VpcId=$VPC_ID
    

程式碼解析:

sed -e "s/AWS_REGION/${AWS_REGION}/g" \
-e "s|EC2_INSTANCE_PROFILE|${INSTANCE_ROLE_1}|g" \
-e "s|AWS_ACCOUNT_ID|${AWS_ACCOUNT_ID}|g" \
-e "s|ACCESS_POINT_NAME|cookbook305-app-1|g" \
-e "s|ACTIONS|\"s3:GetObject\",\"s3:PutObject\"|g" \
app-policy-template.json > app-1-policy.json

內容解密:

此命令使用 sedapp-policy-template.json 中的佔位符替換為實際值,生成 app-1-policy.json。這些值包括 AWS_REGION、INSTANCE_ROLE_1、AWS_ACCOUNT_ID、ACCESS_POINT_NAME 和 ACTIONS。這樣,您就可以根據實際環境引數生成適用於特定應用程式的政策檔案,從而簡化政策組態過程。

使用 Amazon S3 存取點組態應用程式特定的 S3 Bucket 存取許可權

Amazon S3 存取點提供了一種便捷的方法來為不同的應用程式或服務組態特定的存取許可權,從而簡化了 S3 Bucket 的安全管理。本篇文章將介紹如何使用 S3 存取點為不同的應用程式組態特定的存取許可權。

建立 S3 存取點

首先,您需要建立 S3 存取點。S3 存取點是一種與 S3 Bucket 相關聯的資源,它允許您為不同的應用程式或服務組態特定的存取許可權。以下是一個使用 AWS CLI 建立 S3 存取點的範例:

aws s3control create-access-point --account-id $AWS_ACCOUNT_ID \
--name cookbook305-app-1 --bucket awscookbook305-$RANDOM_STRING

內容解密:

  • aws s3control create-access-point:此命令用於建立 S3 存取點。
  • --account-id $AWS_ACCOUNT_ID:指定 AWS 帳戶 ID。
  • --name cookbook305-app-1:指定存取點的名稱。
  • --bucket awscookbook305-$RANDOM_STRING:指定與存取點相關聯的 S3 Bucket。

組態 S3 存取點政策

建立 S3 存取點後,您需要組態存取點政策以定義哪些操作是允許的。以下是一個使用 AWS CLI 組態 S3 存取點政策的範例:

aws s3control put-access-point-policy --account-id $AWS_ACCOUNT_ID \
--name cookbook305-app-1 --policy file://app-1-policy.json

內容解密:

  • aws s3control put-access-point-policy:此命令用於組態 S3 存取點政策。
  • --account-id $AWS_ACCOUNT_ID:指定 AWS 帳戶 ID。
  • --name cookbook305-app-1:指定存取點的名稱。
  • --policy file://app-1-policy.json:指定存取點政策的 JSON 檔案。

使用 S3 存取點

組態好 S3 存取點和存取點政策後,您可以使用 S3 存取點來存取 S3 Bucket 中的物件。以下是一個使用 AWS CLI 從 S3 存取點取得物件的範例:

aws s3api get-object --key Recipe305Test.txt \
--bucket arn:aws:s3:$AWS_DEFAULT_REGION:$AWS_ACCOUNT_ID:accesspoint/cookbook305-app-1 \
/tmp/Recipe305Test.txt

內容解密:

  • aws s3api get-object:此命令用於從 S3 Bucket 中取得物件。
  • --key Recipe305Test.txt:指定要取得的物件的金鑰。
  • --bucket arn:aws:s3:$AWS_DEFAULT_REGION:$AWS_ACCOUNT_ID:accesspoint/cookbook305-app-1:指定存取點的 ARN。
  • /tmp/Recipe305Test.txt:指定下載物件的本地路徑。

驗證存取許可權

為了驗證組態的存取許可權是否正確,您可以使用 AWS CLI 連線到 EC2 執行個體並執行相關操作。以下是一個使用 AWS CLI 連線到 EC2 執行個體並驗證存取許可權的範例:

aws ssm start-session --target $INSTANCE_ID_1

內容解密:

  • aws ssm start-session:此命令用於連線到 EC2 執行個體。
  • --target $INSTANCE_ID_1:指定要連線的 EC2 執行個體 ID。

在 EC2 執行個體中,您可以執行相關操作來驗證存取許可權,例如從 S3 存取點取得或上傳物件。

挑戰

嘗試組態第三個 S3 存取點,並指定對特定物件或字首的存取許可權。

使用 Amazon S3 Bucket Keys 與 KMS 加密物件

Amazon S3 提供了一種使用 S3 Bucket Keys 與 Key Management Service(KMS)加密物件的方法,從而提高了資料的安全性。本篇文章將介紹如何使用 S3 Bucket Keys 與 KMS 加密物件。

建立 KMS 金鑰

首先,您需要建立一個 KMS 金鑰來用於加密物件。以下是一個使用 AWS CLI 建立 KMS 金鑰的範例:

KEY_ID=$(aws kms create-key \
--tags TagKey=Name,TagValue=AWSCookbook306Key \
--description "AWSCookbook S3 CMK" \
--query KeyMetadata.KeyId \
--output text)

內容解密:

  • aws kms create-key:此命令用於建立 KMS 金鑰。
  • --tags TagKey=Name,TagValue=AWSCookbook306Key:指定 KMS 金鑰的標籤。
  • --description "AWSCookbook S3 CMK":指定 KMS 金鑰的描述。
  • --query KeyMetadata.KeyId:指定要輸出的查詢結果。
  • --output text:指定輸出格式為文字。

組態 S3 Bucket 使用 S3 Bucket Keys

建立 KMS 金鑰後,您需要組態 S3 Bucket 使用 S3 Bucket Keys。以下是一個使用 AWS CLI 組態 S3 Bucket 使用 S3 Bucket Keys 的範例:

aws s3api put-bucket-encryption \
--bucket awscookbook306-$RANDOM_STRING \
--server-side-encryption-configuration '{
"Rules": [
{
"ApplyServerSideEncryptionByDefault": {
"SSEAlgorithm": "aws:kms",
"KMSMasterKeyID": "${KEY_ID}"
}
}'

內容解密:

  • aws s3api put-bucket-encryption:此命令用於組態 S3 Bucket 的加密設定。
  • --bucket awscookbook306-$RANDOM_STRING:指定要組態的 S3 Bucket 名稱。
  • --server-side-encryption-configuration:指定伺服器端加密設定。
  • "SSEAlgorithm": "aws:kms":指定加密演算法為 AWS KMS。
  • "KMSMasterKeyID": "${KEY_ID}":指定 KMS 金鑰 ID。

使用AWS KMS強制S3儲存貯體加密上傳

摘要

本篇示範如何使用AWS Key Management Service (KMS)強制Amazon S3儲存貯體中的所有物件進行加密上傳。透過建立KMS金鑰、設定S3儲存貯體屬性及套用儲存貯體政策,確保所有上傳至S3的資料均被加密。

步驟詳解

1. 建立KMS客戶管理金鑰 (CMK)

首先,建立一個KMS客戶管理金鑰,用於加密S3物件。

aws kms create-key --description "S3 Bucket Encryption Key"

2. 建立別名以便於管理金鑰

建立一個別名指向剛才建立的金鑰,以方便後續操作。

aws kms create-alias --alias-name alias/s3-encryption-key --target-key-id $KEY_ID

3. 設定S3儲存貯體屬性以使用KMS加密

設定S3儲存貯體預設使用KMS金鑰進行伺服器端加密。

aws s3api put-bucket-encryption --bucket awscookbook306-$RANDOM_STRING --server-side-encryption-configuration '{
"Rules": [
{
"ApplyServerSideEncryptionByDefault": {
"SSEAlgorithm": "aws:kms",
"KMSMasterKeyID": "'$KEY_ID'"
},
"BucketKeyEnabled": true
}
]
}'

4. 建立儲存貯體政策以強制加密上傳

建立一個儲存貯體政策,拒絕未使用KMS加密的上傳請求。

{
  "Version": "2012-10-17",
  "Id": "PutObjectPolicy",
  "Statement": [
    {
      "Sid": "DenyUnEncryptedObjectUploads",
      "Effect": "Deny",
      "Principal": "*",
      "Action": "s3:PutObject",
      "Resource": "arn:aws:s3:::BUCKET_NAME/*",
      "Condition": {
        "StringNotEquals": {
          "s3:x-amz-server-side-encryption": "aws:kms"
        }
      }
    }
  ]
}

5. 使用sed命令替換儲存貯體政策中的BUCKET_NAME

BUCKET_NAME替換為實際的儲存貯體名稱。

sed -e "s|BUCKET_NAME|awscookbook306-${RANDOM_STRING}|g" bucket-policy-template.json > bucket-policy.json

6. 套用儲存貯體政策

將修改後的儲存貯體政策套用到S3儲存貯體。

aws s3api put-bucket-policy --bucket awscookbook306-$RANDOM_STRING --policy file://bucket-policy.json

驗證檢查

  1. 使用KMS加密上傳物件至S3,預期成功。
    aws s3 cp ./book_cover.png s3://awscookbook306-$RANDOM_STRING --sse aws:kms --sse-kms-key-id $KEY_ID
    
  2. 不使用KMS加密上傳物件至S3,預期失敗並傳回KMS.NotFoundException錯誤。
    aws s3 cp ./book_cover.png s3://awscookbook306-$RANDOM_STRING
    

清理資源

參考本章節程式碼倉函式庫中的清理步驟。

討論

使用AWS KMS對S3物件進行加密,可以有效保護資料安全。AWS提供客戶管理金鑰和AWS管理金鑰兩種選擇。客戶管理金鑰允許使用者自行管理金鑰的建立、輪換和停用,提供更高的安全性和控制權。

信封加密 (Envelope Encryption)

信封加密是將明文資料使用資料金鑰加密,然後再將資料金鑰使用更高層級的金鑰加密的技術。這種方式結合了對稱加密和非對稱加密的優點,既保證了資料的安全,又提高了加密解密的效率。

挑戰

  1. 將一個物件上傳至S3儲存貯體。
  2. 手動觸發KMS CMK的輪換。
  3. 從S3下載該物件,驗證是否能夠正確解密。