Lua-resty-auto-ssl: تجاهل عناوين IP عند إصدار الشهادات

تم إنشاؤها على ٢٧ سبتمبر ٢٠١٦  ·  8تعليقات  ·  مصدر: auto-ssl/lua-resty-auto-ssl

بالنظر إلى أن LetsEncrypt لا تصدر شهادات على عناوين IP ، سيكون من الرائع اكتشاف عناوين IP وتجاهلها قبل إرسال طلب إلى LetsEncrypt ، بدلاً من الاضطرار إلى إضافة هذا المنطق في تكوين / وظيفة allow_domain.

enhancement

التعليق الأكثر فائدة

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

يتخطى الشيك أيضًا عناوين IPv6 ، وهو في الواقع مبالغة في الهندسة:

if string.match(domain, "(%d+).(%d+).(%d+).(%d+)") or string.find(domain, ":", 1, true) then
    return false
end

ال 8 كومينتر

لقد كتبت للتو شيكًا لذلك ، فقط لأجد أنه فشل بالفعل في وقت مبكر ، في:

ssl_certificate (): auto-ssl: تعذر تحديد المجال للطلب (SNI غير مدعوم؟) - استخدام احتياطي -

عندما يطلب المستعرض عنوان IP ، فإنه لا يرسل رأس SNI ، لذلك لن يتم تعيين "المجال".

لست متأكدًا من سبب إرسال طلبي للسماح بالتشفير الذي كان يرسل في ذلك الوقت خطأً حول تسجيل شهادة SSL مع IP: S

discobean : هل لديك رسالة الخطأ المحددة التي تحدث عندما رأيت هذا؟

GUI أحيانًا أحصل على نفس الخطأ. أعتقد أن هذا يرجع إلى أن العملاء (الذين من المحتمل أن يكونوا روبوتات الماسح الضوئي) يرسلون رأس مضيف يساوي عنوان IP المستهدف ، على سبيل المثال:

2018/02/20 02:10:44 [warn] 490#490: *2723 [lua] init_by_lua:11: allow_domain(): auto-ssl: debug allow_domain domain XXX.XXX.XX.XX, context: ssl_certificate_by_lua*, client: 107.170.236.113, server: 0.0.0.0:8443
2018/02/20 02:10:49 [error] 490#490: *2723 [lua] lets_encrypt.lua:41: issue_cert(): auto-ssl: dehydrated failed: env HOOK_SECRET=XXXXX HOOK_SERVER_PORT=8999 /usr/local/bin/resty-auto-ssl/dehydrated --cron --accept-terms --no-lock --domain XXX.XXX.XX.XX --challenge http-01 --config /etc/resty-auto-ssl/letsencrypt/config --hook /usr/local/bin/resty-auto-ssl/letsencrypt_hooks status: 256 out: # INFO: Using main config file /etc/resty-auto-ssl/letsencrypt/config
Processing XXX.XXX.XX.XX
 + Signing domains...
 + Creating new directory /etc/resty-auto-ssl/letsencrypt/certs/XXX.XXX.XX.XX ...
 + Generating private key...
 + Generating signing request...
 + Requesting authorization for XXX.XXX.XX.XX...
 err:   + ERROR: An error occurred while sending post-request to https://acme-v01.api.letsencrypt.org/acme/new-authz (Status 400)

Details:
{
  "type": "urn:acme:error:malformed",
  "detail": "Error creating new authz :: Issuance for IP addresses not supported",
  "status": 400
}

, context: ssl_certificate_by_lua*, client: 107.170.236.113, server: 0.0.0.0:8443
2018/02/20 02:10:49 [error] 490#490: *2723 [lua] ssl_certificate.lua:97: issue_cert(): auto-ssl: issuing new certificate failed: dehydrated failure, context: ssl_certificate_by_lua*, client: 107.170.236.113, server: 0.0.0.0:8443
2018/02/20 02:10:49 [error] 490#490: *2723 [lua] ssl_certificate.lua:286: auto-ssl: could not get certificate for XXX.XXX.XX.XX - using fallback - failed to get or issue certificate, context: ssl_certificate_by_lua*, client: 107.170.236.113, server: 0.0.0.0:8443

حيث XXX.XXX.XX.XX هو عنوان IP الفعلي لخادمنا

أنا أقوم بحظر هذا في الكود ، لكن ، eh: يجب أن تسمح () allow_domain () فقط_ لـ FQDN بأنك سترغب في إنشاء شهادة لـ (نهج القائمة البيضاء) بدلاً من "ليس من أجل هؤلاء" (نهج القائمة السوداء).

لا يجب عليك ببساطة "إرجاع صحيح" في allow_domain (). إنه يضع ضغطًا على نظامك ويؤدي إلى تراكم الإخفاقات تجاه LE.

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

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

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

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

أنا لا أقول أنه يجب حظر هذا في lua-resty-auto-ssl ، فقط مشاركة ما اكتشفته أثناء الاختبار إذا تعثر أي شخص آخر في هذه المشكلة.

اختراق سريع في allow_domain :

          local ip_chunks = {domain:match("(%d+)%.(%d+)%.(%d+)%.(%d+)")}
          if (#ip_chunks == 4) then
            return false
          end

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

يتخطى الشيك أيضًا عناوين IPv6 ، وهو في الواقع مبالغة في الهندسة:

if string.match(domain, "(%d+).(%d+).(%d+).(%d+)") or string.find(domain, ":", 1, true) then
    return false
end

أنت لا تعرف وضعنا ، لكنك تسرع في الحكم. أخذت النقطة.

ربما يمكنك إنشاء PR وتغيير allow_domain في README.md إلى شيء أكثر منطقية من إرجاع true لجعل الجميع أكثر أمانًا

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

jasonbouffard picture jasonbouffard  ·  6تعليقات

kshnurov picture kshnurov  ·  3تعليقات

brendon picture brendon  ·  9تعليقات

stackrainbow picture stackrainbow  ·  20تعليقات

byrnedo picture byrnedo  ·  16تعليقات