資料函式庫加密是保護敏感資料的關鍵步驟,而密碼輪換則能有效降低未授權存取的風險。在 AWS 環境中,透過 KMS 和 Secrets Manager,可以簡化 RDS MySQL 資料函式庫的加密和密碼輪換流程。本文將逐步說明如何使用 AWS CLI 完成這些操作,並提供 DynamoDB 表格容量自動擴充套件的設定範例,確保資料函式庫在不同負載下維持最佳效能。
在現有 Amazon RDS for MySQL 資料函式庫上啟用儲存加密
在許多情況下,資料函式倉管理員需要將現有的未加密 Amazon RDS 資料函式庫轉換為加密狀態,以滿足安全性和合規性要求。本篇文章將詳細介紹如何使用 AWS Key Management Service (KMS) 和 Amazon RDS 的功能來實作這一目標。
步驟一:建立 KMS 金鑰
首先,您需要建立一個 KMS 金鑰,這將用於加密您的 RDS 資料函式庫。執行以下命令以建立 KMS 金鑰:
aws kms create-key --description "awscookbook404 key"
內容解密:
aws kms create-key命令用於建立新的 KMS 金鑰。--description引數提供了對金鑰的描述,在本例中為 “awscookbook404 key”。
步驟二:檢索 KMS 金鑰 ID 並建立別名
建立金鑰後,您需要檢索其 ID 並為其建立一個別名,以便於參考。
KEY_ID=$(aws kms describe-key --key-id alias/awscookbook404-key --output text --query KeyMetadata.KeyId)
aws kms create-alias --alias-name alias/awscookbook404 --target-key-id $KEY_ID
內容解密:
aws kms describe-key命令用於取得金鑰的詳細資訊。aws kms create-alias命令為金鑰建立一個別名,使其更容易被參照。
步驟三:建立未加密資料函式庫的讀取副本
接下來,您需要建立現有未加密資料函式庫的讀取副本,以確保在進行快照時不會影響主資料函式庫的效能。
aws rds create-db-instance-read-replica --db-instance-identifier awscookbook404db-rep --source-db-instance-identifier $RDS_DATABASE_ID --max-allocated-storage 10
內容解密:
aws rds create-db-instance-read-replica命令用於建立指定資料函式庫例項的讀取副本。--db-instance-identifier指定了讀取副本的識別符號。--source-db-instance-identifier指定了來源資料函式庫例項的識別符號。
步驟四:對讀取副本進行未加密快照
一旦讀取副本的狀態變為“available”,您就可以對其進行快照。
aws rds create-db-snapshot --db-instance-identifier awscookbook404db-rep --db-snapshot-identifier awscookbook404-snapshot
內容解密:
aws rds create-db-snapshot命令用於建立指定資料函式庫例項的快照。--db-snapshot-identifier指定了快照的識別符號。
步驟五:複製快照並使用 KMS 金鑰進行加密
然後,您需要將未加密的快照複製到新的快照,並在複製過程中指定 KMS 金鑰進行加密。
aws rds copy-db-snapshot --copy-tags --source-db-snapshot-identifier awscookbook404-snapshot --target-db-snapshot-identifier awscookbook404-snapshot-enc --kms-key-id alias/awscookbook404
內容解密:
aws rds copy-db-snapshot命令用於複製指定的資料函式庫快照。--kms-key-id指定了用於加密目標快照的 KMS 金鑰。
步驟六:從加密快照還原新的 RDS 例項
最後,您可以使用加密的快照還原出一個新的 RDS 例項。
aws rds restore-db-instance-from-db-snapshot --db-subnet-group-name $RDS_SUBNET_GROUP --db-instance-identifier awscookbook404db-enc --db-snapshot-identifier awscookbook404-snapshot-enc
內容解密:
aws rds restore-db-instance-from-db-snapshot命令用於從指定的快照還原出新的資料函式庫例項。--db-instance-identifier指定了新例項的識別符號。
圖解流程
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
title RDS MySQL 資料函式庫加密與密碼輪換實務
package "資料庫架構" {
package "應用層" {
component [連線池] as pool
component [ORM 框架] as orm
}
package "資料庫引擎" {
component [查詢解析器] as parser
component [優化器] as optimizer
component [執行引擎] as executor
}
package "儲存層" {
database [主資料庫] as master
database [讀取副本] as replica
database [快取層] as cache
}
}
pool --> orm : 管理連線
orm --> parser : SQL 查詢
parser --> optimizer : 解析樹
optimizer --> executor : 執行計畫
executor --> master : 寫入操作
executor --> replica : 讀取操作
cache --> executor : 快取命中
master --> replica : 資料同步
note right of cache
Redis/Memcached
減少資料庫負載
end note
@enduml
此圖示展示了整個流程,從建立 KMS 金鑰到最終還原出加密的 RDS 例項。
自動化密碼輪換的進一步思考
在完成資料函式庫加密後,為了進一步增強安全性,您可能還需要考慮自動化密碼輪換。AWS Secrets Manager 可以幫助您安全地儲存和管理敏感資訊,如資料函式庫密碼,並提供自動輪換功能,以減少安全風險。具體實作可以參考 AWS 提供的檔案和相關資源。
總之,將現有的 Amazon RDS for MySQL 資料函式庫轉換為加密狀態是一項重要的安全措施,而使用 AWS 提供的工具和服務可以簡化這一過程。
自動化 RDS 資料函式庫密碼輪換
在管理資料函式庫安全性時,定期輪換密碼是一項重要的安全措施。AWS 提供了一種自動化的方式來輪換 Amazon RDS 資料函式庫的密碼,利用 AWS Secrets Manager 和 AWS Lambda 來實作這一功能。
步驟一:生成隨機密碼
首先,使用 AWS Secrets Manager 的 GetRandomPassword API 方法生成一個隨機密碼。這不僅可以用於密碼生成,還可以用於其他需要隨機字串的場合。
aws secretsmanager get-random-password \
--password-length 41 \
--require-each-included-type \
--output text \
--query RandomPassword
內容解密:
aws secretsmanager get-random-password:呼叫 AWS Secrets Manager 的 API 生成隨機密碼。--password-length 41:指定密碼長度為 41 個字元。--require-each-included-type:要求密碼中包含至少一種字元型別(大寫字母、小寫字母、數字、特殊字元)。--output text和--query RandomPassword:指定輸出格式為文字,並提取RandomPassword欄位的值。
步驟二:更新 RDS 資料函式庫的管理員密碼
使用剛才生成的隨機密碼更新 RDS 資料函式庫的管理員密碼。
aws rds modify-db-instance \
--db-instance-identifier $RDS_DATABASE_ID \
--master-user-password $RDS_ADMIN_PASSWORD \
--apply-immediately
內容解密:
aws rds modify-db-instance:修改指定的 RDS 資料函式庫例項。--db-instance-identifier $RDS_DATABASE_ID:指定要修改的資料函式庫例項 ID。--master-user-password $RDS_ADMIN_PASSWORD:設定新的管理員密碼。--apply-immediately:立即套用變更。
步驟三:建立儲存資料函式庫憑證的檔案
建立一個名為 rdscreds-template.json 的檔案,內容如下:
{
"username": "admin",
"password": "PASSWORD",
"engine": "mysql",
"host": "HOST",
"port": 3306,
"dbname": "DBNAME",
"dbInstanceIdentifier": "DBIDENTIFIER"
}
然後使用 sed 命令替換檔案中的預留位置,生成最終的 rdscreds.json 檔案。
sed -e "s/AWS_ACCOUNT_ID/${AWS_ACCOUNT_ID}/g" \
-e "s|PASSWORD|${RDS_ADMIN_PASSWORD}|g" \
-e "s|HOST|${RdsEndpoint}|g" \
-e "s|DBNAME|${DbName}|g" \
-e "s|DBIDENTIFIER|${RdsDatabaseId}|g" \
rdscreds-template.json > rdscreds.json
內容解密:
sed:流編輯器,用於對檔案內容進行替換。-e:指定替換命令。- 使用
${引數}替換檔案中的預留位置。
步驟四:下載並壓縮 Lambda 函式程式碼
從 AWS Samples GitHub 倉函式庫下載用於密碼輪換的 Lambda 函式程式碼,並將其壓縮成 ZIP 檔案。
wget https://raw.githubusercontent.com/aws-samples/aws-secrets-manager-rotation-lambdas/master/SecretsManagerRDSMySQLRotationSingleUser/lambda_function.py
zip lambda_function.zip lambda_function.py
內容解密:
wget:下載檔案。zip:將下載的 Python 指令碼壓縮成 ZIP 檔案。
步驟五:建立 Lambda 函式並設定 IAM 角色
建立一個新的 Lambda 函式,並為其建立 IAM 角色,授予必要的許可權。
LAMBDA_ROTATE_ARN=$(aws lambda create-function \
--function-name AWSCookbook405Lambda \
--runtime python3.8 \
--package-type "Zip" \
--zip-file fileb://lambda_function.zip \
--handler lambda_function.lambda_handler --publish \
--environment Variables={SECRETS_MANAGER_ENDPOINT=https://secretsmanager.$AWS_REGION.amazonaws.com} \
--layers $PyMysqlLambdaLayerArn \
--role arn:aws:iam::$AWS_ACCOUNT_ID:role/AWSCookbook405Lambda \
--output text --query FunctionArn \
--vpc-config SubnetIds=${ISOLATED_SUBNETS},SecurityGroupIds=$LAMBDA_SG_ID)
內容解密:
aws lambda create-function:建立新的 Lambda 函式。--function-name、--runtime、--handler等引數指定了函式的名稱、執行環境、處理函式等基本屬性。--role指定了 Lambda 函式使用的 IAM 角色。
自動輪換AWS Secrets Manager密碼並連線MySQL資料函式庫
AWS Secrets Manager提供了一種安全的方式來儲存和管理敏感資訊,例如資料函式庫密碼。透過與AWS Lambda函式整合,您可以自動輪換這些密碼,以增強安全性。
步驟1:觸發密碼輪換
首先,您需要使用aws secretsmanager rotate-secret命令來觸發密碼的初始輪換。
aws secretsmanager rotate-secret --secret-id $AWSCookbook405SecretName
內容解密:
aws secretsmanager rotate-secret:此命令用於觸發指定秘密的輪換。--secret-id $AWSCookbook405SecretName:指定要輪換的秘密ID。
步驟2:驗證密碼輪換
執行另一次密碼輪換,以展示如何按需執行輪換。
aws secretsmanager rotate-secret --secret-id $AWSCookbook405SecretName
內容解密:
- 再次執行輪換命令,以演示按需輪換的功能。
- 觀察
VersionId的變化,以確認密碼已成功輪換。
步驟3:檢索RDS管理員密碼並連線資料函式庫
從Secrets Manager檢索RDS管理員密碼,並列出RDS叢集的端點。
RDS_ADMIN_PASSWORD=$(aws secretsmanager get-secret-value --secret-id $AWSCookbook405SecretName --query SecretString | jq -r | jq .password | tr -d '"')
echo $RDS_ENDPOINT
echo $RDS_ADMIN_PASSWORD
內容解密:
aws secretsmanager get-secret-value:用於檢索秘密的值。--query SecretString:指定要檢索的秘密字串。jq -r | jq .password:使用jq解析JSON並提取password欄位。tr -d '"':移除引號。
步驟4:連線至EC2例項並安裝MySQL客戶端
使用SSM Session Manager連線至EC2例項,並安裝MySQL客戶端。
aws ssm start-session --target $INSTANCE_ID
sudo yum -y install mysql
內容解密:
aws ssm start-session:啟動與指定EC2例項的SSM會話。sudo yum -y install mysql:在EC2例項上安裝MySQL客戶端。
步驟5:連線至MySQL資料函式庫並驗證密碼
使用輪換後的密碼連線至MySQL資料函式庫。
mysql -u admin -p$password -h $hostname
內容解密:
mysql:連線至MySQL資料函式庫的命令。-u admin:指定使用者名稱為admin。-p$password:指定密碼。-h $hostname:指定主機名稱。
討論
AWS提供的Lambda函式將輪換後的密碼儲存在Secrets Manager中。您可以組態應用程式直接從Secrets Manager檢索秘密,或使用Lambda函式更新秘密並儲存在您選擇的安全位置。
DynamoDB表格佈建容量自動擴充套件
DynamoDB是一種完全託管的NoSQL資料函式庫服務,提供快速且可預測的效能。透過使用AWS Application Auto Scaling,您可以根據應用程式負載的變化自動調整DynamoDB表格的讀寫容量。
步驟1:註冊可擴充套件目標
註冊DynamoDB表格的讀寫容量單位作為可擴充套件目標。
aws application-autoscaling register-scalable-target \
--service-namespace dynamodb \
--resource-id "table/AWSCookbook406" \
--scalable-dimension "dynamodb:table:ReadCapacityUnits" \
--min-capacity 5 \
--max-capacity 10
內容解密:
aws application-autoscaling register-scalable-target:註冊可擴充套件目標的命令。--service-namespace dynamodb:指定服務名稱空間為DynamoDB。--resource-id "table/AWSCookbook406":指定資源ID。--scalable-dimension "dynamodb:table:ReadCapacityUnits":指定可擴充套件維度為讀容量單位。
步驟2:建立擴充套件策略
建立讀寫容量的擴充套件策略JSON檔案。
{
"PredefinedMetricSpecification": {
"PredefinedMetricType": "DynamoDBReadCapacityUtilization"
},
"ScaleOutCooldown": 60,
"ScaleInCooldown": 60,
"TargetValue": 50.0
}
內容解密:
PredefinedMetricSpecification:指定預定義指標型別。ScaleOutCooldown和ScaleInCooldown:指定擴充套件冷卻時間。TargetValue:指定目標值。