دورة معهد ماساتشوستس للتكنولوجيا "أمن أنظمة الكمبيوتر". المحاضرة 6: "الفرص" ، الجزء 3

معهد ماساتشوستس للتكنولوجيا. محاضرة رقم 6.858. "أمن أنظمة الكمبيوتر." نيكولاي زيلدوفيتش ، جيمس ميكنز. 2014 سنة


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

المحاضرة 1: "مقدمة: نماذج التهديد" الجزء 1 / الجزء 2 / الجزء 3
المحاضرة 2: "السيطرة على هجمات القراصنة" الجزء 1 / الجزء 2 / الجزء 3
المحاضرة 3: "تجاوزات العازلة: المآثر والحماية" الجزء 1 / الجزء 2 / الجزء 3
المحاضرة 4: "فصل الامتيازات" الجزء 1 / الجزء 2 / الجزء 3
المحاضرة 5: "من أين تأتي أنظمة الأمن؟" الجزء 1 / الجزء 2
المحاضرة 6: "الفرص" الجزء 1 / الجزء 2 / الجزء 3

الجمهور: إذا كان UID يوفر وصولاً للقراءة فقط إلى هذا الملف ، وكان لديك أيضًا واصف ملف ، إذا فقدت UID ، فهل لا يزال بإمكانك الحصول على إذن لقراءة هذا الملف؟

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

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



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

الجمهور: هل هناك أماكن أخرى؟

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

الجمهور: هل يمكنك توضيح ما هو معرف المستخدم بالضبط ، إذا كانت لديك ميزة القدرة ؟

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

في Unix ، ليس هذا هو الحال عادة. يمكنك فتح الدليل كـ / etc ، ولكن به العديد من ملفات النظام التي يمكن تخزين المعلومات السرية فيها ، على سبيل المثال ، المفتاح الخاص للخادم. وحقيقة أنه يمكنك فتح هذا الدليل والتمرير خلاله لا يعني أنه لا يمكنك فتح الملفات في هذا الدليل. بمعنى ، الوصول إلى الدليل ، يمكنك الوصول إلى الملفات.

في Capsicum ، إذا قمت بفتح الدليل / etc ثم دخلت وضع الميزة ، يحدث ما يلي. تقول: "أنا لا أعرف ما هو هذا الدليل. أنا فقط أضيف واصف ملف إليه ". هناك ملف يسمى "مفتاح". لماذا لا تفتح "مفتاح" هذا الملف؟ فقط لأنه في تلك اللحظة ، ربما لا تريد هذه العملية القائمة على الميزات لفتح هذا الملف ، لأنك لست بحاجة إليه. على الرغم من أن هذا يسمح لك بتجاوز أذونات Unix للملف.

لذلك ، أعتقد أن مؤلفي هذه المقالة اقتربوا بعناية من تطوير نظام لا ينتهك الآليات الأمنية القائمة.

الجمهور: هذا يعني أنك في بعض الحالات يمكنك استخدام مزيج من عاملي الأمان هذين؟ أي أنه على الرغم من أن المستخدم يمكنه تغيير الملف في الدليل ، فما هي الملفات التي يصل إليها تعتمد على معرف المستخدم الخاص به؟

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



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

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

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



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

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

الجمهور: من المحتمل أن يمسح lch جميع الأشياء الموروثة من أجل ضمان بداية "نظيفة" للنظام.

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

لكن المشكلة هي أنه قد يكون هناك العديد من الأشياء الموجودة التي يمكن للعملية الوصول إليها بالفعل.

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



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

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

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



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

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

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

الجمهور: ماذا يحدث إذا احتوت العملية التي تبدأها على setuid ثنائي = 0 ؟

البروفيسور: أعتقد أن هؤلاء الأشخاص لا يستخدمون "الثنائيات" setuid في وضع الميزة لتجنب بعض التفاعلات الغريبة التي قد تظهر. يطبقون هذه القاعدة: يمكن أن يكون لديك برنامج setuid يحصل على امتيازاته من ثنائي setuid ، ثم يمكنه استدعاء cap_enter أو lch_start . ولكن بمجرد دخولك في وضع الميزات ، لا يمكنك استعادة التفضيلات الإضافية.

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

الجمهور: تحدثنا في وقت سابق عن سبب عدم دعم المكتبة لفصل صارم بين عاملي الأمان. لكن ليس علينا استخدام lch_start ؟

الأستاذ: هذا صحيح. لنفترض أن لديك شيء مثل tcpdump ، أو gzip - هذا شيء آخر يعملون معه. تفترض أن التطبيق ربما لم يتم اختراقه ، وهناك بعض الوظائف الأساسية للتطبيق ، وتهتم بكيفية تصرفه في وضع الحماية. في حالة tcpdump ، هذا هو تحليل الحزم القادمة من الشبكة ، في حالة gzip يتم فك الملفات. وإلى حد معين ، تفترض أن العملية تقوم بكل شيء بشكل صحيح ، ولن تكون هناك أي نقاط ضعف. لذلك ، فأنت تثق به في تشغيل lch_start وتعتقد أنه سيقوم بإنشاء الصورة بشكل صحيح ، وتكوين جميع الميزات بشكل صحيح ، ثم تقييد نفسه من أي مكالمات نظام أخرى خارج وضع الإمكانات.

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

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



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

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

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

الجمهور: يمكن للمرء أن يتخلص من بعض القيود الصارمة.

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

بعد ذلك ، في OKWS ، لديك خدمة تشغيل OK ، والتي يجب أن تبدأ جميع العمليات الرئيسية. بمجرد وفاتهم ، تعود الإشارة إلى حالة جيدة لإعادة تشغيل عملية "ميتة". وهذا الشيء يجب أن يمتد إلى الجذر ، لأنه كان عليه أن يعزل العمليات في وضع الحماية. ولكن هناك عدد من الأشياء في OKWS يمكن تحسينها باستخدام الفليفلة .

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

الجمهور: يمكنك إعطاء واصف ملف لكل عملية يسمح لك بإضافة إدخالات فقط إلى السجل.

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

Capsicum ?

: , , , . , , , .

: , . Capsicum , , . .

: , , okld . , .

: , . . , , Capability , . , , , , , .
, OKWS . . , , , . .

, , «». , . , , , , . .
: «» , , ?

: , FreeBSD . , - , . FreeBSD Casper , , Capability . , «».

- , , , - , , Casper .



, «» . . , , , Casper - .

, , - . , Unix FD . , . , , .

, FreeBSD , DNS . DNS -, «». , tcpdump . tcpdump , IP-. , , DNS -.

, , DNS- DNS-, . Casper , DNS-.

, , , Capsicum? ? ? , , . Capsicum , ?

tcpdump GZIP , , . ?



: , , , . , Capability .

: , . Capsicum , , . , , . , , , , Capsicum , .

, «». , TCP — helper , , , , . , , , .

: , .

: , . . , . lth_start , . , , , - .

, , Capsicum . , , , . Unix - , .

, . , . , , . , .

, Chrome . , , , Unix, -, Unix .

, ?

: .

: . . , . , , , , .

Unix , . , . , . . , .

. Linux , setcall , , . , Capsicum , , Capsicum , . Linux setcall , . , , Linux .

, — , , , , . , - , «//», . Capsicum , , .


.

, . ? ? , 30% entry-level , : VPS (KVM) E5-2650 v4 (6 Cores) 10GB DDR4 240GB SSD 1Gbps $20 ? ( RAID1 RAID10, 24 40GB DDR4).

3 Dell R630 — 2 Intel Deca-Core Xeon E5-2630 v4 / 128GB DDR4 / 41TB HDD 2240GB SSD / 1Gbps 10 TB — $99,33 , , هنا .

ديل R730xd أرخص مرتين؟ فقط لدينا 2 x Intel Dodeca-Core Xeon E5-2650v4 128GB DDR4 6x480GB SSD 1Gbps 100 TV من 249 دولارًا في هولندا والولايات المتحدة! اقرأ عن كيفية بناء مبنى البنية التحتية الطبقة باستخدام خوادم Dell R730xd E5-2650 v4 بتكلفة 9000 يورو مقابل سنت واحد؟

Source: https://habr.com/ru/post/ar418221/


All Articles