لقد قمنا بتغطية عدد غير قليل من رؤوس HTTP المتعلقة بالأمان على المدونة في الأسابيع الأخيرة ولكن رئيسهم جميعًا يجب أن يكون سياسة أمن المحتوى(CSP). الرئيس، سواء بسبب مستوى الحماية الذي يوفره ولكن للأسف أيضًا بسبب صعوبة تنفيذه بشكل صحيح من أول مرة. كما هو الحال مع جميع قواعد إدارة حركة المرور في مسار الرحلة التي ناقشناها مؤخرًا، فإننا نستخدمها بأنفسنا لحماية موقع EdgeNEXUS الإلكتروني وزواره.
لقد قمنا بالعمل الشاق وشعرنا بالألم حتى لا تضطر إلى ذلك ولكن لا يمكن إنكار ضرورة التفكير والتخطيط قبل التنفيذ. لكن الأمر يستحق العناء. المفهوم الكامن وراء هذا العنوان بسيط جدًا وقوي أيضًا. باختصار، يمكنك استخدامه لتحديد الأصول المسموح بها للمحتوى الذي يمكن تحميله على موقعك الإلكتروني. وهذا يوفر حماية قوية ضد عدد من هجمات حقن الشيفرات البرمجية المنتشرة على الإنترنت الأكثر ديناميكية اليوم، مثل البرمجة النصية عبر المواقع (XSS) واختراق النقرات.
تشمل أنواع المحتوى التي يمكن التحكم فيها؛ JavaScript و CSS (نعم، يمكن أن تكون CSS خطيرة) وإطارات HTML والخطوط والصور والكائنات القابلة للتضمين مثل تطبيقات Java الصغيرة. من الرائع أن يكون لديك العديد من الخيارات ولكن هنا تنشأ الصعوبة. تحتوي المواقع الإلكترونية اليوم (بما في ذلك موقعنا) على العديد من أنواع المحتوى هذه من مصادر عديدة، وقد يكون تحديدها جميعًا وحسابها في سياسة ما أمرًا صعبًا للغاية.
قبل أن ندخل في ذلك، دعنا نلقي نظرة على عناصر قيمة الرأس وكيف تبدو السياسة. كما سترى، إنها في الأساس قائمة طويلة من أنواع المحتوى (تنتهي جميعها ب -src في هذا المثال) والمصادر المسموح بها لكل نوع. تُعرف هذه العناصر معًا باسم توجيهات السياسة.
default-src ”self“ data:; script-src ”self“ ”unsafe-inline“; connect-src ”self“; img-src ”self“ data:; style-src ”self“ ”unsafe-inline“ data:; font-src ”self“ data:; child-src ”self“
هناك أنواع أخرى من المحتوى يمكن أن نأخذها بعين الاعتبار، لكن تلك الموضحة أعلاه هي أهم التوجيهات (في رأينا، بناءً على الخطورة والانتشار). إليك التفاصيل حول المحتوى الذي يتعلق بكل منها;
- default-src – القيم الافتراضية لمعظم (وليس كل) أنواع المحتوى إذا لم يتم تحديدها لاحقًا
- script-src – المصادر المسموح بها للنصوص البرمجية (بما في ذلك JavaScript)
- connect-src – المصادر المسموح بها للاتصالات (مثل WebSockets و EventSource المستخدمة مع تطبيقات الدردشة على سبيل المثال)
- img-src – المصادر المسموح بها للصور
- style-src – المصادر المسموح بها ل CSS
- font-src – المصادر المسموح بها للخطوط
- فرعي-قrc – المصادر المسموح بها للإطارات وإطارات iframes
يتم فصل أنواع المحتوى هذه وقيمها عن بعضها البعض (محددة) بفاصلة منقوطة. يمكن أن يحتوي كل نوع على واحدة أو أكثر من القيم التالية;
- ”لا شيء“ – لا تسمح بهذا النوع من المحتوى
- ”ذاتي“ – السماح بهذا النوع من المحتوى إذا كان ينشأ مباشرةً من هذا الموقع (ولكن ليس من النطاقات الفرعية)
- ”غير آمن-مضمّن“ – السماح بتضمين CSS وجافا سكريبت (وهذا شائع جدًا للأسف)
- البيانات: – السماح بمصادر البيانات المضمنة (تُستخدم عادةً لتوفير الخطوط والصور المضمنة لتحسين الأداء)
- https: – السماح فقط بنوع المحتوى هذا عبر HTTPS
- ”غير آمن-إيفال“ – السماح بتحليل النص باستخدام طرق قد تكون خطرة قد تؤدي إلى تنفيذ التعليمات البرمجية
- اسم المجال – السماح بنوع المحتوى هذا إذا كان مصدره اسم المجال المحدد (بمعنى آخر، مجال بعيد) – يمكن استخدام هذا عدة مرات
- * – أي مجال
يتم استخدام مسافة بسيطة لتحديد كل قيمة. علامات الاقتباس المفردة ‘ مطلوبة ما لم تكن القيمة اسم مجال. لاحظ أن ملحقات المتصفح والمكونات الإضافية مستثناة لأنها تعتبر آمنة لأن المستخدم يثق بها (الذي قام بتثبيتها في النهاية).
يبدو كل شيء تقنيًا ومعقدًا إلى حد ما، ولكن إذا تناولنا الأمر خطوة بخطوة فسيكون من السهل جدًا التوصل إلى سياسة. دعونا نعمل بسرعة من خلال مثالين. أولاً، لنجرب موقع ويب داخلي بسيط يتم تقديمه عبر HTTP. إليك ما نحتاج إليه;
- بيانات ”ذاتية“ افتراضية المصدر: – السماح بالمحتوى من موقعنا فقط، بما في ذلك الكائنات المضمنة
- النص البرمجي ”ذاتي“ ”غير آمن-مضمن“ – السماح بالنصوص البرمجية من موقعنا الخاص، بما في ذلك النصوص المضمنة
- توصيل-سرك ”ذاتي“ – السماح بالاتصالات من/إلى موقعنا الخاص
- بيانات img-src ”ذاتية“: – السماح بالصور من موقعنا الخاص، بما في ذلك الصور المضمنة
- بيانات النمط المصدر ”ذاتي“ ”غير آمن-مضمّن“: – السماح ب CSS من موقعنا الخاص، بما في ذلك الأنماط المضمنة
- بيانات الخط-المصدر ”الذاتي“: – السماح بالخطوط من موقعنا الخاص، بما في ذلك الخطوط المضمنة
قيمة الرأس الكاملة قصيرة بشكل معقول:
البيانات الافتراضية-src ”ذاتي“:؛ بيانات النص-قارئ ”ذاتي“ ”غير آمن-مسطر“؛ بيانات الاتصال-قارئ ”ذاتي“؛ بيانات img-src ”ذاتي“: بيانات النمط-قارئ ”ذاتي“ ”غير آمن-مسطر“: بيانات الخط-قارئ ”ذاتي“:
ثانيًا، موقع ويب محمي بواسطة طبقة المقابس الآمنة SSL/TLS يواجه الإنترنت ويستخدم Google Analytics (GA)، وCSS مضمنة وخطوط وصور، وCSS من موقعك وصور من مواقع أخرى مختلفة. دعنا نعمل على ما نحتاجه قطعةً قطعة (الأمر ليس مختلفًا كثيرًا);
- البيانات الافتراضية-المصدر ”الذاتي“ الافتراضي: https: – السماح بالمحتوى من موقعنا فقط، بما في ذلك الكائنات المضمنة، عبر HTTPS فقط
- النص البرمجي ”ذاتي“ ”غير آمن-مضمن“ https: – السماح بالنصوص البرمجية من موقعنا الخاص، بما في ذلك النصوص المضمنة، عبر HTTPS فقط
- img-src ”ذاتي“ ”غير آمن-مضمن“ \ * https: – السماح بالصور من أي موقع، بما في ذلك الصور المضمنة من موقعنا، فقط عبر HTTPS
- style-src ”ذاتي“ ”غير آمن-مضمّن“ https: – السماح ب CSS من موقعنا فقط، بما في ذلك المضمنة منها، فقط عبر HTTPS
- font-src ”ذاتي“ ”غير آمن-مضمّن“ https: – السماح بالخطوط من موقعنا فقط، بما في ذلك الخطوط المضمنة، عبر HTTPS فقط
اجمع كل ذلك معًا وسنحصل على هذه السياسة الأطول قليلاً:
الافتراضي-src ”ذاتي“ البيانات: https: ؛ نص-قrc ”ذاتي“ ”غير آمن-مسطر“ *.google-analytics.com https: ؛ img-src ”ذاتي“ ”غير آمن-مسطر“ * https: ؛ style-src ”ذاتي“ ”غير آمن-مسطر“ https: ؛ line-src ”ذاتي“ ”غير آمن-مسطر“ https: ؛ line-src ”ذاتي“ ”غير آمن-مسطر“ https:
من السهل جداً أن أقول ذلك. لم تكن Google ”صديقة“ لـ CSP في الماضي (كانت قيمة الرأس هذه في السابق ضعف ما كانت عليه في السابق) ولكن لحسن الحظ أنها خطت خطوات كبيرة مؤخرًا. ستلاحظ أننا لم نضطر إلى إضافة المجال *.google-analytics.com إلى البرنامج النصي src كقيمة لنوع المحتوى حيث يتم تشغيل الكود الخاص بهم كبرنامج نصي مضمن.
من الناحية المثالية يمكنك إنشاء سياسة لكل صفحة على موقعك على الويب الخاص بك لأن الموارد المحملة ستختلف بلا شك باختلاف الصفحات، ولكن هذا أمر مرهق إلى حد ما ومن الأسهل بكثير، ولكنه لا يزال فعالًا، إنشاء سياسة تغطي جميع المصادر الممكنة. معظم الأمثلة الموجودة على صفحة GitHub الخاصة بنا تتبع هذا النهج، ولكن هناك أيضًا سياسة أخرى هناك إذا كنت ترغب في توفير حماية أكبر لصفحات محددة.
للاختبار واستكشاف الأخطاء وإصلاحها، أوصي بشدة باستخدام أدوات مطوري جوجل كروم. انتقل إلى الموقع المعني، ثم اضغط على F12، وانقر على الشبكة، وتأكد من وضع علامة تعطيل ذاكرة التخزين المؤقت، ثم أعد تحميل الصفحة. ستظهر أي أخطاء بوضوح. في الجزء السفلي من هذه المدونة شاشة لما قد تراه إذا كانت سياستك تحظر عدم الأمان في السطر وأنت تستخدم Google Analytics؛ رسائل الخطأ مفيدة جدًا.
اضبط سياستك حسب الضرورة واشطفها وكرر ذلك. من الناحية المثالية يمكنك القيام بذلك باستخدام خدمة افتراضية مخصصة للاختبار مع تطبيق قاعدة مسار الرحلة التي تختبرها، ولكن بخلاف ذلك تخدم نفس الموقع، فقط من خلال عنوان IP افتراضي مختلف حتى لا تؤثر على العملاء والعملاء الحقيقيين أثناء الاختبار.
وكما هو الحال دائمًا، فإن الفائدة الكبيرة لاستخدام موازن التحميل هي أننا لا نحتاج إلى القيام بذلك إلا في مكان مركزي واحد لحماية جميع خوادمنا (ومواقعنا). لا نحتاج إلى الاعتماد على المطورين أو إعادة تكوين خوادم الويب. على موازن التحميل EdgeNEXUS، نقوم فقط باستيراد قالب تكوين تلقائي من jetPACK وتعيين قاعدة حركة مرور مسار الرحلة إلى أي خدمة (خدمات) افتراضية نرغب في حمايتها (بعد إجراء التعديلات المناسبة).
تضيف القاعدة الرأس فقط إذا لم يكن موجودًا، لذا ستعمل حتى في حالة قيام خوادم الويب الخاصة بنا بإدراجه بالفعل أو ربما تدرجه لصفحات محددة فقط. يجب أن تكون هذه القاعدة جزءًا من تكوين الخدمة الافتراضية القياسية الخاصة بك – ليس لديك ما تخسره مهما كان الموقع على الرغم من أنه يوصى دائمًا بإجراء الاختبار. يمكنك تنزيل هذه الحزمة النفاثة وغيرها الكثير على موقع EdgeNEXUS Github.
برنامج flightPath هو محرك قواعد ديناميكي قائم على الأحداث تم تطويره بواسطة edgeNEXUS لمعالجة وتوجيه حركة مرور بروتوكول الإنترنت وحركة مرور HTTP و HTTPS المتوازنة بذكاء. إنه قابل للتكوين وقوي للغاية، ولكنه سهل الاستخدام للغاية.
هذه الروابط ذات الصلة تستحق القراءة إذا كنت ترغب في معرفة المزيد;
http://www.html5rocks.com/en/tutorials/security/content-security-policy/
https://developer.mozilla.org/en/docs/Web/Security/CSP/CSP_policy_directives
http://content-security-policy.com/
https://www.clickintelligence.co.uk/header-response-checker/
لقد قمنا بتغطية عدد غير قليل من عناوين HTTP المتعلقة بالأمان على المدونة في الأسابيع الأخيرة، ولكن يجب أن يكون رئيسهم جميعًا هو سياسة أمان المحتوى (CSP).