إنتقل إلى المحتوى الرئيسي

إدارة المفاتيح

ينطبق على:
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=false
2

إنشاء مفتاح 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-encryption
4

تعيين سياسة المفتاح

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

الخطوات التالية​