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

1. نظرة عامة

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

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

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

ما ستتعلمه

  • كيفية إنشاء تطبيق Java باستخدام Spring Boot وضبط Secret Manager

المتطلبات

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

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

قراءة النص فقط قراءة النص وإكمال التمارين

ما هو تقييمك لتجربة إنشاء تطبيقات ويب باستخدام HTML/CSS؟

مبتدئ متوسط متقن

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

مبتدئ متوسط متقدّم

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

إعداد البيئة بالسرعة التي تناسبك

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

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZwci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQTan7F01iePL5DtqQ8-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 starter:

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.

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

أنشئ وحدة تحكّم 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

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

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

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

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

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

أعِد تشغيل التطبيق، وستلاحظ أنّه يتم عرض الإصدار الجديد من كلمة المرور.

لقطة شاشة للتطبيق قيد التشغيل، تعرض &quot;مرحبًا بالعالم!&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 API في Java.

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

الترخيص

يخضع هذا العمل لترخيص Creative Commons Attribution 2.0 Generic License.