返回文章列表

RDS MySQL 資料函式庫加密與密碼輪換實務

本文介紹如何將現有 Amazon RDS for MySQL 資料函式庫加密,並搭配 AWS KMS 和 Secrets Manager 實作自動化密碼輪換,提升資料函式庫安全性。文章涵蓋建立 KMS 金鑰、複製快照加密、密碼輪換步驟,以及 DynamoDB 表格容量自動擴充套件設定。

資料函式庫 資安

資料函式庫加密是保護敏感資料的關鍵步驟,而密碼輪換則能有效降低未授權存取的風險。在 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:指定預定義指標型別。
  • ScaleOutCooldownScaleInCooldown:指定擴充套件冷卻時間。
  • TargetValue:指定目標值。