يتعين على العديد من المؤسسات ، لا سيما المؤسسات المالية ، التعامل مع معايير الأمان المختلفة - على سبيل المثال ، PCI DSS. تتطلب هذه الشهادات تشفير البيانات. يتم تطبيق تشفير البيانات الشفاف على القرص في تطبيق تشفير البيانات الشفاف في العديد من قواعد إدارة قواعد البيانات الصناعية.
يستخدم Apache Ignite في البنوك ، لذلك ، تقرر تطبيق TDE فيه.
سوف أصف كيف قمنا بتطوير TDE من خلال المجتمع ، بشكل عام ، من خلال عمليات Apachev.
فيما يلي نسخة نصية من التقرير:
سأحاول التحدث عن الهندسة المعمارية ، وعن مدى تعقيد التنمية ، وكيف تبدو حقًا في المصادر المفتوحة.
ما الذي تم وما الذي يجب عمله؟
نفذت حاليا اباتشي اشعل TDE. المرحلة 1.
يتضمن الميزات الأساسية للعمل مع ذاكرات التخزين المؤقت المشفرة:
- الإدارة الرئيسية
- إنشاء ذاكرة التخزين المؤقت المشفرة
- حفظ جميع بيانات ذاكرة التخزين المؤقت على القرص في شكل مشفر
في المرحلة 2 ، تم التخطيط لإتاحة إمكانية دوران (تغيير) المفتاح الرئيسي.
في المرحلة 3 ، القدرة على تدوير مفاتيح ذاكرة التخزين المؤقت.
المصطلحات
- تشفير البيانات الشفاف - تشفير البيانات الشفاف (للمستخدم) عند الحفظ على القرص. في حالة Ignite ، تشفير ذاكرة التخزين المؤقت ، لأن Ignite عبارة عن ذاكرة تخزين مؤقت.
- Ignite cache - cache-value cache in Apache Ignite. يمكن حفظ بيانات ذاكرة التخزين المؤقت على القرص
- الصفحات - صفحات البيانات. في Ignite ، يتم ترقيم جميع البيانات. تتم كتابة الصفحات على القرص ويجب تشفيرها.
- WAL - الكتابة سجل المقبلة. يتم حفظ جميع تغييرات البيانات في Ignite هناك ، وجميع الإجراءات التي قمنا بها لجميع ذاكرات التخزين المؤقت.
- Keystore - jeystore القياسية java ، والتي يتم إنشاؤها بواسطة keytool Javascript. كان يعمل ومصدقة في كل مكان ، استخدمناها.
- مفتاح رئيسي - مفتاح رئيسي. استخدامه ، يتم تشفير مفاتيح الجداول ، مفاتيح تشفير ذاكرة التخزين المؤقت. المخزنة في جافا keystore.
- مفاتيح ذاكرة التخزين المؤقت - مفاتيح يتم تشفير البيانات بها بالفعل. جنبا إلى جنب مع المفتاح الرئيسي ، يتم الحصول على هيكل من مستويين. يتم تخزين المفتاح الرئيسي بشكل منفصل عن ذاكرة التخزين المؤقت للمفتاح والبيانات الرئيسية - لأغراض الأمان ، وفصل حقوق الوصول ، إلخ.
العمارة
كل شيء يتم تنفيذه وفقًا للمخطط التالي:
- يتم تشفير جميع بيانات ذاكرة التخزين المؤقت باستخدام Encryption SPI الجديد.
- بشكل افتراضي ، يتم استخدام AES - خوارزمية التشفير الصناعي.
- يتم تخزين المفتاح الرئيسي في ملف JKS - ملف java قياسي للمفاتيح.
تستخدم البنوك والمؤسسات الأخرى خوارزميات التشفير الخاصة بها: GOST وغيرها. من الواضح أننا وفرنا الفرصة لتخطي Encryption SPI - وهو تطبيق التشفير الذي يحتاجه مستخدم معين.
مخطط العمل

لذلك ، لدينا ذاكرة الوصول العشوائي - ذاكرة الوصول العشوائي مع صفحات تحتوي على بيانات نقية. إن استخدام ذاكرة الوصول العشوائي (RAM) يعني أننا لسنا محميين من أي متسلل حصل على الوصول إلى الجذر وألقى كل الذاكرة. نحن نحمي أنفسنا من المسؤول الذي يأخذ القرص الصلب ويبيعه في سوق Tushino (أو حيث يتم بيع بيانات مماثلة حاليًا).
بالإضافة إلى الصفحات التي تحتوي على ذاكرة التخزين المؤقت ، يتم أيضًا تخزين البيانات في سجل الكتابة المسبق ، والذي يكتب إلى القرص دلتا السجلات التي تم تغييرها في المعاملة. يخزن metastore مفاتيح تشفير ذاكرة التخزين المؤقت. وفي ملف منفصل - مفتاح رئيسي.
في كل مرة يتم إنشاء مفتاح للذاكرة المؤقتة ، قبل الكتابة إلى الشبكة أو نقلها ، نقوم بتشفير هذا المفتاح باستخدام مفتاح رئيسي. بحيث لا يمكن لأحد الحصول على مفتاح ذاكرة التخزين المؤقت بعد تلقي إشعال البيانات. فقط عن طريق سرقة كل من المفتاح الرئيسي والبيانات يمكنك الوصول إليها. هذا غير محتمل ، لأن الوصول إلى هذه الملفات يتطلب حقوقًا متنوعة.
خوارزمية الإجراءات هي كما يلي:
- في بداية العقدة ، قم بطرح المفتاح الرئيسي من jks.
- في بداية العقد ، اقرأ متجر meta وفك تشفير مفاتيح ذاكرة التخزين المؤقت.
- عند الانضمام إلى العقد في كتلة:
- التحقق من تجزئة المفتاح الرئيسي.
- التحقق من مفاتيح التخزين المؤقت المشترك.
- حفظ المفاتيح لذاكرة التخزين المؤقت الجديدة.
- عند إنشاء ذاكرة تخزين مؤقت بشكل ديناميكي ، نقوم بإنشاء مفتاح وحفظه في مخزن التعريف.
- عند قراءة / كتابة الصفحة ، نقوم بفك تشفيرها / تشفيرها.
- يتم تشفير كل إدخال WAL لذاكرة التخزين المؤقت المشفرة أيضًا.
الآن بمزيد من التفاصيل:
في بداية العقدة ، لدينا رد اتصال يطلق EncryptionSPI الخاص بنا. وفقًا للمعلمات ، نقوم بطرح المفتاح الرئيسي من ملف jks.
بعد ذلك ، عندما يكون metastore جاهزًا ، نحصل على مفاتيح التشفير المخزنة. في هذه الحالة ، لدينا بالفعل مفتاح رئيسي ، حتى نتمكن من فك تشفير المفاتيح والوصول إلى بيانات ذاكرة التخزين المؤقت.
بشكل منفصل ، هناك عملية مثيرة للاهتمام للغاية - كيف يمكننا الانضمام إلى عقدة جديدة في كتلة. لدينا بالفعل نظام موزّع يتكون من عدة عقد. كيفية التأكد من تكوين العقدة الجديدة بشكل صحيح ، وأنها ليست مهاجمًا؟
نحن ننفذ هذه الإجراءات:
- عندما تصل عقدة جديدة ، فإنها ترسل علامة تجزئة من المفتاح الرئيسي. نحن ننظر إلى أنه يتطابق مع الموجود.
- ثم نتحقق من مفاتيح التخزين المؤقت المشترك. من العقدة يأتي معرف ذاكرة التخزين المؤقت ومفتاح ذاكرة التخزين المؤقت المشفرة. نتحقق منها للتأكد من أن جميع البيانات الموجودة على جميع العقد مشفرة بنفس المفتاح. إذا لم يكن الأمر كذلك ، فنحن ببساطة لا نملك الحق في السماح للعقدة في الكتلة ؛ وإلا ، فسوف تنتقل عن طريق المفاتيح والبيانات.
- إذا كان هناك أي مفاتيح وذاكرة تخزين مؤقت جديدة على العقدة الجديدة ، فاحفظها للاستخدام في المستقبل.
- عند إنشاء ذاكرة التخزين المؤقت ديناميكيًا ، يتم توفير وظيفة إنشاء المفاتيح. نقوم بإنشائه وحفظه في متجر meta ويمكننا الاستمرار في تنفيذ العمليات الموصوفة.
الجزء الثاني هو البنية الفوقية على عمليات الإدخال / الإخراج. تتم كتابة الصفحات في ملف القسم. تبحث الوظيفة الإضافية الخاصة بنا في ذاكرة التخزين المؤقت للصفحة ، وتقوم بتشفيرها وفقًا لذلك وحفظها.
الشيء نفسه ينطبق على WAL. يوجد متسلسل يقوم بتسلسل كائنات سجل WAL. وإذا كان السجل مخصصًا للتخزين المؤقت المشفر ، فيجب علينا تشفيره وحفظه على القرص فقط.
صعوبات التنمية
الصعوبات الشائعة في جميع المشاريع مفتوحة المصدر أكثر أو أقل تعقيدًا:
- تحتاج أولاً إلى فهم جهاز الإشعال كليًا. لماذا وماذا وكيف تم القيام به هناك وكيف وكيف في أي مكان تعلق معالجاتك.
- من الضروري توفير التوافق مع الإصدارات السابقة. هذا يمكن أن يكون صعبا للغاية ، وليس واضحا. عند تطوير منتج يستخدمه الآخرون ، عليك مراعاة أن المستخدمين يريدون تحديثه دون مشاكل. التوافق الخلفي هو الصحيح وجيد. عندما تقوم بإجراء تحسين كبير مثل TDE ، تقوم بتغيير قواعد الحفظ على القرص ، فإنك تقوم بتشفير شيء ما. والتوافق مع الوراء يجب أن يعمل على.
- هناك نقطة أخرى غير واضحة تتعلق بتوزيع نظامنا. عندما يحاول عملاء مختلفون إنشاء نفس ذاكرة التخزين المؤقت ، فإنك تحتاج إلى الاتفاق على مفتاح التشفير ، لأنه سيتم إنشاء اثنين مختلفين افتراضيًا. لقد حللنا هذه المشكلة. لن أسهب بمزيد من التفصيل - الحل يستحق وظيفة منفصلة. الآن نحن نضمن استخدام مفتاح واحد.
- الشيء المهم التالي أدى إلى تحسينات كبيرة ، عندما بدا أن كل شيء جاهز (قصة مألوفة؟) :). التشفير له النفقات العامة. لدينا متجه init - صفر بيانات عشوائية يتم استخدامها في خوارزمية AES. يتم تخزينها في شكل مفتوح ، وبمساعدتهم نقوم بزيادة إنتروبيا: سيتم تشفير البيانات نفسها بشكل مختلف في جلسات تشفير مختلفة. تحدث تقريبًا ، حتى لو كان لدينا اثنان من إيفان بتروف يحمل نفس اللقب ، في كل مرة نقوم بتشفيرها ، سوف نتلقى بيانات مشفرة مختلفة. هذا يقلل من فرصة القرصنة.
يحدث التشفير في كتل من 16 بايت ، وإذا لم تتم محاذاة البيانات من خلال 16 بايت ، فإننا نضيف معلومات الحشو - مقدار البيانات التي قمنا بتشفيرها بالفعل. على القرص ، ستحتاج إلى كتابة صفحة متعددة من 2 كيلوبايت. هذه هي متطلبات الأداء: يجب علينا استخدام المخزن المؤقت للقرص. إذا لم نكتب 2 كيلوبايت (لا 4 أو لا 8 ، اعتمادًا على المخزن المؤقت للقرص) ، فسنحصل فورًا على أداء انخفاض كبير.
كيف حلنا المشكلة؟ اضطررت إلى الزحف إلى PageIO ، في ذاكرة الوصول العشوائي وقطع 16 بايت من كل صفحة ، والتي سيتم تشفيرها عند كتابتها إلى القرص. في هذه البايتات الـ 16 نكتب المتجه الأولي.
- صعوبة أخرى هي عدم كسر أي شيء. هذا شيء شائع عندما تأتي وتجري بعض التغييرات. في الواقع ، ليست بهذه البساطة كما يبدو.
- في MVP اتضح 6 آلاف خطوط. من الصعب المراجعة ، وقلة من الناس يرغبون في القيام بذلك - خاصة من الخبراء الذين ليس لديهم وقت بالفعل. لدينا أجزاء مختلفة - واجهة برمجة التطبيقات العامة ، الجزء الأساسي ، مدراء SPI ، المتجر الثابت للصفحات ، مدراء WAL. تتطلب التغييرات في النظم الفرعية المختلفة أن تتم مراجعتها بواسطة أشخاص مختلفين. وهذا يفرض أيضا صعوبات إضافية. خاصة عندما تعمل في مجتمع يكون فيه جميع الأشخاص مشغولين بمهامهم. ومع ذلك ، عملت كل شيء بالنسبة لنا.
ماذا سيحدث في TDE.Phase 2 و 3
تم الآن تنفيذ المرحلة الأولى ، حيث يمكنك كمطور تطوير المرحلة الثانية. يتطلب PCI DSS ، مثل المعايير الأخرى ، ميزات إضافية لنظام التشفير. يجب أن يكون نظامنا قادرًا على تغيير المفتاح الرئيسي. على سبيل المثال ، إذا تم اختراقه أو أن الوقت قد حان للتو وفقًا للسياسة الأمنية. الآن إشعال لا يعرف كيف. ولكن في الإصدارات المستقبلية ، سوف نعلم TDE لتغيير المفتاح الرئيسي.
نفس الشيء مع القدرة على تغيير مفتاح ذاكرة التخزين المؤقت دون إيقاف الكتلة والعمل مع البيانات. إذا كانت ذاكرة التخزين المؤقت طويلة العمر وفي نفس الوقت تقوم بتخزين بعض البيانات - المالية والطبية - يجب أن يكون بإمكان Ignite تغيير مفتاح تشفير ذاكرة التخزين المؤقت وإعادة تشفير كل شيء سريعًا. سوف نحل هذه المشكلة في المرحلة الثالثة.
المجموع: كيفية تنفيذ ميزة كبيرة في مشروع مفتوح المصدر؟
لتلخيص. ستكون ذات صلة بأي مصدر مفتوح. شاركت في كافكا وفي مشاريع أخرى - القصة في كل مكان هي نفسها.
- ابدأ بالمهام الصغيرة. لا تحاول أبدًا حل مشكلة كبيرة جدًا على الفور. من الضروري أن نفهم ما يحدث ، وكيف يحدث ، وكيف يتم تحقيقه. من سيساعدك وبشكل عام - من أي جانب للاقتراب من هذا المشروع.
- فهم المشروع. عادةً ما يأتي جميع المطورين - على الأقل أنا - ويقولون: كل شيء يحتاج إلى إعادة كتابة. كان كل شيء سيئًا أمامي ، والآن سأعيد كتابته - وكل شيء سيكون على ما يرام. من المستحسن تأجيل مثل هذه البيانات ، لمعرفة ما هو سيء بالضبط وما إذا كان يحتاج إلى تغيير.
- ناقش ما إذا كانت هناك حاجة إلى تحسينات. لقد واجهت حالات عندما جئت إلى المجتمعات المختلفة من ذوي الخبرة ، على سبيل المثال ، في سبارك. أخبرني ، لكن المجتمع لم يهتم لسبب ما. في أي حال يحدث ذلك. أنت بحاجة إلى هذه المراجعة ، لكن المجتمع يقول: لا ، نحن لسنا مهتمين ، ولن ندمج ونقدم المساعدة.
- تقديم تصميم. هناك مشاريع مفتوحة المصدر والتي هذا إلزامي. لا يمكنك بدء الترميز دون تصميم متفق عليه من قبل اللجنة وذوي الخبرة. في Ignite ، هذا ليس صحيحًا رسميًا ، لكنه بشكل عام جزء مهم من التطوير. من الضروري تقديم وصف باللغة الإنجليزية أو الروسية المختصة ، اعتمادًا على المشروع. بحيث يمكن قراءة النص وكان من الواضح ما ستقوم به بالضبط.
- ناقش واجهة برمجة التطبيقات العامة. الوسيطة الرئيسية: إذا كان هناك واجهة برمجة تطبيقات عامة جميلة ومفهومة وسهلة الاستخدام ، فإن التصميم صحيح. هذه الأشياء عادة ما تكون متاخمة لبعضها البعض.
مزيد من النصائح الأكثر وضوحًا والتي ليس من السهل متابعتها:
- تطبيق الميزة دون كسر أي شيء. هل الاختبارات.
- اسأل وانتظر (هذا هو الأكثر صعوبة) لمراجعة من الأشخاص المناسبين ، من الأعضاء المناسبين في المجتمع.
- قم بوضع معايير ، ومعرفة ما إذا كان لديك انخفاض في الأداء. هذا مهم بشكل خاص عند وضع اللمسات الأخيرة على بعض النظم الفرعية الحرجة.
- انتظر الدمج ، قم ببعض الأمثلة والوثائق.
شكرا للقراءة!