إدارة شهادة SSL: من الفوضى على مئات الخوادم إلى حل مركزي

ما الذي يمكن أن يكون وراء كلمات "أكبر مدرسة على الإنترنت في أوروبا"؟ من ناحية ، هذا هو ألف درس في الساعة ، 10 آلاف معلم ، 100 ألف طالب. بالنسبة لي ، مهندس بنية تحتية ، يتضمن هذا أيضًا أكثر من 200 خادم ، ومئات من الخدمات (الصغيرة وغير الدقيقة) ، وأسماء النطاقات من المستوى الثاني إلى المستوى السادس. في كل مكان تحتاج إلى SSL ، وبالتالي شهادة لها.



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

من شهادة واحدة على خادم واحد إلى المئات في العديد من مراكز البيانات


ذات مرة كان هناك خادم واحد فقط. وعاش عليه سيرتبوت ، الذي عمل من تحت التاج. ثم توقف خادم واحد عن التعامل مع الحمل ، لذلك ظهر خادم آخر. ثم أكثر وأكثر. كل منهم لديه شهاداته الخاصة مع مجموعة فريدة من الأسماء الخاصة به ، وفي كل مكان كان من الضروري تكوين التحديث الخاص بهم. في مكان ما أثناء التمديد ، قاموا بنسخ الشهادات الموجودة ، لكنهم نسوا التحديث.

من أجل الحصول على شهادة Let's Encrypt ، يجب عليك تأكيد ملكية اسم المجال المحدد في الشهادة. يتم ذلك عادةً بطلب HTTP عكسي.


فيما يلي بعض الصعوبات القياسية التي واجهناها أثناء نمونا:

  • : . .
  • HTTP. , . . - LDAP. - . .

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



تكمن المشكلة في أنه في BrowserStack ، الذي يستخدمه المختبرون ، من المستحيل إضافة شهادة إلى القائمة الموثوقة لأجهزة iPad أو Mac أو iPhone على الأقل. لذلك كان على المختبرين تحمل تحذيرات منبثقة باستمرار حول المواقع الخطرة.

ابحث عن حل


بالطبع ، أولاً وقبل كل شيء ، تحتاج إلى إجراء مراقبة من أجل معرفة الشهادات التي لا تنتهي عندما تنتهي بالفعل ، ولكن قبل ذلك بقليل. اوه حسنا. المراقبة ، نعلم الآن أن الشهادات ستنتهي قريبًا هنا وهناك. والآن ماذا يمكنني أن أفعل؟


Big Ear هو روبوت قديم لن يفسد شهادة.

ودعنا نستخدم شهادات البدل؟ دعونا! دعونا تشفير يصدر بالفعل لهم. صحيح ، سيتعين عليك تكوين تأكيد ملكية المجال من خلال DNS. ويعيش DNS الخاص بنا في AWS Route53. وعليك تحليل تفاصيل الوصول في AWS عبر جميع الخوادم. ومع ظهور خوادم جديدة ، انسخ كل هذا الاقتصاد أيضًا.

حسنًا ، يتم تغطية أسماء المستوى الثالث بواسطة حرف البدل. وماذا تفعل بأسماء المستوى الرابع فما فوق؟ لدينا العديد من الفرق التي تعمل في تطوير الخدمات المختلفة. من المعتاد الآن تقسيم الواجهة الأمامية والخلفية. وإذا حصلت الواجهة الأمامية على اسم من المستوى الثالث مثل service.skyeng.ru ، فستحاول الواجهة الخلفية إعطاء اسم api.service.skyeng.ru . ربما يمنعونهم من الاستمرار في فعل ذلك؟ فكرة عظيمة! وماذا تفعل مع العشرات منها؟ يمكن أن يكون بيد حديد لدفعهم جميعا في اسم مجال واحد؟ استبدل جميع هذه الأسماء من مستويات مختلفة بعناوين URL مثل skyeng.ru/service. من الناحية الفنية ، هذا خيار ، ولكن كم من الوقت يستغرق؟ وكيف يمكن للأعمال أن تبرر الحاجة لمثل هذه الأعمال؟ لدينا أكثر من 30 فريق تطوير ، نقنع الجميع - سيستغرق الأمر ستة أشهر على الأقل. ونحن نخلق نقطة واحدة من الفشل. سواء أعجبك ذلك أم لا ، فهذا قرار مثير للجدل.

ما هي الأفكار الأخرى الموجودة؟ .. ربما يمكن إجراء شهادة واحدة حيث ندرج كل شيء الكل؟ وسنقوم بتثبيته على جميع الخوادم. قد يكون هذا هو الحل لمشاكلنا ، لكن Let's Encrypt يسمح لك بالحصول على 100 اسم فقط في الشهادة ، ولدينا بالفعل أكثر من خدمة واحدة.

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

كتابان للعب ومصدر واحد للحقيقة


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

تفاصيل الوصول AWS موجودة أيضا في مكان واحد فقط. وفقًا لذلك ، تختفي الأسئلة ، مثل إعداد AWS CLI على خادم جديد لديه حق الوصول إلى Route53 وما شابه.

يتم وصف جميع الشهادات المطلوبة في ملف واحد بتنسيق Ansible بتنسيق YAML:

    certificates:
      - common_name: skyeng.ru
        alt_names:
          - *.skyeng.ru
      - common_name: olympiad.skyeng.ru
        alt_names:
          - *.olympiad.skyeng.ru
          - api.content.olympiad.skyeng.ru
          - games.skyeng.ru
      - common_name: skyeng.tech
        alt_names:
          - *.skyeng.tech

      .  .  .

يتم إطلاق كتاب تشغيل واحد بشكل دوري ، والذي يمر عبر هذه القائمة ويقوم بعمله الشاق - بشكل أساسي نفس الشيء الذي يقوم به سيرتبوت:

  • ينشئ حسابًا مع Let's Encrypt Certificate Authority
  • يولد مفتاح خاص
  • ينشئ شهادة (لم يتم التوقيع عليها بعد) - ما يسمى طلب توقيع الشهادة
  • يرسل طلب توقيع
  • يتلقى تحدي DNS
  • يضع السجلات المستلمة في DNS
  • يرسل طلب توقيع مرة أخرى
  • وبعد استلام الشهادة الموقعة أخيرًا ، يتم وضعها في المتجر.

يتم تنفيذ كتيب التشغيل مرة واحدة في اليوم. إذا لم يتمكن من تجديد أي شهادات لأي سبب - سواء كانت مشاكل في الشبكة أو بعض الأخطاء على جانب Let's Encrypt - فهذه ليست مشكلة. سيتم تحديثه في المرة القادمة.

الآن ، عند الحاجة إلى SSL على بعض مضيف الخدمة ، يمكنك الانتقال إلى هذا المستودع والحصول على بعض الملفات من هناك - أبسط عملية يقوم بها دليل التشغيل الثاني ... ما هي الشهادات المطلوبة على هذا المضيف موصوفة في معلمات هذا المضيف ، في قوائم الجرد / host_vars / server .yml :

    certificates:
      - common_name: skyeng.ru
        handler: reload nginx
      - common_name: crm.skyeng.ru

      .  .  .

إذا تغيرت الملفات ، فإن Ansible يقوم بسحب خطاف - من الطبيعي إعادة تشغيل Nginx (في حالتنا ، هذا هو الإجراء الافتراضي). وبنفس الطريقة ، يمكنك الحصول على شهادات من المراجع المصدقة الأخرى التي تستخدم بروتوكول ACME.

مجموع


  • كان لدينا العديد من التكوينات المختلفة. شيء ما انكسر باستمرار. في كثير من الأحيان كان علي أن أتسلق الخوادم وأكتشف ما حدث مرة أخرى.
  • لدينا الآن كتابين للعب ويتم تسجيل كل شيء في مكان واحد. كل شيء يعمل مثل الساعة. أصبحت الحياة أكثر مملة.

اختبارات


نعم ، ماذا عن المختبرين في اختباراتهم؟ يتم منح كل مطور أو مختبر خادم اختبار شخصي - اختبار. يوجد حاليًا حوالي 200 منهم ، ولديهم أسماء النموذج test-y123.skyeng.link ، حيث 123 هو رقم الاختبار. إنشاء وإزالة الاختبار مؤتمت. أحد مكونات الإجراء هو تثبيت شهادة SSL عليه. يتم إنشاء شهادة SSL مقدمًا ، مع أسماء حسب القالب:

    ssl_cert_pattern:
      - *
      - *.auth
      - *.bill

      .  .  .

فقط حوالي 30 اسما. لذلك تأتي الشهادة مع الأسماء

    test-y123.skyeng.link
    *.test-y123.skyeng.link
    *.auth.test-y123.skyeng.link
    *.bill.test-y123.skyeng.link

إلخ

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

ملاحظة


مستودع برمز .

قد يكون من المثير للاهتمام أيضًا أن تقرأ في هذا الموضوع كيف تحول Stack Overflow إلى HTTPS :

  • مئات المجالات من مستويات مختلفة
  • Websockets
  • الكثير من واجهات برمجة تطبيقات HTTP (مشكلات الخادم الوكيل)
  • افعل كل شيء ولا تسقط الأداء

إذا كان لديك أي أسئلة ، اكتب في التعليقات ، يسعدني الإجابة.

All Articles