10 أفضل الممارسات لتأمين صور عامل الميناء. الجزء 2

تم إعداد ترجمة للمقال خصيصًا لطلاب دورة Linux Security .


اقرأ الجزء الأول


5. لا تترك البيانات الحساسة في صور عامل الميناء


في بعض الأحيان ، عند إنشاء تطبيق داخل صورة Docker ، فإنك تحتاج إلى بيانات حساسة مثل مفتاح SSH خاص لاستخراج الشفرة من مستودع خاص أو رموز خاصة لتثبيت الحزم المغلقة. إذا قمت بنسخها إلى حاوية Docker وسيطة ، فسيتم تخزينها مؤقتًا في الطبقة التي تمت إضافتها إليها ، حتى إذا قمت بحذفها لاحقًا. يجب تخزين هذه الرموز المميزة والمفاتيح خارج Dockerfile .

استخدام بنيات متعددة المراحل


باستخدام دعم Docker للبنيات متعددة المراحل ، تعامل مع الأسرار في الطبقة الوسطى من الصورة ، والتي يتم حذفها لاحقًا حتى لا تصل البيانات الحساسة إلى البنية النهائية. استخدم الكود التالي لإضافة بيانات سرية إلى الوسيطة:

 FROM: ubuntu as intermediate WORKDIR /app COPY secret/key /tmp/ RUN scp -i /tmp/key build@acme/files . FROM ubuntu WORKDIR /app COPY --from=intermediate /app . 

استخدام أوامر أسرار عامل الميناء


استخدم الدالة alpha في Docker لإدارة البيانات الحساسة لتحميل الملفات الحساسة دون تخزينها مؤقتًا:

 # syntax = docker/dockerfile:1.0-experimental FROM alpine # shows secret from default secret location RUN --mount=type=secret,id=mysecret cat /run/secrets/mysecre # shows secret from custom secret location RUN --mount=type=secret,id=mysecret,dst=/foobar cat /foobar 

يمكنك معرفة المزيد حول إدارة البيانات الحساسة على موقع Docker الإلكتروني.

احذر النسخ المتكرر


يجب أيضًا الانتباه إلى نسخ الملفات إلى الصورة التي تم إنشاؤها. على سبيل المثال ، يقوم الأمر التالي بنسخ مجلد سياق التجميع بالكامل بشكل متكرر إلى صورة Docker ، مما قد يؤدي أيضًا إلى نسخ الملفات الحساسة:

 COPY . . 

إذا كانت هناك ملفات حساسة في مجلدك ، .dockerignore أو استخدم .dockerignore لتجاهلها:

 private.key appsettings.json 

6. استخدام العلامات الثابتة للحصانة


يمكن أن تحتوي كل صورة Docker على علامات متعددة تمثل أشكالًا لنفس الصور. العلامة الأكثر شيوعًا هي latest ، حيث تمثل أحدث إصدار من الصورة. علامات الصورة غير قابلة للتغيير ، ويمكن لمؤلف الصور نشر العلامة نفسها عدة مرات.

هذا يعني أن الصورة الأساسية لملف Docker الخاص بك يمكن أن تتغير بين البنيات. هذا يمكن أن يؤدي إلى سلوك غير متوقع بسبب التغييرات التي أجريت على الصورة الأساسية.

هناك عدة طرق لإصلاح هذه المشكلة:

  • تفضل العلامة الأكثر تحديدًا المتاحة. إذا كانت الصورة تحتوي على عدة علامات ، مثل :8 و :8.0.1 أو حتى :8.0.1-alpine ، تفضل الأخيرة ، حيث إنها الرابط الأكثر تحديدًا للصورة. تجنب استخدام العلامات الأكثر شيوعًا ، مثل الأحدث. عند تثبيت علامة معينة ، ضع في اعتبارك أنه يمكن حذفها في النهاية.
  • لحل المشكلة المتعلقة بعدم إمكانية الوصول إلى علامة صورة معينة وتصبح حدًا لعرض الإعلانات للمجموعات التي تعتمد عليها ، فكّر في بدء نسخة متطابقة محلية لتلك الصورة في السجل أو الحساب الخاضع لسيطرتك الخاصة. من المهم أن تأخذ في الاعتبار تكاليف الصيانة اللازمة لهذا النهج ، لأن هذا يعني أنك بحاجة إلى الحفاظ على السجل. من الممارسات الجيدة تكرار الصورة التي تريد استخدامها في السجل للتأكد من أن الصورة التي تستخدمها لا تتغير.
  • أن تكون محددة للغاية! بدلاً من سحب العلامة ، اسحب الصورة باستخدام رابط SHA256 محدد إلى صورة Docker ، مما يضمن حصولك على الصورة نفسها لكل طلب. ومع ذلك ، لاحظ أن استخدام رابط SHA256 قد ينطوي على المخاطرة التالية - إذا تغيرت الصورة ، فقد لا تعمل علامة التجزئة.

7. استخدم COPY بدلاً من ADD


يوفر Docker أمرين لنسخ الملفات من المضيف إلى صورة Docker عند إنشائه: COPY و ADD . الأوامر متشابهة في طبيعتها ، ولكنها تختلف في وظائفها:

  • نسخ - نسخ الملفات المحلية بشكل متكرر ، مع الإشارة إلى المصدر أو الهدف الملفات أو الدلائل. مع COPY يجب أن تعلن المواقع.
  • إضافة - نسخ الملفات المحلية بشكل متكرر ، وإنشاء دليل وجهة ضمنيا في حالة عدم وجوده ، وقبول المحفوظات كعناوين URL محلية أو بعيدة كمصدر ، والذي يمتد أو يتم تحميله ، على التوالي ، إلى الدليل الوجهة.
    على الرغم من أن الاختلافات بين ADD و COPY ليست جوهرية ، فهي مهمة. كن على دراية بهم لتجنب مشاكل الأمان المحتملة:
  • عند استخدام عناوين URL عن بُعد لتنزيل البيانات مباشرةً إلى موقعها الأصلي ، يمكن أن يؤدي ذلك إلى هجمات الوسيط التي تقوم بتعديل محتويات الملف الذي تم تنزيله. بالإضافة إلى ذلك ، يجب التحقق من مصدر عناوين URL عن بُعد وأصالتها. عند استخدام COPY ، يجب الإعلان عن مصدر الملفات التي سيتم تنزيلها من عناوين URL البعيدة عبر اتصال TLS آمن ، كما يجب التحقق من مصدرها.
  • ملاحظات على مساحة وطبقات الصور: يتيح لك استخدام COPY فصل إضافة الأرشيف عن المواقع البعيدة وفك ضغطه في طبقات مختلفة ، مما يحسن ذاكرة التخزين المؤقت للصور. إذا كانت الملفات البعيدة مطلوبة ، فجمعها جميعًا في أمر RUN واحد ، والذي يقوم لاحقًا بتنزيل واستخراج وتطهير ، مما يؤدي إلى تحسين عملية طبقة واحدة على عدة طبقات تكون مطلوبة باستخدام ADD.
  • عند استخدام الأرشيفات المحلية ، يقوم ADD باستخراجها تلقائيًا إلى الدليل الوجهة. على الرغم من أن هذا قد يكون مقبولًا ، إلا أنه يضيف خطورة الحصول على قنابل مضغوطة ونقاط ضعف Zip Zip ، والتي يمكن إطلاقها تلقائيًا.

8. استخدام العلامات الفوقية


توفر تسميات الصور بيانات وصفية للصور التي تنشئها. هذا يجعل من السهل على المستخدمين معرفة كيفية استخدام الصورة. العلامة الأكثر شيوعًا هي "المشرف" ، والتي تشير إلى عنوان البريد الإلكتروني واسم الشخص الذي يدعم هذه الصورة. أضف بيانات التعريف باستخدام أمر LABEL التالي:

 LABEL maintainer="me@acme.com" 

بالإضافة إلى جهات اتصال المشرف ، أضف أي بيانات تعريف مهمة لك. قد تحتوي هذه البيانات الوصفية على: تجزئة الالتزام ، رابط للتجميع المناسب ، وحالة الجودة (هل تم اجتياز جميع الاختبارات؟) ، شفرة المصدر ، رابط إلى موقع ملف SECURITY.TXT ، إلخ.

من الممارسات الجيدة دعم ملف SECURITY.TXT (RFC5785) ، والذي يشير إلى سياسة الإفصاح المسؤول عن نظام تسمية Docker الخاص بك عند إضافة برامج جديدة ، على سبيل المثال:

 LABEL securitytxt="https://www.example.com/.well-known/security.txt" 

مشاهدة المزيد من المعلومات المتعلقة بصور Docker:

https://label-schema.org/rc1/

9. استخدم مجموعة متعددة المراحل للصور الصغيرة والآمنة


عند إنشاء تطبيق باستخدام Dockerfile ، يتم إنشاء العديد من الأعمال الفنية المطلوبة فقط في وقت البناء. يمكن أن تكون أدوات تطوير ومكتبات مطلوبة للتجميع ، أو التبعيات اللازمة لتشغيل اختبارات الوحدات والملفات المؤقتة والأسرار وما إلى ذلك.

يؤدي تخزين هذه القطع الأثرية في صورة أساسية يمكن استخدامها في الإنتاج إلى زيادة في حجم صورة Docker ، والتي يمكن أن تؤثر بشكل كبير على الوقت المستغرق لتنزيلها وكذلك زيادة سطح الهجوم ، ونتيجة لذلك سيتم تثبيت المزيد من الحزم. وينطبق الشيء نفسه على صورة Docker التي تستخدمها - فقد تحتاج إلى إنشاء صورة Docker محددة ، ولكن ليس لتشغيل رمز التطبيق الخاص بك.

Golang مثال رائع. لإنشاء تطبيق Golang ، تحتاج إلى برنامج التحويل البرمجي Go. يقوم المحول البرمجي بإنشاء ملف قابل للتنفيذ يتم تشغيله على أي نظام تشغيل ، بدون تبعيات ، بما في ذلك الصور النظيفة.

هذا سبب وجيه يجعل Docker لديه القدرة على البناء على مراحل. تتيح لك هذه الوظيفة استخدام عدة صور مؤقتة أثناء عملية التجميع ، مع حفظ الصورة الأخيرة فقط مع المعلومات التي نسختها إليها. إذن لديك صورتان:

  • الصورة الأولى هي حجم كبير جدًا ، إلى جانب العديد من التبعيات التي يتم استخدامها لإنشاء التطبيق وتشغيل الاختبارات.
  • الصورة الثانية خفيفة للغاية من حيث حجم وعدد المكتبات ، التي تحتوي فقط على نسخ من القطع الأثرية اللازمة لتشغيل التطبيق في الإنتاج.

10. استخدام linter


استخدم linter لتجنب الأخطاء الشائعة وإنشاء أفضل الممارسات التي يمكن للمهندسين اتباعها تلقائيًا.

واحد من هذه اللنتوليت هو hadolint . يحلل Dockerfile ويصدر تحذيرًا بشأن أي أخطاء لا تمتثل لتوصياته.



يصبح Hadolint أكثر قوة عند استخدامه في بيئة تطوير متكاملة (IDE). على سبيل المثال ، عند استخدام hadolint كملحق VSCode ، تظهر أخطاء الوبر أثناء الإدخال. هذا يساعد في كتابة أفضل dockerfiles بشكل أسرع.

تعرف على المزيد حول حماية صور Docker الخاصة بك.

Source: https://habr.com/ru/post/ar482044/


All Articles