NextCloud كخدمة بناء ارتباط آمنة

مرحبا هبر! أرغب في مشاركة حالة غير تافهة بعض الشيء حول إعداد NextCloud كخدمة لإنشاء روابط آمنة لتنزيل البيانات مباشرةً من محرك أقراص smb \ cifs متصل بالشبكة. سأصف الحلول للفروق الدقيقة التي واجهتها أثناء الإعداد.



لماذا هذا ضروري؟



توصيل سهل للمحتوى إلى المستخدم النهائي ، وتجاوز المتاعب مع FTP وعدم القدرة (بسبب NDA) على استخدام الخدمات العامة والسحابات لنقل الملفات (BTsync ، Google- Mail- \ Yandex-Disk \ Dropbox \ إلخ).










مقدمة



لدى مكتبنا بنية تحتية معينة ، تشمل Active Directory ، حيث لدينا موظفون موجودون في مجموعات.



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



عادةً ، لإرسال البيانات إلى العالم الخارجي ، يتم رفع بروتوكول FTP منفصل ، أو يتم تحميل البيانات إلى ملف موجود. أعترف أن هذا ليس مناسبًا دائمًا - على الأقل ، إنشاء وإدارة عمليات تسجيل الدخول وكلمات المرور المؤقتة (على سبيل المثال ، عندما يحتاج الشركاء إلى تقديم محتوى جاهز) ، والتحكم في المساحة على خادم FTP ، والتحميل يدويًا إلى خادم FTP قبل "الإرسال".



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



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



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



سنتحدث عن أحدث إصدار ثابت ، الإصدار 19 حاليًا ، لكن طريقة الإعداد لدينا ستعمل مع الإصدارات السابقة أيضًا - قمنا بتطبيقها في البداية على الإصدار 16 ثم تم تحديثها تدريجيًا. لقد رفعته مؤخرًا من الصفر في آخر (19) ، وبناءً عليه أكتب مقالاً.



ما نريده في النهاية:



  • ActiveDirectoty\LDAP, , Jira, Confluence, Nexus .
  • NextCloud, , , .
  • NextCloud — - , . , .
  • -, , NextCloud .* , — .
  • يمكن للموظف إنشاء روابط مؤقتة محمية بكلمة مرور لأي موارد متاحة له - سواء كانت مجلدًا أو ملفًا منفصلاً. وأيضًا إدارتها (الروابط) - الإلغاء ، وتغيير العمر الافتراضي ، إلخ
  • يحتاج المستخدم النهائي الذي تم إرسال الرابط الآمن إليه فقط إلى فتحه وإدخال كلمة المرور حتى يتمكن من تنزيل البيانات التي تمت مشاركتها معه.





توسيع وتكوين التبعيات



بادئ ذي بدء ، نحتاج إلى جهاز أو خادم افتراضي منفصل حيث يمكننا تثبيت نظام التشغيل ، ثم NextCloud.



هناك أكثر من مقال عن حبري مخصص لنشر النظام والخدمة.



الكسندرجيد جدًا ووصف بالتفصيل العملية من تثبيت النظام إلى التكوين ذاته للسحابة (بما في ذلك تحديث المقالات حسب السنة). لا أرى أي سبب لتكرار كل هذا مرة أخرى.



1. نظرًا لأننا نقوم بتوصيل محرك أقراص الشبكة بـ NextCloud ، فإننا نحتاج إلى حزم للنظام: smbclient و libsmbclient و php-ldap و php-smbclient .



ملاحظة في حالة استخدام Docker
, — samba , Dockerfile. , , php-smbclientapt install package”.



Dockerfile
FROM nextcloud:latest
RUN apt update -y &&  apt install -y --allow-unauthenticated smbclient libsmbclient libsmbclient-dev
RUN pecl install smbclient
RUN docker-php-ext-enable smbclient






2. نظرًا لخصائص إعدادات خادم samba (تم تعطيل دعم smb1) ، على الجهاز باستخدام nextcloud ، في الملفين /etc/samba/smb.conf و /usr/share/samba/smb.conf ، كان علينا تغيير الخطوط المسؤولة عن البروتوكول:



[global] 
client min protocol = SMB2
client max protocol = SMB3


استمرار لمثال Dockerfile
RUN rm -frv /etc/samba/smb.conf /usr/share/samba/smb.conf
ADD smb.conf /etc/samba/
ADD smb.conf /usr/share/samba/




خلاف ذلك ، لم يتمكن nextcloud من الاتصال بمحرك الأقراص.






إعداد Nextcloud



لذلك ، تم تثبيت Nextcloud بالفعل ، وتم تثبيت التبعيات ، ولدى الخدمة مستخدم داخلي واحد تم إنشاؤه أثناء التثبيت.



الخطوةالاولى. اعداد قالب لحسابات الموظفين.



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



  'skeletondirectory' => '/var/www/html/data/donotdeletme',


أي أنه يمكنك إنشاء مجلد فارغ وتحديد المسار الكامل إليه في ملف config.



الخطوة الثانية. جعل المستخدمين "للقراءة فقط"



يكفي تحديد الحصة في "1 B" (1 بايت) في قسم إعدادات المستخدم ( http (s): //nextcloud.domain.tld/settings/users ).



الخطوة الثالثة - إصلاح ZipStreamer مقدمًا



ZipStreamer هي مكتبة مستخدمة في الواجهة الخلفية لـ NextCloud ، ويتم استخدامها لإنشاء أرشيفات "أثناء التنقل" ، أي أثناء تنزيل مجموعة من الملفات.







كيف تعمل
, "Dowload All Files"/" ", , ( ) , .







, ( .zip, — .tar)



, , .



: Google Drive, ., ..



تكمن المشكلة في حقيقة أنه ، لأسباب غير معروفة ، فشل منطق تبديل zip إلى zip64 المضمن في NextCloud ، وإذا كان هناك أكثر من 65536 ملفًا في المجلد ، و / أو يتجاوز وزنها الإجمالي 4 جيجا بايت ، فمن المرجح أن تواجه مشكلة أن التنزيل سيتم إما ضرب الملف ، أو سيتم إيقاف التنزيل بعد تنزيل 4 جيجابايت.



تم تخصيص قدر كافٍ من الوقت لهذه المشكلة ، على GitHub هناك تذكرة مغلقة ، وليست واحدة (# 1755 ، # 15871 ، # 8798 ) ، ولكن على الرغم من حقيقة أن المشكلة قد تم حلها ، إلا أننا لا نزال نمتلكها ، ونعيد إنتاجها بنجاح متفاوت ، تتدخل بشكل كبير في العمل. كان علي حلها بشكل جذري.



القرار
100% 64 , 64- . « ».



<, nextcloud>/lib/private/Streamer.php:

- $this->streamerInstance = new ZipStreamer(['zip64' => false]);
+ $this->streamerInstance = new ZipStreamer(['zip64' => true]);


, Docker
Integrity Check ( /usr/src/nextcloud/* /var/www/html/*).



/var/www — , .



/usr/src/nextcloud/lib/private/ CI . , .



Dockerfile
RUN rm -frv /usr/src/nextcloud/lib/private/Streamer.php
ADD Streamer.php /usr/src/nextcloud/lib/private/
RUN chown nobody:nogroup /usr/src/nextcloud/lib/private/Streamer.php


, -, , .









.



الخطوة الرابعة - ضبط معلمات الارتباط



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



الخطوة الخامسة - قم بتوصيل محرك أقراص الشبكة



  1. دعنا نذهب إلى إنشاء مخازن خارجية . ( http (s): //nextcloud.domain.tld/settings/admin/externalstorages )
  2. نختار إضافة تخزين SMB \ CIFS.
  3. نقوم بملء الحقول الخاصة بالاسم والمجال والمجلد وما إلى ذلك.
  4. نختار "بيانات الاعتماد ، تخزينها في قاعدة البيانات" - هذا العنصر هو الذي يسمح للمستخدم بتوصيل القرص بحسابه في NextCloud عندما يدخل المستخدم باستخدام رابط تسجيل الدخول وكلمة المرور. (العنصر الذي يخزن تسجيل الدخول وكلمة المرور أثناء الجلسة لم يقلع).
  5. لا تنس في القائمة <...> تحديد مربعات الاختيار "للقراءة فقط" وإذن المشاركة.


الخطوة السادسة - تشغيل المستخدمين من خلال LDAP



الآن بعد أن أصبح لدينا كل شيء جاهزًا ، نقوم بتثبيت المكون الإضافي من السوق ، وبعد توصيل LDAP مباشرة. في نظامنا ، منحنا إمكانية الوصول للموظفين الموجودين في مجموعة NextcloudAccess . يمكنك أن تفعل الشيء نفسه.






خاتمة



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



مثال كامل لملف Dockerfile الخاص بنا
FROM nextcloud:latest
ENV DEBIAN_FRONTEND noninteractive

#installing smbclient
RUN apt update -y &&  apt install -y --allow-unauthenticated smbclient libsmbclient libsmbclient-dev
RUN pecl install smbclient
RUN docker-php-ext-enable smbclient

#fix of ZipStreammer
RUN rm -frv /usr/src/nextcloud/lib/private/Streamer.php
ADD Streamer.php /usr/src/nextcloud/lib/private/
RUN chown nobody:nogroup /usr/src/nextcloud/lib/private/Streamer.php

#fix of smb config
RUN rm -frv /etc/samba/smb.conf /usr/share/samba/smb.conf
ADD smb.conf /etc/samba/
ADD smb.conf /usr/share/samba/







اختبار الإجهاد



"كيف حالك مع الحمل؟" - تسأل أخيرا.



القياسات خلال ساعة الذروة








يعمل مثيل خدمتنا على حوالي 6 جيجابت رام + 6 وحدة معالجة مركزية في جهاز افتراضي من بين أجهزة افتراضية أخرى.



في ذروة تحميل الشبكة ، تم استخدام ما يزيد قليلاً عن 2.5 جيجا بايت من ذاكرة الوصول العشوائي ، ولم يكن المعالج مسدودًا ، وكان العائد في المتوسط ​​حوالي 5 جيجابت / ثانية (وصل السجل إلى 8 جيجابت / ثانية).



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




عيوب محددة:



  • NextCloud ليس لديه القدرة على التحكم الشامل في جميع الروابط التي تم إنشاؤها. يتم عرضها فقط داخل كل حساب في قسم منفصل.
  • إذا قمت بمشاركة جذر محرك أقراص متصل باستخدام رابط ، فيمكن أن يكون هذا بمثابة تسريب محتمل للبيانات ، حيث ستتم مشاركة جميع المجلدات المتاحة لحسابك في الرابط.
  • لقد لاحظت أنه لمدة عام من استخدام الخدمة المرفوعة ، في الوقت الحالي ، يزن جدول oc_filecache في قاعدة البيانات حوالي 29 جيجا بايت ويحتوي على حوالي 100 ألف صف (نستخدم الفانيليا MySQL 5.7.x). هذا بسبب الأخطاء # 16834 ، # 6395 ، # 7312 ، # 20349 . بينما هناك مراقبة في الدرجة الثانية.





شكرا للقراءة. إذا كان لديك أي أسئلة أو تعليقات أو اقتراحات - لا تتردد ، يسعدني دائمًا النقد البناء.






 : nextcloud 16, 17, 18, 19
 : 26.07.2020
 : 24.09.2020
 :  .  Areso.
: 1.0.0.9



All Articles