‫التالي حتى.
‫هذا هو واحد كبير.
‫لا تقم بتشغيل تطبيقاتك كجذر في الحاوية إذا كان بإمكانك
‫تجنبها.
‫إذا فعلت هذا بسرعة حقيقية ، في عرض توضيحي
‫صغير هنا.
‫حسنا. لقد قمت بتشغيل Docker ، على
‫الأقل يجب علي. حسنا.
‫وإذا ركضت للتو ...
‫إذا قمت بتشغيل Nginx ، صحيح ، وقمت
‫بعمل عامل إرساء أعلى على تلك الحاوية.
‫ما الذي نراه هنا؟
‫داخل الحاوية ، بدأ Nginx عملية عند
‫الجذر ، ثم أنشأ عملية جديدة كمستخدم
‫غير جذر.
‫انظر كيف يبلغ هذا المستخدم 101.
‫هذا شائع في الكثير من البرامج القائمة على البرنامج الخفي
‫مثل MySQL و Postgres و Nginx.
‫الكثير منهم من غير لغات البرمجة سيفعلون
‫ذلك تلقائيًا. لذا ، هذا آمن.
‫ما يفعله هذا هو السماح لـ Nginx بإنتاج
‫العمليات العاملة التي لا تعمل كجذر
‫للقيام بمعظم العمل.
‫لذلك ، لديهم عملية رئيسية واحدة تعمل كجذر ، ولكن
‫هذا ليس ما يقبل الاتصالات ويقوم بمعظم
‫العمل. معظم هذا في عمليات
‫العاملين هذه. يتم تشغيلها كمستخدم عادي ،
‫مما يعني أنه إذا كانت هناك ثغرة أمنية في Nginx ،
‫فإن الاحتمالات تكون عندما تأتي
‫الاتصالات الواردة ويحاول شخص ما استغلال بروتوكول
‫Nginx HTTP ، فسيتم قفله أو سجنه في هذا المستخدم في ..
‫. في معظم الأوقات ما لم
‫تكن هناك ثغرة خطيرة هنا.
‫في الأسفل هنا ، ثم يقتصر الأمر على ما يمكنهم
‫فعله ، صحيح. حتى لو تولوا هذه العملية
‫بطريقة ما ، فهم لا يزالون مقيدون كمستخدم.
‫لذا ، هذا جيد.
‫هذا لا يزال لا يعمل كجذر حقيقي
‫داخل الحاوية. ما أتحدث عنه حقًا هو إذا كنت
‫تريد تشغيل تطبيق Python
‫، أو تطبيق Node ، أو شيء من هذا القبيل
‫حيث تكون لغة برمجة ، فسيكون هذا شيئًا يتم تعيينه افتراضيًا
‫إلى الجذر لأن لغة البرمجة في الحاوية لا
‫تفعل ذلك. لا أعرف كيف يعمل برنامجك.
‫إنه لا يعرف ما تريده أن يفعله.
‫لذلك ، ستقوم بعمل الجذر افتراضيًا ، وهذا
‫يتعلق أكثر بتوافق التطبيقات.
‫قد نقول إننا نريد أن يكون هذا آمنًا بشكل افتراضي
‫، لكن Docker اختار أن تعمل جميع هذه الحاويات الرسمية بالفعل
‫كجذر للغات البرمجة.
‫دعنا نذهب للتحقق من ذلك.
‫أُووبس. ليس هذا.
‫ثعلب النار.
‫لذا إذا انتقلنا ، دعنا نقول ، إلى Hub.
‫لنقم فقط بالعقدة.
‫هذا شائع في معظم اللغات.
‫سأختار Node كمثال.
‫داخل Node ، إذا
‫ذهبت إلى أحد Dockerfiles هنا.
‫ثم أبحث عن المستخدم.
‫ستلاحظ أنني لا أجد شيئًا في الواقع.
‫إنه فقط هذا المستخدم الذي يضيفه هنا.
‫ستلاحظ أنه يفعل هذا ، صحيح.
‫إنه يضيف تقنيًا مجموعة تسمى Node وتضيف
‫مستخدمًا يسمى Node.
‫إذا بحثت في بقية هذا الملف ، فستدرك أنه لا يتغير
‫أبدًا لهذا المستخدم باستخدام مقطع
‫U S E R ، صحيح.
‫يجب أن ترى عقدة المستخدم هناك في مكان ما كخط.
‫لا يفعلون ذلك لأن هذه هي وظيفتك.
‫لذا ، ما يجب عليك فعله في ملف Dockerfile
‫ذي المستوى الأدنى. لذلك ، أي Dockerfile تقوم
‫بإنشائه من هذه الصور الرسمية للغات
‫البرمجة ، يجب أن تستفيد من المستخدمين الذين يقومون
‫بإنشائهم من أجلك. إذا لم يتم إنشاء هؤلاء المستخدمين ، فيمكنك إنشاء
‫واحد بنفسك بنفس الطريقة. يمكنك فقط سرقة هذا
‫الشيء الصغير المكون من سطرين والتغيير إلى
‫أي مستخدم تريده. إذا كانت لغة Python ، فيمكنك
‫تسميتها مستخدم Python ، أيا كان.
‫إذا كنت تفعل ذلك ، فلن تعمل التطبيقات التي
‫تقوم بتشغيلها كجذر في الحاوية.
‫بشكل
‫افتراضي ، إذا قمت بتشغيل أي تطبيق Node قياسي ، فسيستخدم المستخدم
‫الجذر في الحاوية.
‫لماذا هذا بغاية الأهمية؟
‫حسنًا ، شيئين.
‫أولاً ، إذا كان شخص ما قادرًا على اختراق
‫تطبيقك واختراق تطبيقك والوصول إلى نظام
‫الملفات ، إذا ... إذا كان هذا التطبيق هو الجذر
‫، فعندئذٍ في الحاوية ، يمكنهم فعل ما يريدون في
‫الحاوية ، صحيح. يمكنهم كتابة الملفات
‫إلى نظام الملفات. يمكنهم تثبيت المزيد من البرامج في تلك الحاوية
‫التي يمكن تشغيلها وقتما يريدون في تلك الحاوية.
‫لذلك ، نحن لا نريدهم فعل ذلك حقًا.
‫نفضل أن تكون محدودة للغاية.
‫لذا ، إذا كانت تطبيقاتك تدعمها
‫، كما تعلم ، فافعل ذلك. أنت تتأكد بشكل أساسي من توفر
‫المستخدم لديك.
‫ثم لدي مثال من DockerCon هنا.
‫في DockerCon ، كان لدي حديث كامل على Node. js ، وكان أحد الموضوعات
‫يتعلق بالمستخدم.
‫اسمحوا لي أن أرى ما إذا كان بإمكاني العثور على ذلك.
‫انظر ماذا فعلت هنا؟ إنه ملف بسيط جدًا.
‫سأقوم بربط هذا ووضعه فيه.
‫في ملف Dockerfile هذا.
‫لذا ، في ملف Dockerfile هذا لدي ...
‫لم أنشئ مستخدمًا لأن صورة العقدة
‫أنشأتها لي بالفعل. أنا فقط أتغير إلى عقدة المستخدم.
‫ثم أقوم بتثبيت الحزم الخاصة بي بهذين السطرين ، وبعد ذلك سأقوم
‫بتشغيلها لاحقًا.
‫ستلاحظ أنه لا بد لي من البدء في استخدام
‫خيار chown في أوامر النسخ الخاصة بي للتأكد من أن ملفاتي
‫هي الآن نفس المستخدم مثل المستخدم الذي سيعمل برنامجي
‫به. خلاف ذلك ، يمكن أن تكون هناك مشاكل
‫، أليس كذلك. من المحتمل أن يكون طلبي ... إذا لم يتمكن
‫من قراءة الملفات ، فلن يتمكن من تشغيله ، صحيح.
‫لذا ، أحتاج إلى تغييرات تلك الأذونات.
‫يمكنني القيام بذلك باستخدام بطانة واحدة على أمر نسخ.
‫سترى هنا أيضًا أنني أقوم بإنشاء الدليل وأقوم بتعديله
‫أيضًا بحيث أنه كلما تم نسخ التطبيق ، أريد فقط التأكد
‫، متأكدًا جدًا ، من أن الأذونات موجودة حتى
‫يتمكن من الكتابة.
‫نظرًا لأنه في اللحظة التي أغير فيها هذا المستخدم
‫، فسيتم تشغيل أمر النسخ هذا ، أو أمر التشغيل هذا على وجه التحديد ،
‫مثل هذا المستخدم. إذا لم يكن لديه أذونات
‫للكتابة إلى الدلائل ، فسوف يفشل أيضًا.
‫لذا ، فإن السبب وراء عدم قيام Docker بذلك نيابة عنك هو أنهم يعرفون
‫أن الأشياء الخاصة بك على الأرجح ستنكسر.
‫لذلك ، عليك اتخاذ هذه الخطوات الإضافية.
‫لكن الأمر ليس بهذه الصعوبة. إنه ليس كذلك حقًا.
‫ربما يمكنك إجراء كل هذا الاختبار في يوم واحد ، وبعد
‫ذلك سترغب في تشغيل أنظمتك من خلال CI الكامل والاختبار
‫الكامل على الخوادم الخاصة بك لأنه في بعض الأحيان ، و PHP هي
‫واحدة من تلك السيئة في هذا.
‫يحب PHP تشغيل مجموعة من ملفات السجل والقيام بمجموعة
‫من الكتابة على القرص.
‫حقًا ، أي شيء يسمح بتحميل المستخدم سيكتب
‫على القرص. لذلك ، يجب عليك التأكد من صحة
‫هذه الأذونات بحيث عندما يقوم الأشخاص بكتابة الملفات ، دعنا نقول أنهم
‫يديرون مدونة WordPress.
‫ستكتب مدونة WordPress هذه على القرص عندما يقوم المستخدمون
‫بتحميل الصور في مدونتهم.
‫تريد التأكد من أن هذه الأذونات ستعمل.
‫لذا ، سيتعين عليك إجراء بعض الاختبارات بالتأكيد.
‫بمجرد القيام بذلك ، لن يعمل التطبيق
‫الآن كجذر. لذلك ، لا يمكن أن يكون لها سيطرة
‫كاملة في الحاوية. السبب الآخر الذي يجعلك
‫ترغب في القيام بذلك هو إذا كانت هناك ثغرة أمنية
‫في Linux ، وهو أمر نادر ، أو Docker ، وهو نادر جدًا
‫أيضًا ، فمن ثم تقل احتمالية خروجهم من هذه
‫الحاوية. لقد حدث هذا فقط ، حسنًا ، مرة
‫واحدة أدركت ذلك تمامًا ، وقمت بالفعل بتوثيق القليل
‫منه هنا.
‫بقرة قذرة. كانت Dirty COW
‫ثغرة أمنية في Linux سمحت لك بالخروج
‫من الحاوية
‫، صحيح. لن يؤدي تغيير المستخدم هنا
‫بالضرورة إلى حل
‫المشكلة بأكملها ، لكنه بالتأكيد
‫لم يؤذي هذه المشكلة.
‫نقاط الضعف الأخرى ، فمن المحتمل أن تحمي منها.
‫لكن هذه أفضل ممارسة.
‫أعتقد أنه إذا كان لديك فريق أمني ، فسيصرون
‫نوعًا ما على عدم تشغيل الأشياء كجذر.
‫لذا ، ستفعل
‫ذلك.