إدارة المفاتيح
إدارة المفاتيح
إنشاء مفاتيح KMS وإدارتها وتدويرها في مخزن المفاتيح الخارجي في AWS
ينطبق على:
AWS KMSExternal Key StoreKey Lifecycle
نظرة عامة
تختلف إدارة المفاتيح في مخزن مفاتيح خارجي عن مفاتيح KMS القياسية لأن كل مفتاح KMS مرتبط بمفتاح خارجي في مدير المفاتيح الخاص بك (HashiCorp Vault وCyberArk وما إلى ذلك). يجب عليك تنسيق العمليات بين AWS KMS ومدير المفاتيح الخارجي.
المتطلبات المسبقة
- مخزن مفاتيح خارجي متصل في AWS KMS
- مفتاح خارجي منشأ في مدير المفاتيح الخاص بك أولًا
- أذونات IAM ومدير المفاتيح المناسبة مكوّنة
إنشاء مفاتيح KMS
1
إنشاء مفتاح خارجي في مدير المفاتيح
أنشئ مفتاح AES بطول 256 بت في مدير المفاتيح الخارجي الخاص بك.
Create Vault Transit KeyBASH
# Create a new encryption key in Vault Transit engine
vault write transit/keys/my-external-key type=aes256-gcm96
# Verify the key was created
vault read transit/keys/my-external-key
# Configure the key
vault write transit/keys/my-external-key/config \
exportable=false \
allow_plaintext_backup=false2
إنشاء مفتاح KMS في AWS
Create KMS KeyBASH
# Set variables
KEYSTORE_ID="cks-1234567890abcdef0"
EXTERNAL_KEY_ID="my-external-key"
# Create KMS key
aws kms create-key \
--custom-key-store-id $KEYSTORE_ID \
--xks-key-id $EXTERNAL_KEY_ID \
--description "Production encryption key for S3 buckets" \
--tags TagKey=Environment,TagValue=Production \
TagKey=Application,TagValue=DataStorage \
--region us-east-1
# Capture the key ID
KEY_ID=$(aws kms create-key \
--custom-key-store-id $KEYSTORE_ID \
--xks-key-id $EXTERNAL_KEY_ID \
--query 'KeyMetadata.KeyId' \
--output text)
echo "Created KMS Key: $KEY_ID"3
إنشاء اسم مستعار
Create Key AliasBASH
# Create alias
aws kms create-alias \
--alias-name alias/production-s3-encryption \
--target-key-id $KEY_ID
# Verify alias
aws kms describe-key --key-id alias/production-s3-encryption4
تعيين سياسة المفتاح
Configure Key PolicyBASH
# Create key policy JSON
cat > key-policy.json <<EOF
{
"Version": "2012-10-17",
"Id": "xks-key-policy",
"Statement": [
{
"Sid": "Enable IAM User Permissions",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:root"
},
"Action": "kms:*",
"Resource": "*"
},
{
"Sid": "Allow S3 to use the key",
"Effect": "Allow",
"Principal": {
"Service": "s3.amazonaws.com"
},
"Action": [
"kms:Decrypt",
"kms:GenerateDataKey"
],
"Resource": "*"
}
]
}
EOF
# Apply key policy
aws kms put-key-policy \
--key-id $KEY_ID \
--policy-name default \
--policy file://key-policy.jsonإدارة دورة حياة المفتاح
تمكين المفاتيح وتعطيلها
| العملية | الأمر | التأثير |
|---|---|---|
| تعطيل المفتاح | aws kms disable-key --key-id $KEY_ID | تفشل جميع العمليات التشفيرية حتى إعادة التمكين |
| تمكين المفتاح | aws kms enable-key --key-id $KEY_ID | يعيد المفتاح إلى الحالة التشغيلية |
Enable/Disable KeysBASH
# Disable the key
aws kms disable-key --key-id $KEY_ID
# Verify key state
aws kms describe-key --key-id $KEY_ID \
--query 'KeyMetadata.KeyState' \
--output text
# Output: Disabled
# Enable the key
aws kms enable-key --key-id $KEY_IDجدولة حذف المفتاح
تحذير
بمجرد الحذف، تصبح جميع البيانات المشفّرة بهذا المفتاح غير قابلة للاسترداد!
Schedule Key DeletionBASH
# Schedule key deletion (7-30 days waiting period)
aws kms schedule-key-deletion \
--key-id $KEY_ID \
--pending-window-in-days 30
# Verify deletion is scheduled
aws kms describe-key --key-id $KEY_ID \
--query 'KeyMetadata.{State:KeyState,DeletionDate:DeletionDate}' \
--output json
# Cancel deletion if needed
aws kms cancel-key-deletion --key-id $KEY_IDتدوير المفاتيح الخارجية
مهم
على عكس مفاتيح KMS القياسية، لا تدعم مخازن المفاتيح الخارجية التدوير التلقائي للمفاتيح. يجب عليك تدوير المفاتيح يدويًا في مدير المفاتيح الخارجي الخاص بك.
قم بتدوير مادة المفتاح في مدير المفاتيح الخارجي مع الاحتفاظ بمعرّف المفتاح نفسه:
In-Place RotationBASH
# HashiCorp Vault - rotate key material
vault write -f transit/keys/my-external-key/rotate
# Verify new version
vault read transit/keys/my-external-key| المزايا | العيوب |
|---|---|
| لا حاجة لتغييرات في AWS KMS | قد لا تُفكّ البيانات القديمة دون الاحتفاظ بالإصدارات |
| تستمر التطبيقات دون تعديل | يتطلب دعم مدير المفاتيح للإصدارات |
| يحافظ على معرّف مفتاح KMS واسمه المستعار نفسه |
اكتشاف المفاتيح وجردها
List and Describe KeysBASH
# Get key details
aws kms describe-key --key-id $KEY_ID \
--query 'KeyMetadata.{
KeyId:KeyId,
XksKeyId:XksKeyId,
KeyState:KeyState,
CreationDate:CreationDate,
CustomKeyStoreId:CustomKeyStoreId,
Origin:Origin
}' \
--output json
# List all aliases for a key
aws kms list-aliases \
--key-id $KEY_ID \
--query 'Aliases[*].AliasName' \
--output text
# Get key usage metrics
aws cloudwatch get-metric-statistics \
--namespace AWS/KMS \
--metric-name NumberOfCalls \
--dimensions Name=KeyId,Value=$KEY_ID \
--start-time $(date -u -d '7 days ago' '+%Y-%m-%dT%H:%M:%S') \
--end-time $(date -u '+%Y-%m-%dT%H:%M:%S') \
--period 3600 \
--statistics Sum \
--output tableمنح المفاتيح
Manage Key GrantsBASH
# Create grant for specific operations
GRANT_TOKEN=$(aws kms create-grant \
--key-id $KEY_ID \
--grantee-principal arn:aws:iam::123456789012:role/LambdaExecutionRole \
--operations Encrypt Decrypt GenerateDataKey \
--query 'GrantToken' \
--output text)
# Create grant with constraints
aws kms create-grant \
--key-id $KEY_ID \
--grantee-principal arn:aws:iam::123456789012:role/DataProcessingRole \
--operations Decrypt \
--constraints EncryptionContextSubset={Department=Finance} \
--name "Finance-Data-Processing-Grant"
# List grants
aws kms list-grants --key-id $KEY_ID \
--query 'Grants[*].{
GrantId:GrantId,
GranteePrincipal:GranteePrincipal,
Operations:Operations,
Name:Name
}' \
--output table
# Revoke grant
aws kms revoke-grant \
--key-id $KEY_ID \
--grant-id $GRANT_IDاختبار عمليات المفاتيح
Test Encryption/DecryptionBASH
# Create test file
echo "Sensitive data for testing" > test-plaintext.txt
# Encrypt data
aws kms encrypt \
--key-id $KEY_ID \
--plaintext fileb://test-plaintext.txt \
--output text \
--query CiphertextBlob | base64 -d > test-encrypted.bin
echo "Encryption successful"
# Decrypt the data
aws kms decrypt \
--ciphertext-blob fileb://test-encrypted.bin \
--output text \
--query Plaintext | base64 -d > test-decrypted.txt
# Verify decrypted content matches original
diff test-plaintext.txt test-decrypted.txt && echo "Decryption successful"
# Generate data key
aws kms generate-data-key \
--key-id $KEY_ID \
--key-spec AES_256 \
--query '{Plaintext:Plaintext,CiphertextBlob:CiphertextBlob}' \
--output json > data-key.jsonاستكشاف أخطاء عمليات المفاتيح وإصلاحها
أفضل الممارسات
أفضل ممارسات إدارة المفاتيح
استخدام أسماء وصفيةأوصاف وعلامات ذات معنى للمفاتيح
الحد الأدنى من الامتيازاتمنح الحد الأدنى من الأذونات الضرورية
عمليات تدقيق منتظمةتدقيق استخدام المفاتيح والأذونات بانتظام
توثيق الغرض من المفتاحالاحتفاظ بوثائق حول ما يحميه كل مفتاح
مراقبة استخدام المفاتيحإعداد تنبيهات CloudWatch للنشاط غير المعتاد
فصل البيئاتاستخدام مفاتيح مختلفة للتطوير والاختبار والإنتاج
استراتيجية وضع العلامات
Apply Consistent TagsBASH
aws kms tag-resource \
--key-id $KEY_ID \
--tags \
TagKey=Environment,TagValue=Production \
TagKey=Application,TagValue=CustomerData \
TagKey=Owner,TagValue=SecurityTeam \
TagKey=CostCenter,TagValue=IT-Security \
TagKey=Compliance,TagValue=PCI-DSS \
TagKey=DataClassification,TagValue=Confidential \
TagKey=BackupRequired,TagValue=Yes \
TagKey=RotationSchedule,TagValue=Quarterly