{"id":"l-aws-2-1","courseId":"aws-cloud-foundations","lang":"ar","kind":"lesson","summary":"ميّز بين مستخدمي IAM والمجموعات والـ roles، واعرف أين تُرفق السياسات القائمة على الهوية والسياسات القائمة على المورد، وتوقّع هل تسمح AWS بطلب ما باستخدام قاعدة الرفض والسماح والرفض.","html":"<p>في نهاية القسم الأول شغّلت <code dir=\"ltr\">aws sts get-caller-identity</code> فأجابت AWS. خلف تلك الإجابة، وخلف كل استدعاء آخر، يقف <strong>AWS Identity and Access Management (IAM)</strong>. إنه يجيب عن سؤال واحد مليارات المرات يوميًا: هل يحق لـ <em>هذا</em> الـ principal أن ينفّذ <em>هذا</em> الإجراء على <em>هذا</em> المورد، الآن؟ كان لخادم Lantern القديم جواب واحد لكل شيء: من يملك مفتاح SSH يستطيع فعل أي شيء. يمنحك هذا الدرس المفردات اللازمة لتفعل ما هو أفضل.</p>\n<h2 id=\"sec-1\" tabindex=\"-1\">تشريح الطلب</h2>\n<p>كل طلب إلى AWS، سواء من الـ console أو الـ CLI أو الكود، يحمل أربعة أشياء:</p>\n<ul>\n<li><strong>الـ principal (الجهة الطالبة)</strong>: من يسأل. مستخدم، أو جلسة role، أو خدمة من خدمات AWS.</li>\n<li><strong>الإجراء (action)</strong>: ما يريده، ويُكتب بالشكل <code dir=\"ltr\">service:Operation</code>، مثل <code dir=\"ltr\">s3:GetObject</code> أو <code dir=\"ltr\">dynamodb:PutItem</code>.</li>\n<li><strong>المورد (resource)</strong>: ما يريد تنفيذ الإجراء عليه، ويُعرَّف بـ <strong>ARN</strong> (اسم مورد Amazon).</li>\n<li><strong>السياق (context)</strong>: كل ما يستطيع IAM رؤيته غير ذلك، مثل عنوان IP المصدر، والوقت، وهل استُخدم MFA، وهل استخدم الطلب TLS.</li>\n</ul>\n<p>تتبع الـ ARNs النمط <code dir=\"ltr\">arn:partition:service:region:account-id:resource</code>. وتبقى بعض الأجزاء فارغة حين لا تنطبق:</p>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"text\" data-index=\"0\"><div class=\"code-head\"><span class=\"code-title\">Text</span><span class=\"code-actions\"><button type=\"button\" class=\"code-btn\" data-action=\"copy\" aria-label=\"نسخ الكود\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/></svg><span>نسخ</span></button></span></div><pre class=\"shiki\" tabindex=\"0\"><code>arn:aws:iam::111122223333:user/amara\narn:aws:s3:::lantern-posters/2026/street-food-festival.jpg\narn:aws:dynamodb:eu-west-1:111122223333:table/lantern-rsvps</code></pre></div>\n<p>IAM خدمة عامّة (global)، لذا لا يحتوي ARN المستخدم على Region. وأسماء الـ buckets في S3 فريدة على مستوى AWS كلها، لذا لا يحتوي ARN الخاص بـ S3 على Region ولا على حساب. أما جداول DynamoDB فإقليمية وتنتمي إلى حساب، لذا يحتوي الـ ARN الخاص بها على الاثنين. ستكتب الـ ARNs باستمرار في الدرس القادم.</p>\n<h2 id=\"sec-2\" tabindex=\"-1\">الهويات</h2>\n<p><strong>المستخدمون (users)</strong> هويات طويلة الأمد لشخص واحد، أو لتطبيق واحد في الإعدادات القديمة. يمكن أن يكون للمستخدم كلمة مرور للـ console وما يصل إلى مفتاحَي وصول. المستخدمون أقدم أجزاء IAM، وفي القسم الأول أنشأت واحدًا فقط، هو المدير.</p>\n<p><strong>المجموعات (groups)</strong> تجمّعات من المستخدمين. ترفق السياسات بالمجموعة، فيحصل عليها كل أعضائها. ينشئ Lantern المجموعات <code dir=\"ltr\">Admins</code> و<code dir=\"ltr\">Developers</code> و<code dir=\"ltr\">Billing</code>، فعندما ينضم متطوّع أو يغادر، تغيّر عضوية واحدة بدلًا من البحث في الصلاحيات الفردية. المجموعات ليست principals: لا يمكنك تسجيل الدخول كمجموعة، ولا تسمية مجموعة في سياسة bucket.</p>\n<p><strong>الـ roles</strong> هويات لها صلاحيات لكن <strong>بلا بيانات اعتماد طويلة الأمد</strong>. يتقمّص principal موثوق الـ role، فتعيد AWS Security Token Service (STS) بيانات اعتماد مؤقتة تنتهي صلاحيتها. وتحدّد <strong>سياسة الثقة (trust policy)</strong> الخاصة بالـ role من يحق له تقمّصه: دالة Lambda، أو instance في EC2، أو مستخدم في حساب آخر، أو أشخاص سجّلوا الدخول عبر IAM Identity Center. الـ roles هي الطريقة التي يحصل بها الكود على صلاحيات دون أسرار، والدرس الثالث من هذا القسم يبني عليها.</p>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"bash\" data-index=\"1\"><div class=\"code-head\"><span class=\"code-title\">Terminal</span><span class=\"code-actions\"><button type=\"button\" class=\"code-btn\" data-action=\"copy\" aria-label=\"نسخ الكود\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/></svg><span>نسخ</span></button></span></div><pre class=\"shiki\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#953800;--shiki-dark:#FFA657\">aws</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> iam</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> create-group</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> --group-name</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> Developers</span></span>\n<span class=\"line\"><span style=\"color:#953800;--shiki-dark:#FFA657\">aws</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> iam</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> attach-group-policy</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> --group-name</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> Developers</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> \\</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">  --policy-arn</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> arn:aws:iam::aws:policy/ReadOnlyAccess</span></span>\n<span class=\"line\"><span style=\"color:#953800;--shiki-dark:#FFA657\">aws</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> iam</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> add-user-to-group</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> --group-name</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> Developers</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> --user-name</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> sam</span></span></code></pre></div>\n<h2 id=\"sec-3\" tabindex=\"-1\">أين تعيش السياسات</h2>\n<p><strong>السياسة (policy)</strong> مستند JSON من العبارات (statements) التي تسمح بإجراءات على موارد أو ترفضها. ومكان إرفاقها يغيّر طريقة قراءتها:</p>\n<ul>\n<li><strong>السياسات القائمة على الهوية (identity-based policies)</strong> تُرفق بمستخدم أو مجموعة أو role، وتصف ما يحق لـ <em>تلك الهوية</em> فعله. وتأتي على شكل سياسات تديرها AWS (مثل <code dir=\"ltr\">ReadOnlyAccess</code>)، أو سياسات يديرها العميل تكتبها وتعيد استخدامها، أو سياسات مضمّنة (inline) مدمجة في هوية واحدة.</li>\n<li><strong>السياسات القائمة على المورد (resource-based policies)</strong> تُرفق بمورد وتسمّي <strong>الـ principal</strong> الذي تنطبق عليه. سياسة الـ bucket في S3، وسياسة المورد الخاصة بدالة Lambda، وسياسة الثقة الخاصة بالـ role، كلها قائمة على المورد.</li>\n</ul>\n<p>داخل حساب واحد، يُسمح بالطلب إذا سمح به أيٌّ من النوعين ولم يرفضه شيء. أما عبر الحسابات، فيجب أن يسمح به الطرفان.</p>\n<h2 id=\"sec-4\" tabindex=\"-1\">كيف يقرّر IAM</h2>\n<p>قاعدة التقييم تتّسع لها بطاقة صغيرة، وهي تفسّر تقريبًا كل خطأ AccessDenied ستصادفه.</p>\n<figure class=\"diagram\"><svg class=\"diagram-svg\" focusable=\"false\" viewBox=\"0 0 660 250\" role=\"img\" aria-labelledby=\"l-aws-2-1-t1\"><defs><marker id=\"arrow-l-aws-2-1-1\" viewBox=\"0 0 10 10\" refX=\"9\" refY=\"5\" markerWidth=\"7\" markerHeight=\"7\" orient=\"auto-start-reverse\"><path d=\"M0 0 L10 5 L0 10 z\" class=\"d-arrowhead\"/></marker></defs>\n  <title id=\"l-aws-2-1-t1\">مخطّط انسيابي. يفحص الطلب أولًا وجود أي رفض صريح؛ فإن وُجد كانت النتيجة الرفض. وإلا يفحص وجود أي سماح؛ فإن وُجد كانت النتيجة السماح، وإلا كانت النتيجة رفضًا ضمنيًا.</title>\n  <rect class=\"d-box\" x=\"20\" y=\"96\" width=\"120\" height=\"56\" rx=\"10\"/>\n  <text class=\"d-label\" x=\"80\" y=\"129\" text-anchor=\"middle\">الطلب</text>\n  <path class=\"d-arrow\" d=\"M140 124 L186 124\" marker-end=\"url(#arrow-l-aws-2-1-1)\"/>\n  <rect class=\"d-box-warn\" x=\"190\" y=\"90\" width=\"150\" height=\"68\" rx=\"10\"/>\n  <text class=\"d-label\" x=\"265\" y=\"119\" text-anchor=\"middle\">Deny صريح</text>\n  <text class=\"d-label\" x=\"265\" y=\"139\" text-anchor=\"middle\">في أي مكان؟</text>\n  <path class=\"d-arrow\" d=\"M265 90 L265 50\" marker-end=\"url(#arrow-l-aws-2-1-1)\"/>\n  <text class=\"d-label-muted\" x=\"278\" y=\"74\">نعم</text>\n  <rect class=\"d-box-warn\" x=\"200\" y=\"10\" width=\"130\" height=\"38\" rx=\"8\"/>\n  <text class=\"d-label-strong\" x=\"265\" y=\"35\" text-anchor=\"middle\">مرفوض</text>\n  <path class=\"d-arrow\" d=\"M340 124 L386 124\" marker-end=\"url(#arrow-l-aws-2-1-1)\"/>\n  <text class=\"d-label-muted\" x=\"352\" y=\"114\">لا</text>\n  <rect class=\"d-box-primary\" x=\"390\" y=\"90\" width=\"150\" height=\"68\" rx=\"10\"/>\n  <text class=\"d-label\" x=\"465\" y=\"119\" text-anchor=\"middle\">هل يطابق</text>\n  <text class=\"d-label\" x=\"465\" y=\"139\" text-anchor=\"middle\">أيُّ Allow؟</text>\n  <path class=\"d-arrow\" d=\"M540 124 L580 124\" marker-end=\"url(#arrow-l-aws-2-1-1)\"/>\n  <text class=\"d-label-muted\" x=\"546\" y=\"114\">نعم</text>\n  <rect class=\"d-box-success\" x=\"584\" y=\"105\" width=\"70\" height=\"38\" rx=\"8\"/>\n  <text class=\"d-label-strong\" x=\"619\" y=\"130\" text-anchor=\"middle\">مسموح</text>\n  <path class=\"d-arrow\" d=\"M465 158 L465 196\" marker-end=\"url(#arrow-l-aws-2-1-1)\"/>\n  <text class=\"d-label-muted\" x=\"476\" y=\"182\">لا</text>\n  <rect class=\"d-box\" x=\"380\" y=\"200\" width=\"170\" height=\"40\" rx=\"8\"/>\n  <text class=\"d-label-strong\" x=\"465\" y=\"225\" text-anchor=\"middle\">مرفوض ضمنيًا</text>\n</svg><figcaption>الرفض الصريح ينتصر، ثم أي سماح، وإلا فالرفض الافتراضي</figcaption></figure>\n<ol>\n<li><strong>الرفض الافتراضي.</strong> كل طلب يبدأ مرفوضًا.</li>\n<li><strong>الرفض الصريح ينتصر.</strong> إذا احتوت أي سياسة منطبقة على <code dir=\"ltr\">Deny</code> مطابق، فالجواب لا. ولا شيء يستطيع تجاوزه.</li>\n<li><strong>السماح الصريح يُجيز.</strong> وإلا، إذا احتوت سياسة على <code dir=\"ltr\">Allow</code> مطابق، فالجواب نعم.</li>\n<li><strong>لا تطابق يعني لا.</strong> إذا لم يسمح بالطلب شيء، يبقى الرفض الافتراضي قائمًا. ويُسمّى هذا الرفض الضمني (implicit deny).</li>\n</ol>\n<p>وتضيف الإعدادات الأكبر طبقات أخرى لا تستطيع إلا تضييق ما هو مسموح، مثل سياسات التحكّم في الخدمات (service control policies) في AWS Organizations، وحدود الصلاحيات (permissions boundaries) على مستخدمين وroles بعينهم. تظل القاعدة أعلاه صحيحة؛ كل ما تفعله تلك الطبقات أنها تضيف أماكن أخرى قد يأتي منها الرفض.</p>\n<p>يمكنك أن تطلب من IAM تقييم طلب دون تنفيذه:</p>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"bash\" data-index=\"2\"><div class=\"code-head\"><span class=\"code-title\">Terminal</span><span class=\"code-actions\"><button type=\"button\" class=\"code-btn\" data-action=\"copy\" aria-label=\"نسخ الكود\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/></svg><span>نسخ</span></button></span></div><pre class=\"shiki\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#953800;--shiki-dark:#FFA657\">aws</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> iam</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> simulate-principal-policy</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> \\</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">  --policy-source-arn</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> arn:aws:iam::111122223333:user/sam</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> \\</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">  --action-names</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> s3:DeleteBucket</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> \\</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">  --resource-arns</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> arn:aws:s3:::lantern-posters</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> \\</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">  --query</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> \"EvaluationResults[].EvalDecision\"</span></span></code></pre></div>\n<p>يكون الجواب <code dir=\"ltr\">allowed</code> أو <code dir=\"ltr\">explicitDeny</code> أو <code dir=\"ltr\">implicitDeny</code>، فيخبرك لا بـ <em>هل</em> فقط، بل بـ <em>لماذا</em> أيضًا.</p>\n<aside class=\"callout callout-mistake\" role=\"note\"><p class=\"callout-title\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3\"/><path d=\"M12 9v4\"/><path d=\"M12 17h.01\"/></svg><span><span class=\"callout-kind\">خطأ شائع</span><span class=\"callout-sep\" aria-hidden=\"true\"> · </span>مستخدم IAM واحد مشترك للفريق كله</span></p>\n<p>كانت عادة Lantern القديمة مفتاح SSH واحدًا يتداوله الجميع. والنسخة السحابية من ذلك مستخدم IAM واحد يعرف الجميع كلمة مروره. تفقد بذلك أي سجل لمن فعل ماذا، ولا تستطيع إزالة وصول شخص واحد دون تغيير بيانات الجميع، وينتهي الـ MFA على هاتف شخص واحد. هوية واحدة لكل إنسان، والصلاحيات عبر المجموعات، دائمًا.</p>\n</aside>\n<aside class=\"callout callout-tip\" role=\"note\"><p class=\"callout-title\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5\"/><path d=\"M9 18h6\"/><path d=\"M10 22h4\"/></svg><span><span class=\"callout-kind\">نصيحة</span><span class=\"callout-sep\" aria-hidden=\"true\"> · </span>تكلفة IAM</span></p>\n<p>لا رسوم على IAM نفسه. ما يظهر هو تكلفة الخطأ فيه: بيانات اعتماد مسرّبة تشغّل برنامج تعدين عملات مشفّرة لحساب شخص آخر على فاتورتك. الصلاحيات المحكمة أداة للتحكّم في التكلفة بقدر ما هي أداة أمان.</p>\n</aside>\n<p>أصبحت تستطيع قراءة من يسأل وكيف يُتّخذ القرار. في الدرس التالي تكتب السياسات نفسها، سطرًا سطرًا.</p>\n","toc":[{"id":"sec-1","text":"تشريح الطلب","level":2},{"id":"sec-2","text":"الهويات","level":2},{"id":"sec-3","text":"أين تعيش السياسات","level":2},{"id":"sec-4","text":"كيف يقرّر IAM","level":2}],"takeaways":["يحمل كل طلب إلى AWS أربعة أشياء، هي الـ principal والإجراء والـ ARN الخاص بالمورد والسياق، ويقيّمها IAM كلها قبل أن يحدث أي شيء.","المستخدمون هويات طويلة الأمد، والمجموعات وسيلة لمنح المستخدمين السياسات نفسها، والـ roles هويات بلا بيانات اعتماد طويلة الأمد يتقمّصها principals موثوقون للحصول على بيانات اعتماد مؤقتة.","تُرفق السياسات القائمة على الهوية بالمستخدمين والمجموعات والـ roles؛ أما السياسات القائمة على المورد، مثل سياسات الـ buckets في S3، فتُرفق بالمورد وتسمّي principal.","كل شيء مرفوض افتراضيًا، ويلزم سماح صريح لإجازة أي طلب، والرفض الصريح في أي مكان ينتصر دائمًا."],"further":[{"title":"IAM identities (users, user groups, and roles)","url":"https://docs.aws.amazon.com/IAM/latest/UserGuide/id.html"},{"title":"Policy evaluation logic","url":"https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_evaluation-logic.html"},{"title":"IAM identifiers (ARNs)","url":"https://docs.aws.amazon.com/IAM/latest/UserGuide/reference-identifiers.html"}],"quiz":[{"q":"<p>ليس لدى Sam، المطوّر في Lantern، أي سياسات تذكر DynamoDB. شغّل Sam الأمر <code dir=\"ltr\">aws dynamodb scan --table-name lantern-rsvps</code>. ماذا يحدث؟</p>","options":[{"text":"ينجح، لأن لا شيء يرفضه.","why":"يعمل IAM بمبدأ الرفض الافتراضي. يحتاج الطلب إلى سماح صريح من سياسة ما، ولا شيء يسمح بهذا الطلب."},{"text":"يُرفض، لأن لا سياسة تسمح بالإجراء (رفض ضمني).","why":"صحيح. في غياب سماح مطابق، يبقى الرفض الافتراضي قائمًا ويعيد الـ CLI خطأ AccessDenied."},{"text":"ينجح فقط إذا سجّل Sam الدخول باستخدام MFA.","why":"لا يهمّ MFA إلا عندما يتحقّق منه شرط في سياسة ما. ولا يستطيع أن يخلق صلاحيات لا تمنحها أي سياسة."}],"answer":1},{"q":"<p>سياسة تسمح بـ <code dir=\"ltr\">s3:*</code> على الـ bucket الخاص بملصقات Lantern لمجموعة Developers، وسياسة ثانية ترفض صراحةً <code dir=\"ltr\">s3:DeleteBucket</code> للمجموعة نفسها. حاول مطوّر حذف الـ bucket. ماذا يحدث؟</p>","options":[{"text":"يُرفض، لأن الرفض الصريح يتغلّب على أي سماح.","why":"صحيح. عبارات الرفض تُفحص أولًا وتنتصر دائمًا، ما يجعلها حاجز حماية موثوقًا."},{"text":"ينجح، لأن السماح الأعمّ أُرفق أولًا.","why":"ترتيب الإرفاق وترتيب العبارات لا يهمّان. يقيّم IAM كل السياسات المنطبقة معًا."},{"text":"ينجح، لأن <code dir=\"ltr\">s3:*</code> أقوى من إجراء منفرد.","why":"الرموز البديلة (wildcards) توسّع فقط ما يطابقه السماح. ولا تتفوّق أبدًا على الرفض."}],"answer":0},{"q":"<p>أيّ عبارة عن الـ roles في IAM صحيحة؟</p>","options":[{"text":"للـ role كلمة مرور خاصة به، تشاركها مع الفريق الذي يستخدمه.","why":"ليس للـ roles كلمة مرور ولا مفاتيح وصول طويلة الأمد. وهذه ميزتها الأمنية الرئيسية."},{"text":"الـ role نوع من المجموعات، لذا تضيف المستخدمين إليه.","why":"المجموعات تحتوي مستخدمين؛ أما الـ roles فلا. يتقمّص الـ principal الـ role ويحصل على صلاحياته طوال الجلسة."},{"text":"يتقمّص الـ role principal موثوق، فيحصل على بيانات اعتماد مؤقتة تنتهي صلاحيتها.","why":"صحيح. تحدّد سياسة الثقة (trust policy) الخاصة بالـ role من يحق له تقمّصه، وتُصدر AWS STS بيانات اعتماد تنتهي بعد مدة الجلسة."},{"text":"لا يمكن أن تستخدم الـ role إلا خدمات AWS، ولا يستخدمه البشر أبدًا.","why":"يتقمّص الناس الـ roles طوال الوقت، مثلًا عبر IAM Identity Center أو عند تبديل الـ role في الـ console."}],"answer":2}],"exercise":{"kind":"choice","multiple":true,"options":["sam-get","sam-delete","sam-scan","role-get","group-principal"],"correct":["sam-get","role-get"],"title":"مسموح أم مرفوض؟","prompt":"<p>كل ما يلي يحدث في حساب AWS الوحيد الخاص بـ Lantern.</p>\n<ul>\n<li>لمجموعة <strong>Developers</strong> (وSam عضو فيها) سياسة قائمة على الهوية تسمح بـ <code dir=\"ltr\">s3:GetObject</code> و<code dir=\"ltr\">s3:DeleteObject</code> على <code dir=\"ltr\">arn:aws:s3:::lantern-posters/*</code>.</li>\n<li>سياسة الـ bucket المسمّى <strong>lantern-posters</strong> ترفض صراحةً <code dir=\"ltr\">s3:DeleteObject</code> لكل الـ principals، وتسمح بـ <code dir=\"ltr\">s3:GetObject</code> للـ role المسمّى <code dir=\"ltr\">lantern-thumbnailer</code>.</li>\n<li>ليس للـ role المسمّى <strong>lantern-thumbnailer</strong> أي سياسات قائمة على الهوية على الإطلاق.</li>\n</ul>\n<p>اختر كل طلب <strong>تسمح</strong> به AWS.</p>\n","hints":["مرّر كل طلب عبر الترتيب: هل يوجد رفض صريح في أي مكان؟ ثم هل يوجد أي سماح؟ ثم الرفض الافتراضي.","داخل حساب واحد، يكفي سماح في سياسة قائمة على الهوية أو في سياسة قائمة على المورد، ما دام لا شيء يرفض.","طلبان مسموح بهما. أحدهما تسمح به سياسة الـ bucket وحدها."],"explanation":"<p>يطابق <code dir=\"ltr\">GetObject</code> الذي ينفّذه Sam السماحَ في سياسة المجموعة ولا شيء يرفضه، فينجح. و<code dir=\"ltr\">DeleteObject</code> الذي ينفّذه Sam تسمح به سياسة المجموعة أيضًا، لكن الرفض الصريح في سياسة الـ bucket ينتصر. أما مسح Sam لجدول DynamoDB فلا يطابق أي سماح في أي مكان، فيبقى الرفض الافتراضي قائمًا. وليس للـ role الخاص بإنشاء الصور المصغّرة سياسات هوية، لكن سياسة الـ bucket تسمّيه كـ principal وتسمح له بـ <code dir=\"ltr\">GetObject</code>؛ وداخل حساب واحد يكفي هذا السماح القائم على المورد. وأخيرًا، المجموعات ليست principals، لذا لا تستطيع سياسة bucket أن تسمّي مجموعة Developers أصلًا؛ وبدلًا من ذلك تمنح المجموعة الصلاحية عبر سياستها القائمة على الهوية.</p>\n","checkLabels":{},"optionText":{"sam-get":{"text":"ينزّل Sam الملف <code dir=\"ltr\">s3://lantern-posters/2026/street-food-festival.jpg</code> باستخدام <code dir=\"ltr\">aws s3 cp</code>.","why":"مسموح. تسمح سياسة المجموعة بـ <code dir=\"ltr\">s3:GetObject</code> على الكائنات في الـ bucket، ولا ترفضه أي سياسة."},"sam-delete":{"text":"يحذف Sam ملصقًا قديمًا باستخدام <code dir=\"ltr\">aws s3 rm</code>.","why":"مرفوض. تسمح به المجموعة، لكن الرفض الصريح في سياسة الـ bucket ينطبق على كل الـ principals، والرفض الصريح ينتصر دائمًا."},"sam-scan":{"text":"يمسح Sam جدول DynamoDB المسمّى <code dir=\"ltr\">lantern-rsvps</code>.","why":"مرفوض. لا شيء يسمح لـ Sam بأي إجراء في DynamoDB، فهذا رفض ضمني."},"role-get":{"text":"دالة Lambda تعمل بالـ role المسمّى <code dir=\"ltr\">lantern-thumbnailer</code> تقرأ ملصقًا.","why":"مسموح. سياسة الـ bucket سياسة قائمة على المورد تسمّي الـ role وتسمح بالقراءة؛ وداخل حساب واحد يكفي هذا."},"group-principal":{"text":"تُعدَّل سياسة الـ bucket لتسمح بـ <code dir=\"ltr\">s3:PutObject</code> مع جعل مجموعة Developers هي الـ principal، ثم يرفع Sam ملصقًا.","why":"مرفوض، بل إن تعديل السياسة نفسه يفشل في التحقّق. المجموعات ليست principals، لذا لا تستطيع سياسة قائمة على المورد أن تسمّي مجموعة."}}},"words":771,"readMinutes":5}