EduFlow
أساسيات AWS السحابية
⁦0%⁩

الوحدة 2 · الهوية والأمان

Identity Center للأشخاص، والـ roles لأحمال العمل

17 دقراءة 4 درتّب الخطوات

الدرس في لمحة

امنح الأشخاص الوصول عبر IAM Identity Center، وامنح الكود الوصول عبر الـ roles في IAM، كي يعمل Lantern دون أي مفاتيح وصول طويلة الأمد على الحواسيب أو الخوادم أو في Git.

  1. 1الأشخاص: IAM Identity Center
  2. 2أحمال العمل: roles لا مفاتيح
  3. 3الخطأ الذي ينتهي بفاتورة ضخمة

لا فيديو هنا، بل الشيء الحقيقي: درس مكتوب وأمثلة قابلة للتشغيل واختبار وتدريب.

انتهى القسم الأول بمستخدم مدير واحد لشخص واحد في حساب واحد. أما Lantern الآن فلديه ستة متطوّعين، وحساب للتطوير وآخر للإنتاج، ودالة Lambda، ومهمة ليلية على EC2. إذا احتاج كل واحد من هؤلاء إلى مستخدم IAM بمفاتيح وصول، فستنتهي بنحو اثني عشر سرًّا طويل الأمد مبعثرة على الحواسيب والخوادم. هذا الدرس يزيلها كلها إلا القليل.

الأشخاص: IAM Identity Center

AWS IAM Identity Center هو المكان الذي يسجّل فيه فريق عملك الدخول. يحصل كل شخص على هوية واحدة، إما في الدليل المدمج في Identity Center أو مُزامَنة من مزوّد هوية مثل Microsoft Entra ID أو Okta أو Google Workspace. يسجّل الشخص الدخول مرة واحدة، مع MFA، عبر رابط بوابة وصول AWS (AWS access portal)، فيرى كل حساب مسموح له بدخوله.

ما يستطيع فعله في كل حساب يأتي من حزم الصلاحيات (permission sets): حزمة مسمّاة من السياسات، مثل DeveloperAccess أو ReadOnly. عندما تُسند “المتطوّعة Rita، حزمة الصلاحيات DeveloperAccess، الحساب lantern-dev”، ينشئ Identity Center role مطابقًا في ذلك الحساب، وتتقمّصه جلسة Rita. لا أحد لديه مستخدم IAM؛ ولا أحد لديه مفتاح طويل الأمد.

صُمِّم Identity Center ليعمل مع AWS Organizations، الذي يجمع حسابات Lantern تحت حساب إدارة واحد. انتبه إلى عقبة عملية واحدة: في خطة الحساب المجانية، يؤدّي الانضمام إلى مؤسسة (organisation) إلى ترقية الحساب إلى الخطة المدفوعة، لذا فهذه خطوة لوقت انتقال Lantern إلى الإنتاج.

في الـ CLI، يكتب aws configure sso الـ profile، ويفتح aws sso login المتصفّح لتسجيل الدخول:

~/.aws/config
[sso-session lantern]
sso_start_url = https://lantern.awsapps.com/start
sso_region = eu-west-1
sso_registration_scopes = sso:account:access

[profile lantern-dev]
sso_session = lantern
sso_account_id = 444455556666
sso_role_name = DeveloperAccess
region = eu-west-1
Terminal
aws sso login --sso-session lantern
aws sts get-caller-identity --profile lantern-dev

الـ Arn الذي يعود الآن يُقرأ assumed-role/AWSReservedSSO_DeveloperAccess_…/rita: جلسة role، لا مستخدم.

أحمال العمل: roles لا مفاتيح

يحتاج الكود إلى بيانات اعتماد أيضًا، والجواب دائمًا role تتقمّصه المنصّة نيابة عنك:

  • Lambda: لكل دالة execution role (role التنفيذ).
  • EC2: يوصل الـ instance profile بيانات اعتماد الـ role عبر خدمة البيانات الوصفية للـ instance (instance metadata service).
  • Amazon ECS: task role لكل task definition.
  • الـ CI/CD خارج AWS، مثل GitHub Actions: مزوّد هوية OpenID Connect في IAM، فيستبدل الـ pipeline الـ token الخاص به بجلسة role.

للـ role سياستان دائمًا. سياسة الثقة (trust policy) تحدّد من يحق له تقمّصه:

trust-policy.json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": { "Service": "lambda.amazonaws.com" },
      "Action": "sts:AssumeRole"
    }
  ]
}

وسياسة الصلاحيات (permissions policy) تحدّد ما يحق للـ role فعله بعد تقمّصه، وتُكتب تمامًا مثل سياسات الدرس السابق.

تطلب خدمة Lambda من STS تقمّص الـ role المسمّى lantern-rsvp. يفحص STS سياسة الثقة ويعيد بيانات اعتماد مؤقتة. يستخدمها كود الدالة لاستدعاء DynamoDB، حيث يفحص IAM سياسة صلاحيات الـ role. Lambda دالة rsvp AWS STS يفحص سياسة الثقة DynamoDB يفحص الصلاحيات 1 AssumeRole 2 بيانات اعتماد مؤقتة 3 PutItem موقَّع
تتقمّص Lambda الـ execution role الخاص بها، ثم تستدعي DynamoDB ببيانات اعتماد مؤقتة

عندئذٍ لا يحتوي الكود الخاص بك على أي بيانات اعتماد على الإطلاق. تستخدم حزم AWS SDK سلسلة بيانات اعتماد افتراضية (default credential chain) تعثر على بيانات اعتماد الـ role المؤقتة تلقائيًا:

rsvp/index.mjs
import { DynamoDBClient } from "@aws-sdk/client-dynamodb";

// No keys here: the SDK finds the execution role's temporary credentials.
const client = new DynamoDBClient({});
// …handler code that calls client.send(…)

الخطأ الذي ينتهي بفاتورة ضخمة

أحيانًا يكون مفتاح الوصول أمرًا لا مفرّ منه فعلًا، كأداة خارجية لا تقبل إلا المفاتيح. عندئذٍ: مستخدم IAM واحد لكل أداة، وسياسة بأقل الصلاحيات، وشرط aws:SourceIp إذا كانت للأداة عناوين ثابتة، وتدوير للمفتاح وفق جدول زمني.

التخلّص من مفتاح موجود تسلسل دقيق، لأن حذف مفتاح ما زال شيء ما يستخدمه يعطّل الإنتاج. تحقّق من آخر مرة استُخدم فيها:

Terminal
aws iam get-access-key-last-used --access-key-id AKIAIOSFODNN7EXAMPLE

بمجرد أن يثبت أن لا شيء استخدمه منذ تشغيل البديل، عطّله أولًا (وهذا قابل للتراجع)، وانتظر، ولا تحذفه إلا حين لا يشكو شيء. أما المفتاح الذي تشكّ في تسرّبه فأمره مختلف: عطّله فورًا، ثم حقّق في الأمر بعد ذلك.

بهذا تكتمل الهوية. يضعها القسم الثالث موضع التطبيق وأنت تختار قطع الحوسبة والتخزين وقاعدة البيانات والشبكة لـ Lantern.

أهم النقاط

  • يمنح IAM Identity Center كل شخص تسجيل دخول واحدًا، مع MFA، إلى كل حساب يحتاجه، ويوزّع بيانات اعتماد قصيرة الأمد عبر حزم الصلاحيات (permission sets).
  • تحصل أحمال العمل على صلاحياتها من الـ roles، مثل الـ execution role في Lambda أو الـ instance profile في EC2، وتعثر حزم AWS SDK على بيانات الاعتماد المؤقتة هذه دون أي كود.
  • للـ role سياستان؛ سياسة الثقة تحدّد من يحق له تقمّصه، وسياسة الصلاحيات تحدّد ما يحق له فعله بعد ذلك.
  • مفاتيح الوصول طويلة الأمد في الكود أو ملفات الإعداد أو متغيّرات البيئة من أكثر الطرق شيوعًا لاختراق حسابات AWS.
  • عند التخلّص من مفتاح وصول قديم، تأكّد من أنه غير مستخدم عبر تاريخ آخر استخدام له، ثم عطّله، ولا تحذفه إلا بعد ذلك.

قراءات إضافية

تحقّق من فهمك

3 أسئلة

السؤال 1 من 3

يجب أن تكتب دالة تأكيد الحضور في Lantern إلى DynamoDB. كيف يجب أن تحصل على بيانات الاعتماد؟

السؤال 2 من 3

سياسة الصلاحيات الخاصة بـ role تسمح بـ dynamodb:PutItem على جدول تأكيدات الحضور، لكن الـ instances في EC2 تفشل في تقمّص الـ role. أيّ سياسة هي الخاطئة على الأرجح؟

السؤال 3 من 3

لدى Lantern الآن حسابان منفصلان للتطوير والإنتاج وستة متطوّعين. ما أفضل طريقة لمنح المتطوّعين وصولًا إلى الـ console والـ CLI؟

تدريب

رتّب الخطوات

تخلّص من مفتاح وصول المهمة الليلية

تعمل مهمة التصدير الليلية في Lantern على instance في EC2 وتقرأ مفتاح وصول من /etc/lantern/.env. المفتاح لم يتسرّب؛ وأنت تستبدله بـ role خلال أسبوع هادئ، دون تعطيل المهمة. رتّب الخطوات ترتيبًا آمنًا.

استخدم أزرار الأسهم لإعادة الترتيب.

  1. 1عطّل مفتاح الوصول القديم وراقب التشغيلات القليلة التالية.
  2. 2شغّل aws iam get-access-key-last-used بعد التشغيل الليلي التالي لتتأكّد من أن المفتاح القديم خامل.
  3. 3أنشئ role بسياسة ثقة لـ ec2.amazonaws.com وأرفق به سياسة الصلاحيات.
  4. 4أرفق الـ role بالـ instance في EC2 عبر instance profile.
  5. 5احذف مفتاح الوصول القديم.
  6. 6اكتب سياسة صلاحيات بأقل الصلاحيات لما تفعله مهمة التصدير بالضبط.
  7. 7على الـ instance، شغّل aws sts get-caller-identity وتأكّد من أن الـ ARN جلسة من نوع assumed-role.
  8. 8أزل مفتاح الوصول من /etc/lantern/.env وأعد تشغيل المهمة.