تحميلات آمنة

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

هل يستحق الأمر تقديم مشكلة تطلب ذلك لمعرفة نوع الدعم الذي سيحظى به؟ هل توجد مشكلة مماثلة بالفعل؟ تشكل هذه المشكلة حاليًا عائقًا أمام مجموعتنا الصغيرة المحدودة الموارد التي تحاول تشغيل Discourse في بيئة نمتلك فيها بالفعل أجهزة الاستضافة ولا نرغب في الدفع مقابل تخزين سحابي (خاصة بأسعار AWS S3) فقط لضمان عدم إمكانية مشاهدة وسائطنا بشكل مجهول.

أيضًا، سامحني على سذاجة هذا السؤال المحتمل. لكن هل يوجد بالفعل دعم لـ “buckets” منفصلة للuploads والنسخ الاحتياطية، أليس كذلك؟ هل سيكون من الصعب دعم bucket ثالث للuploads الآمنة؟ تذهب الuploads العامة إلى bucket العامة، وتذهب الuploads الآمنة إلى bucket الآمنة، ولا تكون هناك حاجة إلى قوائم تحكم بالوصول (ACLs) لكل كائن على حدة. وإذا تغيرت حالة الأمان لكائن ما، فيمكن ببساطة نقله بين الـ buckets؟

5 إعجابات

أعتقد أن الأمر يتطلب جهدًا كبيرًا. على الأقل يوم عمل، لكن ربما أسبوع؟

استضافة Cdck، التي تمول التطوير، تعمل مع التحميلات على S3، لذا فإن المواقع المستضافة ذاتيًا التي تتطلب تسجيل الدخول فقط والذين لا يملكون ميزانية لـ S3 هم المهتمون.

إذا رأى مستخدموك روابط مشاركة لمواردك، فيمكنهم ببساطة تنزيلها لمشاركتها. لا يبدو الأمر مشكلة كبيرة.

3 إعجابات

أنا لست مجنونًا لاعتقادي أن من الغريب أن يكون نص المنشور محميًا بينما المرفقات ليست كذلك، أليس كذلك؟

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

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

كما أن وجود خلل حالي أو مستقبلي في أحد تطبيقات S3 قد يسمح نظريًا بالعدّ المجهول للموارد في الدلو (bucket) أو بالقدرة على تخمين عناوين كائنات الوسائط وقصفها بالقوة الغاشمة. في عالم مثالي، أود أن يكون واجهتي S3 المحلية محمية بجدار ناري بعيدًا عن الإنترنت العام، بحيث لا يمكن الوصول إليها مباشرة إلا من قبل خادم Discourse.

4 إعجابات

لستَ مجنونًا، فتنفيذ تحميلات آمنة للإعدادات غير S3 ليس شيئًا أنا ضدّه بالتأكيد. الأمر فقط أننا لا نملك أيّ عجلة أو ضغط لبناء هذه الميزة، والتغيير ليس بسيطًا.

نحن نوظف أحيانًا متدربين وننفذ مشاريع تجريبية، وهذا بالتأكيد نوع من المشاريع يمكن أن يناسب إحدى هذه الفئات.

14 إعجابًا

أي آراء حول جدوى هذا كطريقة أسهل للمواد الآمنة في تخزين غير AWS S3؟

إعجاب واحد (1)

لدي حيلة سريعة أعتقد أنها ستوفر رفع ملفات آمن للمواقع التي تتطلب تسجيل الدخول.

بشكل أساسي، قم بإعداد Authentication Based on Subrequest Result | NGINX Documentation للرفع. المشكلة الوحيدة هي أنني لا أستطيع العثور على عنوان URL يُرجع خطأ 403/401 عند تفعيل خيار “يتطلب تسجيل الدخول”، لذا فإن محاولة الوصول إلى ملف مرفوع دون تسجيل الدخول تُنتج خطأ 500. هذا سيحدث فقط إذا كان لدى شخص ما عنوان URL للرفع وحاول الوصول إليه دون أن يكون مسجّل الدخول، لذا لا يبدو الأمر سيئًا جدًا.

الأمر يشبه هذا:

# JP
    location = /auth {
        internal;
        proxy_pass http://discourse/categories;
        proxy_pass_request_body off;
        proxy_set_header Content-Length "";
        proxy_set_header X-Original-URI $request_uri;
    } 
    # END JP
    location ~ ^/uploads/ {

      auth_request /auth; #$JP
      # ملاحظة: من المزعج حقًا أننا لا نستطيع ببساطة تعريف الرؤوس
      # على المستوى الأعلى ووراثة القيم.
      #
إعجابَين (2)

ليس لدينا خطط لإنشاء وظيفة دلو منفصلة للرفع الآمن، ولا نخطط لجعل الرفع الآمن يعمل مع الإعدادات غير S3 أو الإعدادات التي لا تحتوي على قوائم التحكم بالوصول (ACLs). قد ندرس القيام بذلك في المستقبل إذا كان هناك طلب كافٍ على هذا العمل لدرجة تجعل من المنطقي تخصيص الوقت والموارد لهذا الجهد.

5 إعجابات

لماذا تستخدم https://hashhackersforum.s3.us-east-2.amazonaws.com/optimized/2X/3/3204e85df407adfce19e105308248aee8b3b3f57_2_690x424.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAU5WBGG5Z7FNHQEIS%2F20210415%2Fus-east-2%2Fs3%2Faws4_request&X-Amz-Date=20210415T025617Z&X-Amz-Expires=300&X-Amz-SignedHeaders=host&X-Amz-Signature=15c9118929ccd9c24a9594ab02a47e900269b9d921d41679a317e29d6174c2bc بدلاً من https://forum.cdn.hashhackers.com/optimized/2X/3/3204e85df407adfce19e105308248aee8b3b3f57_2_690x424.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAU5WBGG5Z7FNHQEIS%2F20210415%2Fus-east-2%2Fs3%2Faws4_request&X-Amz-Date=20210415T025617Z&X-Amz-Expires=300&X-Amz-SignedHeaders=host&X-Amz-Signature=15c9118929ccd9c24a9594ab02a47e900269b9d921d41679a317e29d6174c2bc بينما أدخلت عنوان URL لشبكة CDN بشكل صحيح؟

لن يستخدم شبكة توصيل المحتوى (CDN) إذا قمت بتفعيل “تحميلات الوسائط الآمنة”.

5 إعجابات

لاحظت أمرًا واحدًا وهو أن قسم المسؤول يحذر من أن

الخادم مُعدّ لتحميل الملفات إلى S3، لكن لا توجد شبكة توصيل محتوى (CDN) لـ S3 مُهيّأة. قد يؤدي ذلك إلى تكاليف باهظة لـ S3 وأداء أبطأ للموقع. راجع “استخدام تخزين الكائنات للتحميلات” لمعرفة المزيد.

لا يزعجني تجاهل هذه الرسالة، لكننا فعّلنا الوسائط الآمنة، مما يعني أنه لا يمكن استخدام شبكة توصيل محتوى (CDN). ربما لا ينبغي عرض هذه الرسالة على المواقع التي تم تفعيل خيار secure_media فيها.

إعجاب واحد (1)

لا يزال بإمكانك استخدام شبكة توصيل المحتوى (CDN) لجميع ملفات جافا سكريبت، مما يجعل موقعك أسرع في العرض للمستخدمين حول العالم.

3 إعجابات

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

إعجابَين (2)

بعد ترقيةي إلى الإصدار 2.8.0.beta1، لم تعد شاراتي التي تستخدم عناوين S3 المصادق عليها تعمل. كانت تعمل بشكل صحيح قبل الترقية.

لقد تفحصت جدول uploads ووجدت أن قيمة العمود secure هي true.

حتى بعد رفع ملف باستخدام خيار New Badge، ظلت معاينة الصورة فارغة.

لا توجد مشاكل مع الملفات الأخرى التي تستخدم عناوين S3 حتى الآن.

هل يمكنكم المساعدة؟ شكرًا لكم! :wink:

إعجابَين (2)

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

أنا مندهش من أن هذا كان يعمل معك على الإطلاق، فلا شيء في الإصدار 2.8.0 كان يجب أن يؤثر على هذا.

5 إعجابات

مرحبًا @martin

شكرًا لك على ردك. هذه أول مرة أستخدم فيها لغة Ruby، وأنا معجب جدًا بوضوح هذه اللغة. بعد ساعات من تصحيح الأخطاء، أعتقد أنني وجدت المكان الذي يجب البحث فيه. أظن أنني فعلت العكس مما قلته :slight_smile: لقد أضفت بعض الأسطر في نموذج Badge، والآن يمكنه تحميل الصور. أرى أيضًا أن لدينا علمًا for_site_setting هناك. أعتقد أنه يعتمد على هذه المعلومات لتعديل قائمة التحكم في الوصول (ACL) للكائنات على S3، وتحديد false لتلك العمود.

app/models/badge.rb

  def image_url
    if image_upload_id.present?
      return upload_cdn_path(image_upload.url) if !image_upload.url.include?(SiteSetting.Upload.absolute_base_url)
      uri = URI.parse(image_upload.url)
      Rails.application.routes.url_for(
        controller: "uploads",
        action: "show_secure",
        path: uri.path[1..-1],
        only_path: true
      )
    end
  end

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

شكرًا لك!

آمل أن أتمكن من المساهمة أكثر في قاعدة الكود في المستقبل.

6 إعجابات

مرحبًا @danilogit،

التغيير الذي قمت به في نموذج الشارة سيعمل بالتأكيد، ومن الرائع أنك تمكنت من إتمام ذلك في أول مرة تستخدم فيها Ruby! ومع ذلك، سأقوم بإصلاح المشكلة الأساسية حيث لا ينبغي أن تُعلَّم الشارات بأنها آمنة.

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

سأخبرك عندما أكون قد أتممت إصلاح مشكلة اعتبار الشارات آمنة.

5 إعجابات

لقد أنهيت إصلاحًا لهذه المشكلة اليوم:

https://github.com/discourse/discourse/pull/13193

cc @danilogit

8 إعجابات

لقد نشرت هذا للتو:

…ولكنني أتساءل ما إذا كانت المشكلة مرتبطة بتعليقك هنا؟

هل يُسمح للمستخدمين برفع صور رمزية عند تفعيل ميزة رفع الوسائط الآمنة؟ في الوقت الحالي، أواجه خطأً، ولكنني أتساءل عما إذا كان ذلك بسبب أن الصور الرمزية تُرفع إلى نفس الدلو الذي لا يُسمح فيه بالوصول العام…

إعجاب واحد (1)

تم تقسيم 3 مشاركات إلى موضوع جديد: هل يمكنني استخدام الوسائط الآمنة ونشر الصفحات في نفس الوقت في Discourse؟

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

تم تحديث موضوع المنشور الأصلي هذا الآن ليعكس ذلك.

6 إعجابات