تأمين الأنظمة الموزعة تعمل تحدي معقد بسبب تنوع ومقياس المكونات المعنية. مع الخدمات المتعددة التي تتفاعل عبر شبكات قد تكون غير آمنة، يزداد خطر تخطي الوصول الغير مسموح به والتهديد المتعلق بالاستهلاك الغير مصرح للبيانات بشكل كبير. يقوم هذا المقال باستكشاف طريقة عملية لتأمين الأنظمة الموزعة باستخدام مشروع مفتوح المصدر. يبين المشروع كيفية دمج عدة آليات وتقنيات أمنية لمواجهة التحديات الأمنية المتعددة مثل التحقق والتسلسل الآمن والتواصل الآمن.
فهم التحديات الأمنية في الأنظمة الموزعة
تتضمن الأنظمة الموزعة خدمات أو خاصيات صغيرة تتواصل بشكل آمن عبر الشبكة. تشكل التحديات الأساسية في هذه الأنظمة التقنية ما يلي:
- التواصل الآمن: ضمان أن تتم تشفير البيانات التي تتم نقلها بين الخدمات وتحميدها من التنصت أو التلويث.
- التحقق: تحقيق تحقيق هويات المستخدمين والخدمات لمنع الوصول الغير مسموح به.
- التسلسل: سيطلب منا تحكم بما يفعله مستخدمون وخدمات مسموح به وفقاً لأدوارهم وال permisions.
- تنفيذ السياسات: تنفيذ قوانين وتحكمات جديدة تحدد تفاعلات الخدمات والمستخدمين.
- إدارة الشهادات: إدارة الشهادات الرقمية لتشفير البيانات وإنشاء الثقة بين الخدمات
هذا المشروع المفتوح المصدر يتناول هذه التحديات باستخدام عدة تكنولوجيات وحلول متكاملة.
تأسيس وإعداد المشروع
يبدأ المشروع بإنشاء بيئة آمنة باستخدام قوالب الصف الخارجي وDocker. ويتضمن الإعداد توفير الشهادات الرقمية وبدء خدمات الحاجة لضمان أن كل المكونات جاهزة للتواصل الآمن.
خطوات إعداد البيئة
1. توفير الشهادات
يستخدم المشروع قوالب الصف الخارجي (provisioning.sh
) للمحاكاة للهيئة المعتمدة للشهادات (CA) وتوليد الشهادات المطلوبة للخدمات.
./provisioning.sh
2. بدء الخدمات
يستخدم Docker Compose لبدء جميع الخدمات المعنية في المشروع والتأكد من أنها مُconfigured بطريقة correct للعمل الآمن.
docker-compose up
3. اختبار تواصل الخدمات الباقية
لتحقيق التفقد الشهير للتواصل الخاص بين الخدمات باستخدام الشهادات والاوامر المجازية، يوفر م脚本 test_services.sh
هذا. يوضح هذا الم脚本 كيف تتفاعل مختلف الخدمات بشكل آمن باستخدام الشهادات المعينة لهم.
حل التحديات الأمنية في الأنظمة الموزعة
يتضمن المشروع عدد من التكنولوجيات الرئيسية للتعامل مع التحديات الأمنية الرئيسية المذكورة من قبل. هذا كيف يتم حل كل تحدي:
1. التواصل الآمن بواسطة الTLS المتعاون (mTLS)
التحدي
في نظام موزع، يتوجب على الخدمات أن تتواصل بشكل آمن لتمنع الوصول غير المعتمد وقرصنة البيانات.
الحل
يستخدم المشروع الTLS المتعاون (mTLS) لتأمين التواصل بين الخدمات. mTLS يتضمن أن يتم توثيق المتصل والمستقبل باستخدام الشهادات الخاصة بهما من خلال التوثيق المتعاون. هذا التواصل المتعاون المشترك يمنع الخدماتغير المعتمدة من التواصل مع الخدمات المعتمدة.
التطبيق
نجينكس يتم ضبطه كوسلت معا للتعامل مع mTLS. يتطلب جميع الشهادات الخاصة بال client وال server لتأكيد الاتصال الآمن، مما يضمن بأن توافر البيانات التي تم تحميلها بين الخدمات ستبقى خفيفة و منعزلة و غير قابلة للتلويث.
2. التحقق بواسطة Keycloak
تحدي
تحقيق تأكيد صحيح للمستخدمين والخدمات مهم لمنع الوصول الغير مصرح.
حل
يستخدم المشروع Keycloak، حل توفير الهوية وإدارة الصلاحيات المفتوح المصدر، لإدارة التحقق. يدعم Keycloak وسائل التحقق متعددة، بما في ذلك OpenID Connect والشهادات الخاصة بال client، مما يجعله مناسبًا للتحقق من المستخدمين والخدمات.
- تحقق المستخدمين:
يتم تحقيق المستخدمين بواسطة OpenID Connect. يتم تعديل Keycloak مع معتمد (appTest-login-client
) الذي يتخذ معا تدوال التحقق من المستخدمين، بما في ذلك الدخول، إصدار التوكيل، وتعامل المراسلة الإلهة. - تحقق الخدمات:
للتحقق الخدمي بين الخدمات، يستخدم المشروع معتمد Keycloak (client_credentials-test
) مع النوع الموجه للشهادات الخاصة بال client. هذه الطريقة مناسبة للتحقق من الخدمات دون تدخل مستخدم.
مثال تدوال التحقق
- يتم توجيه المستخدمين إلى الصفحة الدخولية.
- بعد الدخول الموفق، يقوم كييكلوك بتوجيه المستخدم إلى صفحة تلقائية مع ما يشابه كود الاستمرارية.
- يتم مكافأة المرجع الاستمرارية بتوكيل بالتوكيل الرقمي JWT، الذي يستخدم للمعاملات التالية. يوفر ملف
authn.js
في المجلدnginx/njs
المعلومات التفصيلية عن تنفيذ هذا التدوير.
مثال للتحقق بواسطة معلومات العميل
curl -X POST "http://localhost:9000/realms/tenantA/protocol/openid-connect/token" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=client_credentials" \
-d "client_id=client_credentials-test" \
-d "client_secret=your-client-secret-here"
3. التأكيد المستخدمي بواسطة Open Policy Agent (OPA) و JWT
التحدي
تنفيذ قوانين الوصول الدقيقة لضمان أن المستخدمون المتأكدون والخدمات لا يحصلون إلا على الموارد المسموح بها.
الحل
يستخدم المشروع مزيجاً من Open Policy Agent (OPA) و توكيلات JWT لتنفيذ سياسات التأكيد. المشروع يبرز ثلاث استراتيجيات مختلفة لتحقيق التأكيد الآمن من التحقق بواسطة JWT:
- حصول على الشهادات من Keycloak: تحصل على الشهادات بشكل ديناميكي من قيمة Keycloak لتتحقق من التوكيل.
- استخدام x5t (صندوق الاصمام): يستخدم الاصمام المدمج في التوكيل للحصول على المفاتيح العامة من خزانة موردة محلية.
- تحكم في الشهادة المدمجة: تحكم في التوكين باستخدام شهادة مدمجة، وتتأكد من تحقيق توثيق الشهادة ضد مؤسسة شهادة موثوقة (CA).
انظر إلى الملف nginx/njs/token.js لتطوير تنظيم هذه الاستراتيجيات.
4. تطبيق السياسات بواسطة Open Policy Agent (OPA)
تحدي
تطبيق سياسات تحكم داخلية ومرنة للخدمات والمستخدمين
حل
يستخدم OPA لتطبيق سياسات دقيقة للتحكم في الوصول. تكتب السياسات بلغة تعلمية (Rego) وتتخزن في مجلد opa/. تحدد هذه السياسات الشروط التي يمكن بها للخدمات التواصل ويمكن للمستخدمين إلقاء دخول إلى الموارد، وتضمن تطبيق التحكمات بالوصول بشكل مستمر عبر النظام.
5. إدارة الشهادات
تحدي
إدارة الشهادات الرقمية للخدمات لتأكد من الثقة وتأمين التواصل
الحل:
يشمل المشروع نظام إدارة الشهادات من القوة. يستخدم 脚本 ال外壳 (provisioning.sh
) لمحاكاة سجلة الشهادات (CA) وإنشاء شهادات لكل خدمة. هذه المقاربة تبسم الإدارة للشهادات وتتأكد من أن كل الخدمات لها معلوماتها المطلوبة للتواصل الآمن.
أضافنا أيضًا نقطة النهاية لتحديث شهادة الخدمة بدون حاجة إعادة تشغيل nginx.
curl --insecure https://localhost/certs --cert certificates/gen/serviceA/client.crt --key certificates/gen/serviceA/client.key -F cert=@certificates/gen/serviceA/client.crt -F key=@certificates/gen/serviceA/client.key
الخلاصة
بناء نظام توزيعي آمن يتطلب اختيار حذر في مجالات الأمن المختلفة، بما في ذلك التواصل الآمن، التحقق، التسمية، تنفيذ السياسات، وإدارة الشهادات. يوفر هذا المشروع المفتوح المصدر مثال شامل عن كيفية تداخل عدة آليات الأمن ليتمكن من التعامل مع هذه التحديات بشكل فعال.
من خلال الاتباع لإعدادات وإعدادات التكنولوجيا التي تظهر في هذا المشروع، يمكن للمطورين أن يستخدموا TLS المتعاون، Keycloak، Open Policy Agent، و Nginx لبناء هيكل أمني قوي. تتكامل هذه التكنولوجيات معاً، توفر قاعدة جيدة لحماية نظم التوزيع ضد مجموعة واسعة من التهديدات، تتأكد كلف الحماية والسيطرة على الوصول.
Source:
https://dzone.com/articles/designing-a-secure-architecture-for-distributed-systems