0Pricing
AWS Solutions Architect · درس

Secrets Manager وParameter Store

دوّر بيانات اعتماد قاعدة البيانات تلقائيًا باستخدام Secrets Manager، وخزّن الإعدادات غير السرية في Parameter Store، وادمج كليهما مع Lambda وECS

Secrets Manager وParameter Store درس مجاني في AWS Solutions Architect على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في AWS Solutions Architect، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة AWS Solutions Architect 4 دروس في المجموع.

مشكلة الأسرار في التعليمات البرمجية

من الأنماط المضادة الشائعة والخطيرة تخزين الأسرار (كلمات مرور قواعد البيانات ومفاتيح API ورموز OAuth) في التعليمات البرمجية المصدرية للتطبيق، أو متغيرات البيئة، أو ملفات الإعداد التي أُودعت في نظام التحكم في الإصدارات. عند كشف هذه المستودعات — سواء جُعلت عامةً عن طريق الخطأ أو وصل إليها مهاجم — تُخترق جميع الأسرار فورًا. توفر AWS خدمتين مُدارتين للتخلص من هذه المشكلة: AWS Secrets Manager لبيانات الاعتماد التي تحتاج إلى تدوير تلقائي، وAWS Systems Manager Parameter Store لقيم الإعداد والأسرار التي لا تحتاج إلى تدوير.

# Anti-pattern: secrets in code (NEVER do this)
# db_password = 'supersecret123'
# api_key = 'sk-abc123def456'

# Best practice: retrieve at runtime
import boto3

client = boto3.client('secretsmanager', region_name='us-east-1')
response = client.get_secret_value(SecretId='prod/myapp/db-password')
password = response['SecretString']  # fresh value, always current

نظرة عامة على AWS Secrets Manager

تُعد AWS Secrets Manager خدمة مُدارة لتخزين الأسرار واستردادها وتدويرها تلقائيًا. وتشفّر جميع الأسرار باستخدام KMS (بشكل افتراضي باستخدام مفتاح مُدار من AWS، أو CMK الخاص بكم). ويمكن للأسرار تخزين أي بيانات منظمة في صورة سلسلة JSON من أزواج المفتاح والقيمة. تفرض Secrets Manager رسومًا قدرها 0.40 دولار لكل سر شهريًا، بالإضافة إلى 0.05 دولار لكل 10,000 استدعاء API. ويتمثل الفرق الأساسي بينها وبين Parameter Store في التدوير التلقائي المدمج لـ RDS وRedshift وDocumentDB والأسرار المخصصة عبر دوال تدوير Lambda، من دون الحاجة إلى إجراء تغييرات على التطبيق أثناء التدوير.

# Create a secret in Secrets Manager
aws secretsmanager create-secret \
  --name 'prod/myapp/database' \
  --description 'Production MySQL credentials' \
  --secret-string '{"username":"admin","password":"changeme123","host":"mydb.rds.amazonaws.com","port":3306,"dbname":"orders"}'

# Retrieve the secret (by application)
aws secretsmanager get-secret-value \
  --secret-id 'prod/myapp/database' \
  --query 'SecretString' \
  --output text | python3 -c 'import sys,json; s=json.load(sys.stdin); print(s["password"])'

التدوير التلقائي باستخدام Secrets Manager

يُعد التدوير التلقائي أقوى ميزات Secrets Manager. بالنسبة إلى قواعد بيانات RDS، يدوّر Secrets Manager كلمات المرور تلقائيًا من خلال: 1) إنشاء كلمة مرور جديدة. 2) تحديث كلمة مرور مستخدم قاعدة البيانات في RDS. 3) تحديث السر بكلمة المرور الجديدة. 4) التحقق من صلاحية بيانات الاعتماد الجديدة. تحدث كل هذه الخطوات أثناء تشغيل تطبيقكم، من دون أي توقف، ومن دون تدخل يدوي. تستدعي التطبيقات دائمًا get-secret-value لاسترداد كلمة المرور الحالية، ولذلك تستخدم بيانات الاعتماد التي جرى تدويرها تلقائيًا.

# Enable automatic rotation for RDS secret
aws secretsmanager rotate-secret \
  --secret-id 'prod/myapp/database' \
  --rotation-rules AutomaticallyAfterDays=30 \
  --rotation-lambda-arn arn:aws:lambda:us-east-1:123:function:SecretsManagerRDSMySQLRotationSingleUser

# AWS provides pre-built rotation Lambda functions for:
# - RDS MySQL/PostgreSQL/MariaDB/Oracle/SQL Server
# - DocumentDB
# - Redshift
# - Custom: write your own Lambda for other services

# Application code: always call GetSecretValue, never cache long-term

تخزين الأسرار مؤقتًا محليًا

سيكون استدعاء Secrets Manager مع كل استعلام إلى قاعدة البيانات مكلفًا وبطيئًا. تتمثل أفضل ممارسة في تخزين السر مؤقتًا محليًا في الذاكرة لفترة قصيرة. توفر AWS عملاء رسميين لـ التخزين المؤقت في Secrets Manager للغتي Java وPython، ويمكن إعداد مدة البقاء (TTL) للأسرار المخزنة مؤقتًا. عند انتهاء صلاحية ذاكرة التخزين المؤقت، يعيد العميل جلب السر من Secrets Manager. وإذا تلقى التطبيق خطأً في المصادقة، ما يشير إلى تدوير كلمة المرور، فإنه يحدّث ذاكرة التخزين المؤقت فورًا ثم يعيد المحاولة. يوفّر هذا النمط أداءً جيدًا وحداثةً للبيانات من دون إرهاق واجهة برمجة تطبيقات Secrets Manager بالطلبات.

# Python: Secrets Manager caching client
# pip install aws-secretsmanager-caching

from botocore.session import get_session
from aws_secretsmanager_caching import SecretCache, SecretCacheConfig

client = get_session().create_client('secretsmanager')
cache = SecretCache(
    config=SecretCacheConfig(secret_refresh_interval=3600),  # cache 1 hour
    client=client
)

# Returns cached value unless refresh interval expired
secret = cache.get_secret_string('prod/myapp/database')

AWS Systems Manager Parameter Store

يُعد AWS Systems Manager (SSM) Parameter Store مخزنًا هرميًا مجانيًا (للمعلمات القياسية) من أزواج المفتاح والقيمة لبيانات الإعدادات والأسرار. وهو يدعم أنواع المعلمات String وStringList وSecureString. يعمل SecureString على تشفير القيم باستخدام KMS. وعلى خلاف Secrets Manager، لا يدعم Parameter Store التدوير التلقائي؛ إذ صُمم لقيم الإعدادات التي تتغير نادرًا. المعلمات القياسية مجانية ويمكنها تخزين ما يصل إلى 4 كيلوبايت. أما المعلمات المتقدمة فتدعم قيمًا أكبر (حتى 8 كيلوبايت)، وسياسات المعلمات (التذكير بانتهاء الصلاحية والتدوير)، وتبلغ تكلفتها 0.05 دولار لكل معلمة شهريًا.

# Create Parameter Store parameters
aws ssm put-parameter \
  --name '/prod/myapp/db-host' \
  --value 'mydb.cluster-abc.us-east-1.rds.amazonaws.com' \
  --type String

aws ssm put-parameter \
  --name '/prod/myapp/db-password' \
  --value 'mysecretpassword' \
  --type SecureString \
  --key-id alias/my-kms-key

# Retrieve parameter
aws ssm get-parameter \
  --name '/prod/myapp/db-password' \
  --with-decryption \
  --query 'Parameter.Value' --output text

التدرج الهرمي في Parameter Store وIAM

نظّم قيم Parameter Store باستخدام بنية مسارات هرمية تعكس بنية بيئتكم وتطبيقكم. يتيح ذلك إنشاء سياسات IAM دقيقة تمنح الوصول إلى المعلمات بناءً على بادئة المسار. على سبيل المثال، يمكنكم منح دالة Lambda الوصول فقط إلى المعلمات الموجودة ضمن /prod/payment-service/، وبذلك لا يمكنها الوصول إلى معلمات الخدمات الأخرى. يطبّق هذا مبدأ أقل قدر من الصلاحيات على الإعدادات، ويمنع خدمةً مخترقة من قراءة أسرار خدمة أخرى.

# Parameter hierarchy
/prod/payment-service/db-password
/prod/payment-service/stripe-api-key
/prod/order-service/db-password
/prod/order-service/redis-url
/staging/payment-service/db-password

# IAM policy: payment-service Lambda can ONLY read its params
{
  'Effect': 'Allow',
  'Action': ['ssm:GetParameter', 'ssm:GetParameters', 'ssm:GetParametersByPath'],
  'Resource': 'arn:aws:ssm:us-east-1:123:parameter/prod/payment-service/*'
}

# Get all parameters for an app at once
aws ssm get-parameters-by-path \
  --path '/prod/payment-service/' \
  --with-decryption --recursive

Secrets Manager مقابل Parameter Store: متى تستخدمون كلًا منهما

اختاروا بين الخدمتين وفقًا لمتطلباتكم: استخدموا Secrets Manager عندما تحتاجون إلى تدوير الأسرار تلقائيًا، أو تخزّنون بيانات اعتماد قواعد البيانات، أو يجب مشاركة السر بين عدة حسابات AWS، أو تتطلب متطلبات الامتثال سياسات تدوير موثقة. استخدموا Parameter Store عندما تحتاجون إلى قيم إعدادات غير سرية، أو تريدون حلًا مجانيًا لتخزين أزواج المفتاح والقيمة البسيطة، أو تحتاجون إلى إعدادات هرمية مع التحكم في الوصول المستند إلى المسارات، أو تحتاجون إلى تخزين سجل إصدارات المعلمات. تستخدم العديد من البنى الخدمتين معًا: Parameter Store للإعدادات، وSecrets Manager لبيانات الاعتماد.

# Usage comparison:
# Secrets Manager:
#   Cost: $0.40/secret/month
#   Rotation: Automatic (RDS, custom Lambda)
#   Cross-account: Yes
#   Best for: Database passwords, API keys, OAuth tokens

# Parameter Store:
#   Cost: Free (standard) / $0.05/month (advanced)
#   Rotation: Manual only
#   Cross-account: No (use Secrets Manager)
#   Best for: Config values, feature flags, non-rotating secrets

التكامل مع Lambda وECS

ينبغي لدوال Lambda ومهام ECS استرداد الأسرار عند بدء التشغيل، لا عند كل استدعاء. بالنسبة إلى Lambda: استردوا الأسرار في تعليمة التهيئة (خارج دالة المعالج) وخزّنوها في متغيرات عامة؛ إذ تستمر بيئة تنفيذ Lambda بين الاستدعاءات، ولذلك لا تُجلب الأسرار إلا مرة واحدة خلال عمر كل بيئة. بالنسبة إلى ECS: استخدموا الحقل secrets في تعريف المهمة لحقن قيم Secrets Manager أو SecureStrings من Parameter Store في صورة متغيرات بيئية؛ إذ يستردها ECS ويحقنها عند تشغيل المهمة، من دون الحاجة إلى إجراء أي تغييرات على كود التطبيق.

# ECS task definition: inject secret as environment variable
{
  'containerDefinitions': [{
    'name': 'api',
    'image': 'my-api:latest',
    'secrets': [
      {
        'name': 'DB_PASSWORD',
        'valueFrom': 'arn:aws:secretsmanager:us-east-1:123:secret:prod/myapp/database:password::'
      },
      {
        'name': 'API_KEY',
        'valueFrom': '/prod/myapp/api-key'
      }
    ]
  }]
}
# Application reads DB_PASSWORD from env var
# ECS injects the current secret value at task start

Parameter Store لمعرّفات AMI الخاصة بـ EC2

من الاستخدامات العملية لـ Parameter Store، التي غالبًا ما تُغفل، تخزين معرّفات AMI ومراجع النشر الأخرى. فبدلًا من تضمين معرّفات AMI مباشرةً في قوالب CloudFormation، التي تصبح قديمة عند إصدار AMI جديدة، يمكنكم الإشارة إلى قيمة في Parameter Store. يحدّث مسار CI/CD معرّف AMI في Parameter Store كلما أُنشئت AMI أساسية جديدة. ويقرأ CloudFormation أحدث معرّف AMI من Parameter Store وقت النشر. كما تنشر AWS أحدث معرّفات AMI لنظام Amazon Linux في مسارات عامة ضمن Parameter Store، ويمكنكم الإشارة إليها مباشرةً.

# Get AWS public AMI ID from Parameter Store
aws ssm get-parameter \
  --name '/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-default-x86_64' \
  --query 'Parameter.Value' --output text

# CloudFormation: reference public AMI parameter
Parameters:
  LatestAmiId:
    Type: 'AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>'
    Default: '/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-default-x86_64'

Resources:
  MyEC2:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: !Ref LatestAmiId

التدقيق والامتثال للأسرار

تتطلب حوكمة الأسرار معرفة من وصل إليها ومتى. يسجّل AWS CloudTrail كل استدعاء لواجهة برمجة التطبيقات في Secrets Manager وParameter Store، بما في ذلك: GetSecretValue وPutParameter وGetParameter. ويوفر ذلك سجل تدقيق كاملًا لأغراض الامتثال. استخدموا CloudWatch Alarms مع مقاييس CloudTrail لإطلاق تنبيهات عند الوصول إلى الأسرار خارج الأنماط المعتادة؛ فعلى سبيل المثال، إذا جرى الوصول إلى سر إنتاجي من كيان IAM رئيسي غير معتاد أو من عنوان IP خارج النطاقات المعروفة لديكم، فأطلقوا تنبيهًا للتحقيق.

# CloudTrail metric filter: alert on unexpected secret access
aws logs put-metric-filter \
  --log-group-name CloudTrail/management-events \
  --filter-name 'SecretAccessOutsideHours' \
  --filter-pattern '{ $.eventSource = "secretsmanager.amazonaws.com" && $.eventName = "GetSecretValue" && $.userAgent != "lambda.amazonaws.com" }' \
  --metric-transformations \
    metricName=UnexpectedSecretAccess,metricNamespace=Security,metricValue=1

# Then create CloudWatch alarm on this metric
# Alert fires when non-Lambda principal accesses secrets

مشاركة الأسرار بين الحسابات

في البنى متعددة الحسابات، تحتاج التطبيقات في أحد الحسابات أحيانًا إلى أسرار تُدار في حساب آخر؛ فعلى سبيل المثال، قد يدير حساب أمان مركزي جميع كلمات مرور RDS. تتيح سياسات موارد Secrets Manager الوصول بين الحسابات. اضبطوا سياسة مستندة إلى الموارد على السر لمنح دور في الحساب المستهلك إذن استدعاء GetSecretValue. ويجب أن يتضمن دور الحساب المستهلك أيضًا سياسة IAM تسمح باستدعاء ARN الخاص بالسر. كما يجب أن تمنح سياسات مفتاح KMS الحساب المستهلك صلاحية الوصول إلى CMK المستخدم لتشفير السر.

# Secret resource policy: allow cross-account access
aws secretsmanager put-resource-policy \
  --secret-id 'prod/shared/rds-password' \
  --resource-policy '{
    "Statement": [{
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::999999999999:role/AppRole"
      },
      "Action": "secretsmanager:GetSecretValue",
      "Resource": "*"
    }]
  }'

# KMS key policy must also allow account 999999999999
# IAM policy in 999999999999 must allow GetSecretValue on ARN

تحقق سريع

اختبروا مدى فهمكم لمفاهيم AWS Solutions Architect (SAA-C03) الواردة في هذا الدرس.

مراجعة الدرس

تعلمتم في هذا الدرس أن: Secrets Manager يوفر تدويرًا تلقائيًا لبيانات اعتماد قواعد البيانات ومفاتيح API، وهو الخيار المفضل للأسرار التي يجب تدويرها، وأن Parameter Store يوفر تخزينًا هرميًا مجانيًا للإعدادات مع التحكم في وصول IAM المستند إلى المسارات، وأن ECS وLambda يمكنهما حقن الأسرار في صورة متغيرات بيئية من دون إجراء تغييرات على كود التطبيق. كما يوفر CloudTrail سجلات تدقيق لجميع عمليات الوصول إلى الأسرار. ننتقل بعد ذلك إلى WAF وShield وNetwork Firewall.

الأسئلة الشائعة

هل درس «Secrets Manager وParameter Store» مجاني؟

نعم — نص درس «Secrets Manager وParameter Store» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة AWS Solutions Architect، انتقل إلى CoddyKit PRO. تتضمن دورة AWS Solutions Architect 4 دروس في المجموع.

ماذا ستتعلم في «Secrets Manager وParameter Store»؟

دوّر بيانات اعتماد قاعدة البيانات تلقائيًا باستخدام Secrets Manager، وخزّن الإعدادات غير السرية في Parameter Store، وادمج كليهما مع Lambda وECS تتمرن على AWS Solutions Architect مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ AWS Solutions Architect؟

لا تُشترط خبرة سابقة. AWS Solutions Architect على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «Secrets Manager وParameter Store»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس AWS Solutions Architect هذا؟

نعم. كل درس في AWS Solutions Architect يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. KMS وACM وأنماط التشفير
  2. GuardDuty وInspector وMacie
  3. Secrets Manager وParameter Store
  4. WAF وShield وNetwork Firewall
← العودة إلى AWS Solutions Architect