أسرار بناء وإعادة توجيه SSH إلى Docker 09/18

الصورة

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


يتضمن فريق بناء Docker 18 سبتمبر العديد من التحديثات. الميزة الرئيسية هي ظهور نسخة جديدة تمامًا من تطبيق جانب الخادم ، ويتم تقديمها كجزء من مشروع Moby BuildKit. اكتسب تطبيق خادم BuildKit ميزات جديدة ، بما في ذلك دعم أسرار بناء Dockerfile.


باستخدام الأسرار


بادئ ذي بدء ، تحتاج إلى تمكين جانب الخادم BuildKit. BuildKit في الإصدار 18.09 هي وظيفة التحديد التي يمكن تمكينها باستخدام DOCKER_BUILDKIT=1 متغير البيئة DOCKER_BUILDKIT=1 قبل بدء docker build . في الإصدار التالي ، تم التخطيط لجعل BuildKit جزء الخادم بشكل افتراضي.


 export DOCKER_BUILDKIT=1 

يعتمد تطبيق أسرار الإنشاء على اثنين من ميزات BuildKit الجديدة. واحد منهم هو القدرة على استخدام واجهة المستخدم المحملة من الصور في التسجيل ؛ والثاني هو القدرة على استخدام نقاط التركيب في أوامر RUN لـ Dockerfile. لاستخدام وظيفة التنفيذ مع دعم الأسرار (بدلاً من المعيار) ، حدد صورة رابط باستخدام توجيه بناء الجملة في السطر الأول من Dockerfile - للإشارة إلى صورة الحاوية التي تريد استخدامها. حتى الآن ، لا تتوفر الأسرار في القناة المستقرة ل Dockerfiles الخارجية: ستحتاج إلى أحد الإصدارات في القناة التجريبية ، على سبيل المثال ، docker/dockerfile:experimental أو docker/dockerfile/1.0.0-experimental .


 # syntax=docker/dockerfile:1.0.0-experimental 

إذا علمت ، بصفتك مؤلف Dockerfile ، أن الأمر RUN المثبت في Dockerfile يتطلب قيمة سرية ، --mount التسمية - --mount لذلك ، موضحةً ما هو الأمر الذي يحتاجه الأمر ومكان تركيبه. تقبل التسمية - --mount بنية مفصولة بفواصل كما هو الحال في --mount docker run .


 # syntax=docker/dockerfile:1.0.0-experimental FROM alpine RUN --mount=type=secret,id=mysite.key command-to-run 

تشير هذه التسمية إلى أن الأمر أثناء العملية لديه حق الوصول إلى الملف السري على طول المسار / /run/secrets/mysite.key . السر متاح فقط للفريق مع ملصق التثبيت ، وليس للأجزاء الأخرى من التجميع. يتم تنزيل البيانات الموجودة في هذا الملف من المتجر السري استنادًا إلى المعرف المحدد "mysite.key". تدعم واجهة سطر الأوامر Docker حاليًا الكشف عن الأسرار من ملفات العميل المحلية باستخدام العلامة --secret .


 docker build --secret id=mysite.key,src=path/to/mysite.key . 

كما هو موضح أعلاه ، يتم تعيين الأسرار بشكل افتراضي في /run/secrets ، ومع ذلك ، يمكنك تحديد أي مسار باستخدام مفتاح "الهدف". إذا تم تحديد "الهدف" ، ولكن لم يتم تحديد "id" ، يصبح "id" افتراضيًا هو الاسم الأساسي لمسار الوجهة.


ليس من الضروري أن تقتصر على سر واحد. يمكنك استخدام أي عدد منها ، مع الإشارة إلى معرفات مختلفة.


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


 # syntax=docker/dockerfile:1.0.0-experimental FROM alpine RUN --mount=type=secret,id=mysite.key,required <command-to-run> 

التنفيذ


يتم تثبيت الملف السري تلقائيًا فقط في نظام ملفات tmpfs منفصل لمنع حدوث تسرب في الصورة النهائية أو الأمر التالي ، بحيث لا يتم تخزينه في ذاكرة التخزين المؤقت للبناء المحلي.


يتم استبعاد القيم السرية أيضًا من حسابات بناء ذاكرة التخزين المؤقت بحيث لا يمكن استخدام ذاكرة التخزين المؤقتة للبيانات التعريفية.


سه


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


أضفنا ميزة مماثلة في docker build ، حيث يمكنك استخدام - علامة --ssh لتوجيه اتصال وكيل SSH الحالي أو مفتاح رابط. بدلاً من إرسال المعلومات الأساسية ، يخبر Docker الرابط بأنه متوفر. إذا احتاج الموصل إلى الوصول إلى الخادم البعيد عبر SSH ، فسيتصل بالعميل ويطلب تأكيد الطلب المحدد المطلوب للاتصال. المفتاح نفسه لا يترك برنامج العميل ، وبعد الانتهاء من البرنامج الذي يتطلب الوصول ، لا توجد بيانات من رابط لإعادة الاتصال الاتصال عن بعد.


يتم منح الوصول إلى نقل الملفات عبر بروتوكول SSH فقط للأوامر الموجودة في Dockerfile التي طلبت الوصول مباشرة إلى SSH عن طريق تحديد type=ssh block. لا تملك الأوامر الأخرى بيانات عن وكيل SSH المتاح.


تجدر الإشارة أيضًا إلى جانب آخر من جوانب SSH - استخدام نموذج أمان TOFU. عند الاتصال بخادم SSH لأول مرة ، سيطلب معلومات حول المضيف غير المعروف ، لأنه لا يحتوي على مفتاح عمومي متاح محليًا لهذا الخادم ، وبالتالي ، لا يمكن التحقق مما إذا كان المفتاح العمومي المقدم من الطرف البعيد صالحًا لهذا العنوان.


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


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


 # syntax=docker/dockerfile:experimental FROM alpine # install ssh client and git RUN apk add --no-cache openssh-client git # download public key for github.com RUN mkdir -p -m 0600 ~/.ssh && ssh-keyscan github.com >> ~/.ssh/known_hosts # clone our private repository RUN --mount=type=ssh git clone git@github.com:myorg/myproject.git myproject 

على جانب عميل Docker ، استخدم الملصق - ssh للإشارة إلى أن إعادة توجيه SSH مسموح بها لهذا التجميع.


 docker build --ssh default . 

تقبل التسمية زوجًا من قيم المفاتيح التي تحدد موقع مأخذ التوصيل لعامل SSH المحلي أو المفاتيح الخاصة. إذا كنت تريد استخدام القيمة default=$SSH_AUTH_SOCK ، يمكنك ترك مسار المقبس فارغًا.


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


 … RUN --mount=type=ssh,id=projecta git clone projecta … RUN --mount=type=ssh,id=projectb git clone projectb … 

وتوسيع بيانات العميل مع بناء عامل ميناء --ssh projecta=./projecta.pem --ssh projectb=./projectb.pem . لاحظ أنه حتى إذا قمت بتحديد المفاتيح الفعلية ، يتم إرسال اتصال الوكيل فقط إلى الرابط ، وليس المحتويات الفعلية لهذه المفاتيح الخاصة.


بهذا ، تم الانتهاء من مراجعة الميزات الجديدة لأسرار البناء في Docker 18.09. آمل أن تساعد الميزات الجديدة في زيادة الاستفادة من قدرات Dockerfile في المشاريع وتوفير مستوى أعلى من الأمان لخط التجميع.

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


All Articles