تحميلات آمنة

تمت إضافة ميزة التحميلات الآمنة في إصدار Discourse 2.4 الصادر في فبراير، وهي توفر درجة أعلى من الأمان لجميع الملفات المرفوعة (صور، فيديو، صوت، نصوص، ملفات PDF، ملفات مضغوطة، وغيرها) ضمن مثيل Discourse.

المتطلبات الأساسية

يجب أن يكون لديك تحميلات S3 مفعلة في موقعك، وهو ما يتطلب تعبئة الإعدادات التالية:

  • معرف مفتاح الوصول S3
  • المفتاح السري للوصول S3
  • منطقة S3
  • سلة رفع S3

كما يجب أن تستخدم سلة S3 لا تحتوي على سياسة سلة عامة، وتحتاج إلى التأكد من أن جميع الملفات المرفوعة مسبقًا تحتوي على قائمة تحكم في الوصول (ACL) عامة للقراءة (public-read) في S3. راجع قسم “تفعيل التحميلات الآمنة” أدناه.

بعد استيفاء هذه المتطلبات الأساسية، يمكنك تفعيل إعداد الموقع “التحميلات الآمنة”.

تفعيل التحميلات الآمنة

:dragon: :warning: هنا تنبثق التنانين :warning: :dragon:

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


لتفعيل التحميلات الآمنة، يجب عليك اتباع الخطوات التالية:

  1. تأكد من إعداد تحميلات S3.
  2. احفظ ما إذا كانت سلة S3 الخاصة بك تحتوي على سياسة سلة عامة. إذا كانت كذلك، فهناك خطوة إضافية مطلوبة (الخطوة 4).
  3. قم بتشغيل مهمة uploads:sync_s3_acls باستخدام Rake. سيضمن ذلك أن جميع ملفاتك المرفوعة تحتوي على قائمة تحكم في الوصول (ACL) الصحيحة في S3. هذا مهم؛ فإذا قمت بالخطوة 4 قبل هذه الخطوة، قد تصبح بعض الملفات غير قابلة للوصول في منتداك.
  4. احذف سياسة السلة العامة من سلتك إذا كانت موجودة في الخطوة 1.
  5. قم بتفعيل إعداد الموقع “التحميلات الآمنة”. يمكنك أيضًا تفعيل إعداد الموقع “منع المستخدمين المجهولين من تنزيل الملفات” لمنع المستخدمين المجهولين من تنزيل المرفقات من المنشورات العامة. قد يتم تصنيف أي ملفات مرفوعة من هذه اللحظة فصاعدًا على أنها آمنة اعتمادًا على الشروط أدناه.
  6. إذا كنت ترغب في تحليل جميع الملفات المرفوعة سابقًا وتصنيفها كآمنة محتملة، قم بتشغيل مهمة uploads:secure_upload_analyse_and_update باستخدام Rake.

:exclamation: ملاحظة حول سياسة سلة S3 :exclamation:

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

{
    "Version": "2012-10-17",
    "Id": "ComputedBucketPolicy",
    "Statement": [
        {
            "Sid": "AllowWorldRead",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::your-bucket-name/*"
        }
    ]
}

الجزء المهم هنا هو أننا نسمح لـ * (الجميع) بالحصول على الكائنات (GetObject)، مما يعني السماح لأي شخص بتنزيل أي شيء في السلة. ستظهر هذه التسمية أيضًا ما إذا كانت السياسة عامة:

لا يجب ألا يتم تعديل الإعدادات هنا. الصورة أدناه تمثل الحالة المثالية لعلامة “حظر الوصول العام”:

ما الذي تفعله

بمجرد تفعيل التحميلات الآمنة، سيتم تصنيف أي ملف يتم رفعه عبر المصنف (Composer) على أنه آمن أو غير آمن بناءً على المعايير التالية:

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

سيكون الملف المرفوع في S3 لديه قائمة تحكم في الوصول (ACL) خاصة، لذا فإن الروابط المباشرة إلى الملف في S3 ستؤدي إلى خطأ 403 (مرفوض). سيتم الوصول إلى أي من التحميلات الآمنة جميعًا عبر عنوان URL موقع سلفي (presigned URL) في S3. ومع ذلك، سيظل هذا مخفيًا عن مستخدميك؛ فإذا كان الرفع آمنًا، سيتم أي مرجع إليه عبر عنوان URL /secure-uploads/ الخاص بـ Discourse.

الأذونات والتحكم في الوصول

سيحدد عنوان URL /secure-uploads/ ما إذا كان المستخدم الحالي مسموحًا له بالوصول إلى الوسائط وخدمتها إذا كان مسموحًا بذلك. عند إنشاء الرفع، سيتم تعيين المنشور الذي ظهر فيه لأول مرة على أنه “منشور التحكم في الوصول”، وستكون جميع الأذونات مبنية على ذلك المنشور.

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

نسخ عناوين URL /secure-uploads/ ونقلها بين المنشورات والمواضيع أمر غير حكيم، حيث سيكون للمستخدمين المختلفين مستويات وصول مختلفة داخل منتديات Discourse الخاصة بك. يجب دائمًا إنشاء التحميلات الجديدة عبر المصنف (Composer). ستحترم الصور المضمنة (Oneboxes) والصور المرتبطة مباشرة (hotlinked) أيضًا قواعد التحميلات الآمنة. لا تتأثر التحميلات الخاصة بالإعدادات، والرموز التعبيرية (emojis)، وتحميل السمات (theme uploads) بـ التحميلات الآمنة، حيث يجب أن تكون عامة.

:warning: إذا تم حذف منشور التحكم في الوصول، فلن يكون الرفع المرفق قادرًا على الوصول إليه بعد الآن. :warning:

نقل المنشورات التي تحتوي على تحميلات آمنة

إذا قمت بنقل “منشور تحكم في الوصول” بين سياقات أمنية مختلفة، فقد يتغير الرفع المرفق ليصبح آمنًا أو غير آمن. هذه هي الحالات التي قد تغير أمان الرفع:

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

التحميلات الآمنة في رسائل البريد الإلكتروني

تم تمكين تضمين الصور الآمنة في رسائل البريد الإلكتروني افتراضيًا. يمكنك تكوين إعدادات الموقع هذه لمزيد من التحكم:

  • secure_uploads_allow_embed_images_in_emails : قم بتعطيل هذا لإخفاء الصور الآمنة في رسائل البريد الإلكتروني.
  • secure_uploads_max_email_embed_image_size_kb : الحد الأقصى لحجم الصورة الآمنة التي سنقوم بتضمينها، الافتراضي 1 ميجابايت، حتى لا تصبح رسالة البريد الإلكتروني كبيرة جدًا. الحد الأقصى هو 10 ميجابايت. يعمل بالتزامن مع email_total_attachment_size_limit_kb.

سيتم إضافة الصور الآمنة كمرفقات للبريد الإلكتروني وتضمينها باستخدام تنسيق عنوان URL cid: لأن دعم عناوين URL base64 في عملاء البريد الإلكتروني لا يزال غير مستقر.

إذا لم يكن لديك secure_uploads_allow_embed_images_in_emails مفعلاً، أو إذا بدأت الصور في تجاوز حدود الحجم، فستظهر لك هذه الرسالة بدلاً من الصور الآمنة (كما هو الحال مع الصوت والفيديو الآمنين غير المضمنين):

image

العملاء المستضافون

في الوقت الحالي، تتوفر التحميلات الآمنة لعملاء خطة المؤسسة فقط. يرجى التواصل معنا لمزيد من التفاصيل.

51 إعجابًا
Files/Download Manager For Discourse
Prevent guests from watching images
Register to download
Need log the who downloaded attachments
S3 Bucket objects restricted access policy as per Discourses groups
Signed Google Cloud CDN URLs
Search engines and private messages?
How to make uploads available only to logged-in users
S3 Object Storage for uploads- possible to make private? (and CDN question)
Discourse jumps back 20 posts in post history when navigating to new topic
Discourse jumps back 20 posts in post history when navigating to new topic
Why run UpdatePostUploadsSecureStatus even when secure uploads is disabled?
SSL_connect returned=1 errno=0 peeraddr=162.243.189.2:443 state=error: certificate verify failed (Hostname mismatch)
Understanding Uploads, Images, and Attachments
Capacity planning / Resource requirements
Can't always select any category in composer
How the media in the posts look like when secure uploads are enabled?
S3 Object Storage for uploads- possible to make private? (and CDN question)
Personal Message attachments accessible to unauthenticated users (missing auth check)
Potential Directory Traversal: /uploads/* allows cross-directory file access
S3 Storage with no Public access
Are the images published in the Staff category publicly visible?
Login Only - Does it actually stop all traffic access without login?
为啥我的七牛云s3附件上传成功后,论坛中无法加载出来?
Why you should use Discourse internally for your company/team instead of Slack (4 years use case)
Remove images from emailed reply to forum
Files/Download Manager For Discourse
Topic replies invisible until topic owner decides to reveal them?
Securing private group/category resources
PDF embedding and reading help
Inline PDF Previews
Upload objects to private S3 is not working
Spammers using uploaded images in spam e-mails. Any advice how to resolve?
Secure Media Uploads breaks Category Logos
How to allow downloading images along with other user data (csv) from activity section?
Discourse 2.6.0.beta3 Release Notes
Lock Downloads in discourse
What’s the suggested method to use secure images?
Page Publishing
Errors on Exporting Data from Teams to Self Hosted Discourse on Digital Ocean

There should probably be a lot of warnings around this feature @martin as it is an :warning: ADVANCED thing, not for the faint of :heart:, and there is a limit to how much we will support it outside our enterprise tier. Bring your own expertise…

9 إعجابات

لم يكن من المقصود بالأمان تغطية الصور الرمزية، فهذه ليست حالة استخدام خططنا لها

13 إعجابًا

تنبيه: إعداد “منع جميع الوصول العام” لدلو S3 غير صحيح

@genachka @AntiMetaman @Hugh_Roberts @znedw @Thamer

سأقوم بتعديل المنشور الأصلي. بعد التحدث مع عضو فريق البنية التحتية @schleifer، تأكدت من أنني كنت مخطئًا في نصيحتي بشأن تفعيل إعداد “منع جميع الوصول العام”. قم بإيقاف تشغيل هذا الإعداد لدلو S3 الخاص بك، ثم شغّل أمر uploads:sync_s3_acls للتأكد من صحة قوائم التحكم في الوصول (ACLs)، ثم حاول مرة أخرى مع الصور الرمزية المخصصة.

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

{
    "Version": "2012-10-17",
    "Id": "ComputedBucketPolicy",
    "Statement": [
        {
            "Sid": "AllowWorldRead",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::your-bucket-name/*"
        }
    ]
}

الجزء المهم هنا هو أننا نسمح لـ * بالحصول على الكائنات (GetObject)، مما يعني السماح لأي شخص بتنزيل أي شيء في الدلو. ستظهر هذه التسمية أيضًا إذا كانت السياسة عامة:

أعتذر عن هذا الأمر. @AntiMetaman لم يتمكن @schleifer ولا أنا من تكرار هذا الخطأ:

سيكون من المفيد إذا تمكنت من تقديم مزيد من المعلومات حول إعدادات S3/AWS الخاصة بك.

7 إعجابات

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

4 إعجابات

هذا هو جوهر الأمر نعم. أي شيء يحتاج إلى أن يكون خاصًا سيتم تعيين قائمة تحكم في الوصول (ACL) خاصة به، ولن يكون قابلاً للوصول إلا إذا تم استخدام عنوان URL مُوقَّع مسبقًا. لاحظ أن سياسة الخزانة ليست عامة. نعم، يجب إلغاء تحديد جميع إعدادات “منع الوصول العام”. إذا كنت مهتمًا بكيفية تحديدنا ما إذا كان التحميل آمنًا، فجميع القواعد موجودة هنا discourse/lib/upload_security.rb at main · discourse/discourse · GitHub وهنا discourse/app/models/post.rb at main · discourse/discourse · GitHub

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

5 إعجابات

تنفيذ الوسائط الآمن غير متوافق مع Backblaze. هل يدعمون عناوين URL الموقعة مسبقًا؟

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

@riking

نعم، تُدعم عناوين URL الموقعة مسبقًا: https://help.backblaze.com/hc/en-us/articles/360047815993-Does-the-B2-S3-Compatible-API-support-Pre-Signed-URLs-

@martin

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

4 إعجابات

@martin شكرًا على التوضيح. ويمكنني التأكيد أنه مع ترك الإعداد في S3 كما هو في لقطة الشاشة الخاصة بي كـ

4 إعجابات

لقد دمجت هذا الطلب هذا الأسبوع وأضيف هذه التفاصيل إلى المنشور الأصلي:


إذا كنت تريد السماح بتضمين صور آمنة في رسائل البريد الإلكتروني، فيمكنك تكوين إعدادات الموقع التالية:

  • secure_media_allow_embed_images_in_emails: إذا تم تمكين هذا الخيار، فسنقوم بتضمين الصور الآمنة في رسائل البريد الإلكتروني بدلاً من حذفها.
  • secure_media_max_email_embed_image_size_kb: الحد الأقصى لحجم الصورة الآمنة التي سنقوم بتضمينها، وهو افتراضيًا 1 ميجابايت، حتى لا تصبح رسالة البريد الإلكتروني كبيرة جدًا. الحد الأقصى هو 10 ميجابايت. يعمل بالتزامن مع email_total_attachment_size_limit_kb.

سيتم إضافة الصور الآمنة كمرفقات في رسائل البريد الإلكتروني وتضمينها باستخدام تنسيق عنوان cid: لأن دعم عناوين Base64 في عملاء البريد الإلكتروني لا يزال غير مستقر.

إذا لم يكن لديك secure_media_allow_embed_images_in_emails مفعّل، أو إذا بدأت الصور تتجاوز حدود الحجم، فستظهر لك الصورة التالية بدلاً من الصور الآمنة (وهذا ينطبق أيضًا على الصوت والفيديو الآمنين اللذين لا يتم تضمينهما):

image

10 إعجابات

إضافة أخرى إلى منشوري السابق؛ من هذا طلب السحب:

لقد قمنا الآن بتفعيل تضمين وسائط الصور الآمنة افتراضيًا.

5 إعجابات

بعد إعداد تحميل الوسائط الآمن (وفقًا لدليل المنشئ الأصلي)، يعمل كل شيء بشكل جيد (المرفقات، الصور…) باستثناء التحميلات التي ليست مرفقات للمواضيع (مثل شعار الموقع، صورة الملف الشخصي)، حيث تظهر نافذة منبثقة “مرفوض” في Discourse.
هل أخطأت في بعض الإعدادات؟

يرجى قراءة الموضوع، حيث تم تناول مشكلتك في عدد من المشاركات أعلاه هذه.

3 إعجابات

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

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

صحيح.

الموضوع الأصلي قد اختفى بالفعل، لكن المشكلة والحل لا يزالان موجودين

6 إعجابات

لاحظت وجود خلل عند استخدام الوسائط الآمنة ورابط https://meta.discourse.org/t/knowledge-base-plugin/115288
روابط المرفقات في قاعدة المعرفة تفشل في الفتح (إعادة توجيه إلى صفحة 404) ما لم تُجبر على الفتح في نافذة جديدة.
والغريب جدًا أن نفس المرفق يمكن فتحه دون أي مشكلة من موضوع Discourse المرتبط بعنصر قاعدة المعرفة.

تعديل:
يحدث نفس الخلل عند نسخ رابط مرفق من رد إلى آخر. الرابط هو نفسه بالطبع، لكنه يعمل فقط من الرد الأصلي، ما لم يُجبر على الفتح في نافذة جديدة.

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

ماذا عن الوسائط الآمنة إذا لم يتم استخدام S3؟
حاليًا، يبدو أنه إذا كان لديك الرابط المباشر للملف المرفوع، فيمكنك تنزيل ذلك الملف دون تسجيل الدخول. وهذا يُعدّ مشكلة أمنية…

الوسائط الآمنة تتطلب S3.
تم تطوير هذه الميزة بالكامل لجعل مشاركة الروابط المباشرة والوصول إليها أمرًا مستحيلًا.

11 إعجابًا

هذه ميزة ممتازة. شكرًا لكم على تطويرها. لا يدعم Minio، وهو بديل مجاني جاهز للاستخدام بدلاً من S3، قوائم التحكم بالوصول (ACLs) ولن يدعمها أبدًا. حججتهم، وهي حجة جيدة، هي أن قوائم التحكم بالوصول ليست ميزة مفيدة وتؤثر سلبًا على الأداء لأنها تتطلب عملية كتابة ثانية. سيعمل تحميل الوسائط الآمن مع Discourse - ستفشل مهمة uploads:secure_upload_analyse_and_update في الخطوة الأخيرة، ولكن يبدو أنه يمكنك تجاهل ذلك. مع ذلك، هل هناك أي سبب يجعل Discourse يقوم بمكالمات لقوائم التحكم بالوصول على الإطلاق؟

3 إعجابات

نعم، لأن خزانة S3 خاصة بناءً على الإعدادات في المنشور الأصلي، يجب تعيين ACL للتحميلات غير الآمنة إلى عام، وستكون التحميلات الآمنة ذات ACL خاص بحيث يمكن الوصول إلى عنوان URL الخاص بـ S3 مباشرة. لا أعتقد أن لدينا خططًا في الوقت الحالي لتعديل طريقة عمل هذا؛ أعتقد أن هناك قدرًا كبيرًا من العمل المطلوب لتجنب استخدام ACLs على الإطلاق لاستبدال S3.

7 إعجابات