{"id":"l-aws-3-4","courseId":"aws-cloud-foundations","lang":"ar","kind":"lesson","summary":"صمّم VPC بشبكات فرعية عامة وخاصة في منطقتي توافر، واشرح ما الذي يجعل الشبكة الفرعية عامة، وضيّق الزيارات المسموح بها عبر مجموعات الأمان وقوائم التحكّم في الوصول الشبكي (network ACLs).","html":"<p>كان لخادم Lantern القديم عنوان IP عام وجدار حماية لم ينظر إليه أحد، بصراحة، منذ عامين. وكانت قاعدة بياناته تستمع على المنفذ 5432 في الآلة نفسها. على AWS ستعمل قاعدة البيانات وحدها، والسؤال الأول: من يستطيع الوصول إليها أصلًا؟ الجواب يُصمَّم في <strong>Amazon VPC</strong>، شبكتك الخاصة داخل AWS.</p>\n<h2 id=\"sec-1\" tabindex=\"-1\">الـ VPC وشبكاته الفرعية</h2>\n<p>الـ <strong>VPC</strong> (السحابة الخاصة الافتراضية) شبكة معزولة في Region واحدة بنطاق عناوين IP تختاره، مثل <code dir=\"ltr\">10.0.0.0/16</code> (65,536 عنوانًا). تمنح كل Region كل حساب <strong>VPC افتراضيًا</strong> بشبكات فرعية عامة، وهو مفيد للتجارب؛ أما الإنتاج فيحصل على VPC تصمّمه بنفسك.</p>\n<p><strong>الشبكة الفرعية (subnet)</strong> شريحة من ذلك النطاق داخل <strong>منطقة توافر واحدة</strong>، مثل <code dir=\"ltr\">10.0.1.0/24</code> (256 عنوانًا، تحجز AWS خمسة منها). ولأن كل شبكة فرعية مرتبطة بمنطقة توافر واحدة (zonal)، فالصمود يعني أزواجًا: يستخدم Lantern منطقتي توافر، في كلٍّ منهما شبكة فرعية عامة وأخرى خاصة.</p>\n<figure class=\"diagram\"><svg class=\"diagram-svg\" focusable=\"false\" viewBox=\"0 0 700 330\" role=\"img\" aria-labelledby=\"l-aws-3-4-t1\"><defs><marker id=\"arrow-l-aws-3-4-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-3-4-t1\">VPC بنطاق CIDR هو 10.0.0.0/16 يمتد على منطقتي توافر، في كلٍّ منهما شبكة فرعية عامة وأخرى خاصة. توجّه الشبكات الفرعية العامة الزيارات إلى بوابة الإنترنت. والشبكات الفرعية الخاصة في المنطقتين تضم قاعدة البيانات والتطبيق، وترسل زياراتها الصادرة عبر بوابة NAT واحدة في AZ a.</title>\n  <rect class=\"d-box-warn\" x=\"300\" y=\"8\" width=\"120\" height=\"36\" rx=\"8\"/>\n  <text class=\"d-label\" x=\"360\" y=\"31\" text-anchor=\"middle\">Internet gateway</text>\n  <rect class=\"d-box\" x=\"20\" y=\"56\" width=\"660\" height=\"262\" rx=\"14\"/>\n  <text class=\"d-label-strong\" x=\"40\" y=\"80\">VPC 10.0.0.0/16</text>\n  <rect class=\"d-box\" x=\"40\" y=\"92\" width=\"300\" height=\"214\" rx=\"10\"/>\n  <text class=\"d-label-muted\" x=\"190\" y=\"112\" text-anchor=\"middle\">AZ a</text>\n  <rect class=\"d-box\" x=\"360\" y=\"92\" width=\"300\" height=\"214\" rx=\"10\"/>\n  <text class=\"d-label-muted\" x=\"510\" y=\"112\" text-anchor=\"middle\">AZ b</text>\n  <rect class=\"d-box-accent\" x=\"60\" y=\"122\" width=\"260\" height=\"70\" rx=\"8\"/>\n  <text class=\"d-label\" x=\"190\" y=\"146\" text-anchor=\"middle\">عامة 10.0.1.0/24</text>\n  <text class=\"d-code\" x=\"190\" y=\"172\" text-anchor=\"middle\">NAT gateway</text>\n  <rect class=\"d-box-primary\" x=\"60\" y=\"212\" width=\"260\" height=\"80\" rx=\"8\"/>\n  <text class=\"d-label\" x=\"190\" y=\"238\" text-anchor=\"middle\">خاصة 10.0.11.0/24</text>\n  <text class=\"d-code\" x=\"190\" y=\"266\" text-anchor=\"middle\">RDS الرئيسية، التطبيق</text>\n  <rect class=\"d-box-accent\" x=\"380\" y=\"122\" width=\"260\" height=\"70\" rx=\"8\"/>\n  <text class=\"d-label\" x=\"510\" y=\"146\" text-anchor=\"middle\">عامة 10.0.2.0/24</text>\n  <text class=\"d-code\" x=\"510\" y=\"172\" text-anchor=\"middle\">load balancer (لاحقًا)</text>\n  <rect class=\"d-box-primary\" x=\"380\" y=\"212\" width=\"260\" height=\"80\" rx=\"8\"/>\n  <text class=\"d-label\" x=\"510\" y=\"238\" text-anchor=\"middle\">خاصة 10.0.12.0/24</text>\n  <text class=\"d-code\" x=\"510\" y=\"266\" text-anchor=\"middle\">RDS standby، التطبيق</text>\n  <path class=\"d-arrow\" d=\"M190 122 L330 44\" marker-end=\"url(#arrow-l-aws-3-4-1)\"/>\n  <path class=\"d-arrow\" d=\"M510 122 L390 44\" marker-end=\"url(#arrow-l-aws-3-4-1)\"/>\n  <path class=\"d-arrow d-dashed\" d=\"M150 212 L150 194\" marker-end=\"url(#arrow-l-aws-3-4-1)\"/>\n  <path class=\"d-arrow d-dashed\" d=\"M400 220 L280 192\" marker-end=\"url(#arrow-l-aws-3-4-1)\"/>\n</svg><figcaption>الـ VPC الخاص بـ Lantern: شبكات فرعية عامة وخاصة في منطقتي توافر</figcaption></figure>\n<h2 id=\"sec-2\" tabindex=\"-1\">ما الذي يجعل الشبكة الفرعية عامة</h2>\n<p>لا شيء في الشبكة الفرعية نفسها. إنه <strong>جدول التوجيه (route table)</strong>:</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>Public route table               Private route table\n10.0.0.0/16  -&gt; local            10.0.0.0/16  -&gt; local\n0.0.0.0/0    -&gt; igw-0abc...      0.0.0.0/0    -&gt; nat-0def...</code></pre></div>\n<p>الشبكة الفرعية التي يرسل جدول التوجيه الخاص بها <code dir=\"ltr\">0.0.0.0/0</code> (كل ما ليس محليًا) إلى <strong>بوابة إنترنت (internet gateway)</strong> شبكة عامة: يستطيع المورد الموجود فيها والذي له IP عام أن يتواصل مع الإنترنت وأن يُوصَل إليه منه. أما الشبكة الفرعية الخاصة فليس فيها مسار إلى بوابة الإنترنت، فلا يستطيع أي شيء على الإنترنت أن يبدأ اتصالًا بها. وإذا احتاجت الموارد الخاصة إلى بدء اتصالات صادرة، لتنزيل تحديثات نظام التشغيل مثلًا، فإنها توجّهها عبر <strong>بوابة NAT (NAT gateway)</strong> تقع في شبكة فرعية عامة.</p>\n<p>تذهب قاعدة بيانات Lantern وخادم الترحيل إلى شبكات فرعية <strong>خاصة</strong>. أما الشبكات الفرعية العامة فلا تضم إلا بوابة NAT، ولاحقًا load balancer.</p>\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>أرخص طريق إلى S3 هو نقطة نهاية من نوع gateway</span></p>\n<p>تُحتسب بوابات NAT بالساعة ولكل غيغابايت تعالجه، وخادم Lantern الخاص يسحب الكثير من S3. تضيف <strong>نقطة النهاية من نوع gateway (gateway endpoint)</strong> لـ S3 (وأخرى لـ DynamoDB) مسارًا يُبقي تلك الزيارات داخل AWS، دون رسوم بالساعة أو لكل غيغابايت. أضف الاثنتين إلى كل VPC فيه شبكات فرعية خاصة.</p>\n</aside>\n<h2 id=\"sec-3\" tabindex=\"-1\">مجموعات الأمان: جدران حماية ذات حالة على الموارد</h2>\n<p><strong>مجموعة الأمان (security group)</strong> قائمة سماح تُرفق بواجهة الشبكة الخاصة بمورد ما: instance، أو قاعدة بيانات RDS، أو دالة Lambda داخل الـ VPC. ثلاث خصائص تجعل العمل معها مريحًا:</p>\n<ul>\n<li><strong>قواعد سماح فقط.</strong> كل ما لم يُسمح به مرفوض. المجموعات الجديدة لا تسمح بأي زيارات واردة، وتسمح بكل الزيارات الصادرة.</li>\n<li><strong>ذات حالة (stateful).</strong> إذا سُمح بطلب وارد، يُسمح بالرد الصادر تلقائيًا.</li>\n<li><strong>يمكن أن يشير بعضها إلى بعض.</strong> “اسمح بالمنفذ 5432 من المجموعة <code dir=\"ltr\">lantern-app-sg</code>” تعني “من أي شيء يحمل تلك المجموعة”، مهما كان عدد الـ instances ومهما كانت عناوينها.</li>\n</ul>\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\"> ec2</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> authorize-security-group-ingress</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> \\</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">  --group-id</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> sg-0db1111111111111a</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> \\</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">  --protocol</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> tcp</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> --port</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> 5432</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> \\</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">  --source-group</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> sg-0app222222222222b</span></span></code></pre></div>\n<p>هذه القاعدة الواحدة تقول كل شيء: قاعدة البيانات تقبل PostgreSQL من طبقة التطبيق ولا شيء غير ذلك.</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>فتح SSH للعالم كله</span></p>\n<p>القاعدة التي تسمح بالمنفذ 22 من <code dir=\"ltr\">0.0.0.0/0</code> تتعرّض للمسح خلال دقائق من إنشائها، وتصبح كل كلمة مرور ضعيفة أو خدمة SSH غير محدّثة مشكلتك أنت. أنت لا تحتاج إلى SSH وارد أصلًا: <strong>AWS Systems Manager Session Manager</strong> يفتح shell عبر وكيل SSM بصلاحيات IAM وتسجيل للنشاط، ودون أي منفذ وارد. وإذا اضطررت إلى استخدام SSH، فلا تسمح به إلا من نطاق عناوين معروف.</p>\n</aside>\n<h2 id=\"sec-4\" tabindex=\"-1\">الـ network ACLs: قواعد عديمة الحالة على الشبكات الفرعية</h2>\n<p><strong>الـ network ACL</strong> ترشّح الزيارات عند حدود الشبكة الفرعية. وتختلف عن مجموعة الأمان في كل شيء:</p>\n<div class=\"table-wrap\" role=\"region\" aria-label=\"جدول قابل للتمرير\" tabindex=\"0\"><table><thead>\n<tr>\n<th></th>\n<th>مجموعة الأمان</th>\n<th>الـ network ACL</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>تُرفق بـ</td>\n<td>الموارد (واجهات الشبكة)</td>\n<td>الشبكات الفرعية</td>\n</tr>\n<tr>\n<td>القواعد</td>\n<td>سماح فقط</td>\n<td>سماح ورفض</td>\n</tr>\n<tr>\n<td>الحالة</td>\n<td>ذات حالة: الردود مسموح بها</td>\n<td>عديمة الحالة: الردود تحتاج إلى قواعد</td>\n</tr>\n<tr>\n<td>الترتيب</td>\n<td>تُؤخذ كل القواعد في الحسبان</td>\n<td>الرقم الأصغر أولًا، وأول تطابق ينتصر</td>\n</tr>\n</tbody>\n</table></div><p>لأن الـ ACLs عديمة الحالة، فالسماح بالمنفذ 443 الوارد لا يكفي: الرد يخرج من المنفذ 443 إلى المنفذ المؤقت (ephemeral port) لدى العميل (1024–65535)، ويجب أن تسمح القواعد الصادرة بذلك أيضًا. تسمح الـ network ACL الافتراضية بكل شيء في الاتجاهين، ومعظم الفرق تتركها كذلك وتنجز العمل الحقيقي في مجموعات الأمان. الجأ إلى ACL مخصّصة حين تحتاج إلى <strong>رفض</strong> على مستوى الشبكة الفرعية كلها، مثل حجب نطاق عناوين مسيء.</p>\n<h2 id=\"sec-5\" tabindex=\"-1\">كم يكلّف هذا</h2>\n<p>الـ VPC والشبكات الفرعية وجداول التوجيه ومجموعات الأمان والـ ACLs مجانية. ما يُحتسب هو ما تضعه فيها: <strong>بوابات NAT</strong> بالساعة إضافة إلى كل غيغابايت، و<strong>عناوين IPv4 العامة</strong> بالساعة، و<strong>الزيارات بين مناطق التوافر</strong> لكل غيغابايت. بوابة NAT واحدة لكل منطقة توافر هي الخيار الصامد؛ أما بوابة واحدة مشتركة فتوفّر المال وتقبل أن يقطع تعطّل منطقة توافر الزيارات الصادرة من الموارد الخاصة. ولمشروع بحجم Lantern، الخيار الافتراضي المعقول هو بوابة NAT واحدة مع نقاط نهاية من نوع gateway، ثم إعادة النظر حين تنمو الزيارات. (ومنذ أواخر 2025 توفّر AWS أيضًا بوابة NAT <em>إقليمية</em> (regional) تتوزّع على مناطق التوافر من تلقاء نفسها ولا تحتاج إلى شبكة فرعية عامة؛ قارن سعرها قبل أن تنتقل إليها.)</p>\n<p>بهذا تكتمل الخدمات الأساسية. يجمعها القسم الرابع معًا وينشر Lantern الجديد.</p>\n","toc":[{"id":"sec-1","text":"الـ VPC وشبكاته الفرعية","level":2},{"id":"sec-2","text":"ما الذي يجعل الشبكة الفرعية عامة","level":2},{"id":"sec-3","text":"مجموعات الأمان: جدران حماية ذات حالة على الموارد","level":2},{"id":"sec-4","text":"الـ network ACLs: قواعد عديمة الحالة على الشبكات الفرعية","level":2},{"id":"sec-5","text":"كم يكلّف هذا","level":2}],"takeaways":["الـ VPC شبكتك الخاصة في Region واحدة، وكل شبكة فرعية (subnet) نطاق عناوين داخل منطقة توافر واحدة.","تكون الشبكة الفرعية عامة فقط لأن جدول التوجيه الخاص بها يرسل 0.0.0.0/0 إلى بوابة إنترنت (internet gateway)؛ أما الشبكات الفرعية الخاصة فليس فيها مسار كهذا.","مجموعات الأمان (security groups) قوائم سماح ذات حالة (stateful) تُرفق بالموارد، ويمكنها أن تسمّي مجموعة أمان أخرى كمصدر مسموح به.","الـ network ACLs قوائم قواعد عديمة الحالة (stateless) على الشبكات الفرعية، تُقيَّم بترتيب أرقامها، ويمكنها الرفض كما يمكنها السماح.","بوابات NAT وعناوين IPv4 العامة تُحتسب بالساعة، بينما تتيح نقاط النهاية من نوع gateway للشبكات الفرعية الخاصة الوصول إلى S3 وDynamoDB دون رسوم إضافية."],"further":[{"title":"How Amazon VPC works","url":"https://docs.aws.amazon.com/vpc/latest/userguide/how-it-works.html"},{"title":"Control traffic to your AWS resources using security groups","url":"https://docs.aws.amazon.com/vpc/latest/userguide/vpc-security-groups.html"},{"title":"Control subnet traffic with network access control lists","url":"https://docs.aws.amazon.com/vpc/latest/userguide/vpc-network-acls.html"},{"title":"Gateway endpoints","url":"https://docs.aws.amazon.com/vpc/latest/privatelink/gateway-endpoints.html"}],"quiz":[{"q":"<p>شبكتان فرعيتان في الـ VPC الخاص بـ Lantern متطابقتان، إلا أن جدول التوجيه في إحداهما يحتوي على المسار <code dir=\"ltr\">0.0.0.0/0 → igw-0abc…</code>. ما الذي يغيّره هذا المسار؟</p>","options":[{"text":"لا شيء، حتى تسمح مجموعة أمان بالزيارات.","why":"المسار هو ما يجعل الشبكة الفرعية عامة من الأساس. ثم ترشّح مجموعات الأمان الزيارات لكل مورد، لكنها طبقة منفصلة."},{"text":"يشفّر الزيارات الخارجة من تلك الشبكة الفرعية.","why":"المسارات تحدّد إلى أين تذهب الحزم، لا كيف تُحمى. التشفير يأتي من TLS أو بروتوكولات أخرى."},{"text":"يتيح للموارد في الشبكة الفرعية الأخرى الوصول إلى الإنترنت أيضًا.","why":"كل شبكة فرعية تستخدم جدول التوجيه الخاص بها. والشبكة الفرعية الأخرى ما زالت بلا مسار إلى بوابة الإنترنت."},{"text":"يجعل تلك الشبكة الفرعية عامة، فتستطيع الموارد التي فيها والتي لها عناوين IP عامة التواصل مع الإنترنت مباشرة.","why":"صحيح. المسار إلى بوابة إنترنت هو تعريف الشبكة الفرعية العامة في AWS."}],"answer":3},{"q":"<p>يجب أن تقبل مجموعة الأمان الخاصة بقاعدة بيانات Lantern اتصالات PostgreSQL من خوادم التطبيق فقط. أيّ قاعدة واردة (inbound) هي الأفضل؟</p>","options":[{"text":"TCP 5432 من مجموعة الأمان الخاصة بخوادم التطبيق.","why":"صحيح. الإشارة إلى مجموعة أمان تظل تعمل حين تُستبدل خوادم التطبيق أو يتغيّر عددها، دون تتبّع عناوين IP."},{"text":"TCP 5432 من 0.0.0.0/0، لأن قاعدة البيانات في شبكة فرعية خاصة على أي حال.","why":"الشبكة الفرعية الخاصة طبقة حماية واحدة. والسماح للإنترنت كله يزيل الطبقة الثانية ويتيح لأي شيء داخل الـ VPC الاتصال."},{"text":"كل الزيارات من نطاق CIDR الخاص بالـ VPC.","why":"هذا يتيح لكل مورد في الـ VPC الوصول إلى كل منفذ في قاعدة البيانات، وهذا أوسع بكثير مما يحتاجه التطبيق."},{"text":"TCP 5432 من عنوان IP الخاص الحالي لكل خادم تطبيق.","why":"يعمل حتى تُستبدل instance وتحصل على عنوان جديد. عندها تفشل الاتصالات، أو ترث instance غريبة العنوان القديم."}],"answer":0},{"q":"<p>تسمح network ACL بزيارات TCP 443 الواردة من أي مكان، لكن طلبات HTTPS إلى instance في الشبكة الفرعية تنتهي مهلتها، مع أن مجموعة الأمان الخاصة بها تسمح بـ 443. ما السبب المرجّح؟</p>","options":[{"text":"مجموعات الأمان تتجاوز الـ network ACLs، لذا تُتجاهل الـ ACL.","why":"الطبقتان تنطبقان كلتاهما. يجب أن تمرّ الزيارات عبر الـ network ACL وعبر مجموعة الأمان."},{"text":"تحتاج الـ instance إلى بوابة NAT للرد على الطلبات.","why":"بوابة NAT للموارد الخاصة التي تبدأ اتصالات صادرة. أما الردود على الطلبات الواردة في شبكة فرعية عامة فتمرّ عبر بوابة الإنترنت."},{"text":"الـ network ACLs عديمة الحالة، لذا يجب أن تسمح القواعد الصادرة أيضًا بزيارات الرد إلى المنافذ المؤقتة (ephemeral ports).","why":"صحيح. على عكس مجموعات الأمان، لا تتذكّر الـ network ACL الاتصال، فتحتاج زيارات الرد إلى قاعدة سماح خاصة بها."},{"text":"تحجب AWS المنفذ 443 في الحسابات الجديدة.","why":"لا تحجب AWS المنفذ 443 عن مواردك. الزيارات الواردة تتحكّم فيها الـ network ACLs ومجموعات الأمان الخاصة بك."}],"answer":2}],"exercise":{"kind":"spot-bug","language":"bash","code":"#!/usr/bin/env bash\nset -euo pipefail\nVPC_ID=\"vpc-0abc1234def567890\"\n\nAPP_SG=$(aws ec2 create-security-group --group-name lantern-app-sg \\\n  --description \"Lantern app servers\" --vpc-id \"$VPC_ID\" \\\n  --query GroupId --output text)\nDB_SG=$(aws ec2 create-security-group --group-name lantern-db-sg \\\n  --description \"Lantern PostgreSQL\" --vpc-id \"$VPC_ID\" \\\n  --query GroupId --output text)\n\n# Visitors reach the app over HTTPS during the migration\naws ec2 authorize-security-group-ingress --group-id \"$APP_SG\" \\\n  --protocol tcp --port 443 --cidr 0.0.0.0/0\n\n# Maintainers need a shell on the app servers\naws ec2 authorize-security-group-ingress --group-id \"$APP_SG\" \\\n  --protocol tcp --port 22 --cidr 0.0.0.0/0\n\n# Only the app servers may talk to PostgreSQL\naws ec2 authorize-security-group-ingress --group-id \"$DB_SG\" \\\n  --protocol tcp --port 5432 --cidr 0.0.0.0/0","bugLines":[18,22],"title":"راجع سكربت مجموعات الأمان","prompt":"<p>كتب أحد المتطوّعين هذا السكربت لإنشاء مجموعات الأمان الخاصة بـ Lantern خلال عملية الترحيل. التعليقات تصف المقصود، والمقصود صحيح. اختر كل سطر لا يطابق فيه الكود نسخةً آمنة من ذلك المقصود.</p>\n","hints":["HTTPS العام على خوادم التطبيق مقصود في الوقت الحالي. انظر إلى القاعدتين الأخريين.","أيّ قاعدة تكشف للإنترنت كله منفذًا يمسحه المهاجمون باستمرار؟","يقول تعليق قاعدة البيانات “only the app servers”. ماذا يعني <code dir=\"ltr\">0.0.0.0/0</code>؟"],"explanation":"<p>السطر 18 يفتح SSH لكل عنوان على الإنترنت. يجب أن يستخدم القائمون على المشروع AWS Systems Manager Session Manager، الذي لا يحتاج إلى أي قاعدة واردة على الإطلاق؛ وإذا كان SSH لا مفرّ منه، فقيّد <code dir=\"ltr\">--cidr</code> بنطاق معروف للمكتب أو للـ VPN مثل <code dir=\"ltr\">203.0.113.0/24</code>. والسطر 22 يتيح لأي شيء الوصول إلى PostgreSQL. استبدل الـ CIDR بإشارة إلى مجموعة طبقة التطبيق، كي تتبع القاعدة خوادم التطبيق أينما عملت:</p>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"bash\" data-index=\"0\"><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\"> ec2</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> authorize-security-group-ingress</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> --group-id</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> \"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">$DB_SG</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> \\</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">  --protocol</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> tcp</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> --port</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> 5432</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> --source-group</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> \"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">$APP_SG</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"</span></span></code></pre></div>\n<p>السطر 14 سليم: خلال الترحيل يصل الزوّار فعلًا إلى التطبيق عبر HTTPS. ووجود قاعدة البيانات في شبكة فرعية خاصة كان سيقلّل ضرر السطر 22، لكن الدفاع المتعدّد الطبقات يعني أن كل طبقة يجب أن تكون صحيحة بذاتها.</p>\n","checkLabels":{}},"words":770,"readMinutes":5}