استرداد بيانات الاعتماد/الأسرار من المدير السري مع Spring Boot

1. نظرة عامة

يجب تخزين المعلومات السرية مثل كلمات المرور ومفاتيح واجهة برمجة التطبيقات في مساحة تخزين آمنة ومشفرة ويمكن التحكم في الوصول إليها وقابلية التدقيق فيها. تختار بعض الأنظمة استخدام Vault لتخزين هذه المفاتيح. على Google Cloud، يمكنك استخدام "المدير السري"، وهي خدمة مُدارة، لتخزين الأسرار بأمان والتحكُّم في الوصول إلى المفاتيح السرّية الفردية باستخدام "إدارة الهوية وإمكانية الوصول".

في Spring Boot، يمكنك استخدام Spring Cloud GCP للوصول بسهولة إلى هذه الأسرار من خلال الإشارة إليها باعتبارها أي مواقع Spring أخرى.

في هذا الدرس التطبيقي حول الترميز، ستخزن سرًا في Secret Manager، ثم تنشئ خدمات Spring Boot البسيطة وتسترجع السر.

المعلومات التي ستطّلع عليها

  • كيفية إنشاء تطبيق Spring Boot Java وتكوين Secret Manager.

المتطلبات

  • مشروع على Google Cloud
  • متصفح، مثل Chrome أو Firefox
  • الإلمام بأدوات تحرير النصوص القياسية في Linux مثل Vim أو EMAC أو Nano

كيف ستستخدم هذا البرنامج التعليمي؟

القراءة فقط اقرأها وأكمِل التمارين

كيف تقيّم تجربتك في إنشاء تطبيقات ويب بتنسيق HTML/CSS؟

حديث متوسط بارع

ما هو تقييمك لتجربتك في استخدام خدمات Google Cloud؟

حديث متوسط بارع

2. الإعداد والمتطلبات

إعداد بيئة ذاتية

  1. سجِّل الدخول إلى Cloud Console وأنشِئ مشروعًا جديدًا أو أعِد استخدام مشروع حالي. (إذا لم يكن لديك حساب على Gmail أو G Suite، عليك إنشاء حساب.)

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQTan7F01iePL5DtqQ

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

يُرجى تذكُّر رقم تعريف المشروع، وهو اسم فريد في جميع مشاريع Google Cloud (سبق أن تم استخدام الاسم أعلاه ولن يكون مناسبًا لك). ستتم الإشارة إليها لاحقًا في هذا الدرس التطبيقي حول الترميز باسم PROJECT_ID.

  1. بعد ذلك، عليك تفعيل الفوترة في Cloud Console لاستخدام موارد Google Cloud.

إنّ تنفيذ هذا الدرس التطبيقي حول الترميز لن يكون مكلفًا أو مكلفًا على الإطلاق. احرص على اتّباع أي تعليمات في قسم "الحذف سريعًا". الذي يقدم لك نصائح حول كيفية إيقاف تشغيل الموارد حتى لا تتكبّد أي فواتير خارج نطاق هذا البرنامج التعليمي. يكون مستخدمو Google Cloud الجدد مؤهَّلون للانضمام إلى برنامج الفترة التجريبية المجانية التي تبلغ قيمتها 300 دولار أمريكي.

Google Cloud Shell

يمكن إدارة خدمات Google Cloud عن بُعد من الكمبيوتر المحمول، ولكن في هذا الدرس التطبيقي حول الترميز، سنستخدم Google Cloud Shell، وهي بيئة سطر أوامر يتم تشغيلها في السحابة الإلكترونية.

تفعيل Cloud Shell

  1. من Cloud Console، انقر على تفعيل Cloud Shell H7JlbhKGHITmsxhQIcLwoe5HXZMhDlYue4K-SPszMxUxDjIeWfOHBfxDHYpmLQTzUmQ7Xx8o6OJUlANnQF0iBuUyfp1RzVad_4nCa0Zz5LtwBlUZFXFCWFrmrWZLqg1MkZz2LdgUDQ.

zlNW0HehB_AFW1qZ4AyebSQUdWm95n7TbnOr7UVm3j9dFcg6oWApJRlC0jnU1Mvb-IQp-trP1Px8xKNwt6o3pP6fyih947sEhOFI4IRF0W7WZk6hFqZDUGXQQXrw21GuMm2ecHrbzQ

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

kEPbNAo_w5C_pi9QvhFwWwky1cX8hr_xEMGWySNIoMCdi-Djx9AQRqWn-__DmEpC7vKgUtl-feTcv-wBxJ8NwzzAp7mY65-fi2LJo4twUoewT1SUjd6Y3h81RG3rKIkqhoVlFR-G7w

من المفترَض أن تستغرق عملية توفير المتطلبات اللازمة والاتصال بخدمة Cloud Shell بضع دقائق فقط.

pTv5mEKzWMWp5VBrg2eGcuRPv9dLInPToS-mohlrqDASyYGWnZ_SwE-MzOWHe76ZdCSmw0kgWogSJv27lrQE8pvA5OD6P1I47nz8vrAdK7yR1NseZKJvcxAZrPb8wRxoqyTpD-gbhA

يتم تحميل هذه الآلة الافتراضية مزوّدة بكل أدوات التطوير التي ستحتاج إليها. وتوفّر هذه الشبكة دليلاً رئيسيًا دائمًا بسعة 5 غيغابايت ويتم تشغيله في Google Cloud، ما يحسّن بشكل كبير من أداء الشبكة والمصادقة. يمكنك تنفيذ معظم عملك، إن لم يكن كلّه، في هذا الدرس التطبيقي حول الترميز باستخدام متصفّح أو جهاز Chromebook.

بعد الربط بخدمة Cloud Shell، من المفترض أن يظهر لك أنّه قد تمت مصادقتك وأنّ المشروع معيّن سبق أن تم ضبطه على رقم تعريف مشروعك.

  1. شغِّل الأمر التالي في Cloud Shell لتأكيد مصادقتك:
gcloud auth list

مخرجات الأمر

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
gcloud config list project

مخرجات الأمر

[core]
project = <PROJECT_ID>

إذا لم يكن كذلك، يمكنك تعيينه من خلال هذا الأمر:

gcloud config set project <PROJECT_ID>

مخرجات الأمر

Updated property [core/project].

3- إعداد مفتاح سرّي

لاستخدام Secret Manager، يجب أولاً تفعيل واجهة برمجة التطبيقات:

$ gcloud services enable secretmanager.googleapis.com

بعد ذلك، يمكنك إنشاء مفتاح سرّي باسم greeting بقيمة Hello:

$ echo -n "Hello" | \
 gcloud secrets create greeting \
 --data-file=-

يستخدم هذا الأمر STDIN لتوفير القيمة لسطر الأوامر. ومع ذلك، يمكنك أيضًا وضع القيمة السرّية في ملف، وتحديد اسم الملف للوسيطة --data-file.

يمكنك سرد جميع الأمور السرّية باستخدام gcloud CLI:

$ gcloud secrets list

4. إنشاء خدمة REST جديدة من Spring Boot

بعد إطلاق Cloud Shell، يمكنك استخدام سطر الأوامر لإنشاء تطبيق Spring Boot جديد باستخدام Spring Initializr:

$ curl https://start.spring.io/starter.tgz -d packaging=jar \
  -d dependencies=web,cloud-gcp \
  -d bootVersion=3.0.6 \
  -d type=maven-project \
  -d baseDir=hello-secret-manager | tar -xzvf - \
  && cd hello-secret-manager

في pom.xml، أضِف الاعتمادية الخاصة ببدء تشغيل Spring Cloud GCP:

pom.xml

<project>
  ...

  <dependencies>
    ...
    <!-- Add Secret Manager Starter -->
    <dependency>
      <groupId>com.google.cloud</groupId>
      <artifactId>spring-cloud-gcp-starter-secretmanager</artifactId>
    </dependency>
  </dependencies>

  ...
</project>

في ملف src/main/resources/application.properties، أضِف الإعدادات التالية لتفعيل Spring Boot Config Data API.:

spring.config.import=sm://

سيؤدي هذا الإجراء إلى ضبط مصدر Spring Property Source، بحيث يمكنك الرجوع إلى المفاتيح السرّية باستخدام قيمة سمة، مع البادئة sm://، على سبيل المثال، sm://greeting.

يُرجى الاطّلاع على مستندات مدير سر Google Cloud Platform في Spring Cloud لمعرفة المزيد من التفاصيل حول تنسيق الموقع. يُرجى العلم أنّ متطلبات "application.properties" جديدة في الإصدار 4.x من Spring Cloud GCP. اطّلِع على مزيد من التفاصيل في دليل نقل البيانات.

إنشاء وحدة تحكم REST جديدة من خلال إضافة ملف فئة جديد:

src/main/java/com/example/demo/HelloSecretController.java

package com.example.demo;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloSecretController {
  String greeting = "Hi";

  @GetMapping("/")
  public String hello() {
    return greeting + " World!";
  }
}

يمكنك بدء تطبيق Spring Boot بشكل طبيعي من خلال المكون الإضافي Spring Boot.

احرص على ضبط JAVA_Home على إصدار JDK الصحيح:

$ export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64/

لنتخطّ الاختبارات لهذا التمرين المعملي ونبدأ التطبيق:

$ ./mvnw -DskipTests spring-boot:run

بعد بدء تشغيل التطبيق، انقر على رمز "معاينة الويب" e18df08334f0d809.png في شريط أدوات Cloud Shell واختَر معاينة على المنفذ 8080.

بعد فترة انتظار قصيرة، من المفترض أن تظهر لك النتيجة:

1e9a7884ff113c14.png

5- استرداد سر

يمكنك استخدام تعليق @Value التوضيحي للإشارة إلى السمة السرية باستخدام البادئة sm://.

في فئة HelloSecretController، أدخِل القيمة greeting باستخدام التعليق التوضيحي:

src/main/java/com/example/demo/HelloSecretController.java

import org.springframework.beans.factory.annotation.Value;

...

@RestController
public class HelloSecretController {
  @Value("${sm://greeting}")
  String greeting;

  ...
}

يمكنك بدء تطبيق Spring Boot بشكل طبيعي من خلال المكون الإضافي Spring Boot. لنتخطّ الاختبارات في هذا التمرين المعملي:

$ ./mvnw -DskipTests spring-boot:run

بعد بدء تشغيل التطبيق، انقر على رمز "معاينة الويب" e18df08334f0d809.png في شريط أدوات Cloud Shell واختَر معاينة على المنفذ 8080.

بعد فترة انتظار قصيرة، من المفترض أن تظهر لك النتيجة:

لقطة شاشة للتطبيق قيد التشغيل، وتظهر عبارة &quot;Hello World!&quot;

يمكنك أيضًا ربط القيمة بخاصية في application.properties:

src/main/resources/application.properties

greeting=${sm://greeting}

في HelloSecretController، يمكنك الرجوع إلى اسم الخاصية هذا العام بدلاً من اسم Secret Manager:

src/main/java/com/example/demo/HelloSecretController.java

@RestController
public class HelloSecretController {
  @Value("${greeting}")
  String greeting;
  ...
}

يمكنك بدء تطبيق Spring Boot بشكل طبيعي من خلال المكون الإضافي Spring Boot. لنتخطّ الاختبارات في هذا التمرين المعملي:

$ ./mvnw -DskipTests spring-boot:run

بعد بدء تشغيل التطبيق، انقر على رمز "معاينة الويب" رمز معاينة الويب في شريط أدوات Cloud Shell واختَر معاينة على المنفذ 8080.

تعديل قيمة المفتاح السرّي

باستخدام بنية sm://greeting المختصرة، يمكنك تلقائيًا استخدام أحدث إصدار من المفتاح السرّي. ومن خلال إنشاء نسخة جديدة من المفتاح السرّي، يمكنك تحديث تطبيقك بدون تغيير الرمز.

عدِّل قيمة المفتاح السرّي من خلال إضافة إصدار جديد كما يلي:

$ echo -n "Greetings" |
 gcloud secrets versions add greeting \
 --data-file=-

أعِد تشغيل التطبيق وتحقَّق من عرض الإصدار الجديد من المفتاح السرّي.

لقطة شاشة للتطبيق قيد التشغيل، وتظهر فيها &quot;Greeings World!&quot;

توسيع هذا المفهوم

وهذه التقنية مفيدة خاصةً إذا كنت تستخدم ملفات شخصية مختلفة لتطبيق Spring Boot. على سبيل المثال، يمكنك إنشاء المفاتيح السرّية، مثل greeting-dev وgreeting-staging وgreeting-prod. وفي كل ملف من الملفات الشخصية، قم بتعيين التحية المناسبة.

إنشاء greeting-prod سر:

$ echo -n "Hola" | \
 gcloud secrets create greeting-prod \
 --data-file=- --replication-policy=automatic

إنشاء ملف application-prod.properties:

src/main/resources/application-prod.properties

greeting=${sm://greeting-prod}

يمكنك بدء تطبيق Spring Boot بشكل طبيعي من خلال المكوِّن الإضافي Spring Boot، ولكن من خلال ملف prod الشخصي. لنتخطّ الاختبارات في هذا التمرين المعملي:

$ ./mvnw -DskipTests spring-boot:run -Dspring-boot.run.profiles=prod

بعد بدء تشغيل التطبيق، انقر على رمز "معاينة الويب" رمز معاينة الويب في شريط أدوات Cloud Shell واختَر معاينة على المنفذ 8080.

بعد فترة انتظار قصيرة، من المفترض أن تظهر لك النتيجة:

لقطة شاشة للتطبيق قيد التشغيل تظهر فيه عبارة &quot;Hola World! &quot;

6- ملخّص

لقد أنشأت في هذا التمرين المعملي خدمة يمكن تهيئتها باستخدام الأسرار المخزنة في Secret Manager باستخدام أسماء خصائص Spring التي تبدأ بـ sm:// وإدخال القيمة من ملف applications.properties وتعليقات @Value التوضيحية.

7. تهانينا!

لقد تعلمت كيفية استخدام واجهة برمجة تطبيقات Secret Manager في Java.

مزيد من المعلومات

الترخيص

هذا العمل مرخّص بموجب رخصة المشاع الإبداعي 2.0 مع نسب العمل إلى مؤلف عام.