1. نظرة عامة
يجب تخزين الأسرار، مثل كلمات المرور ومفاتيح واجهة برمجة التطبيقات، وهي معلومات حساسة، في مساحة تخزين آمنة ومشفّرة، مع التحكّم في الوصول إليها وإمكانية تدقيقها. تختار بعض الأنظمة استخدام Vault لتخزين هذه الأسرار. على Google Cloud، يمكنك استخدام Secret Manager، وهي خدمة مُدارة، لتخزين الأسرار بأمان والتحكّم في الوصول إلى الأسرار الفردية باستخدام "إدارة الهوية وإمكانية الوصول".
في 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. الإعداد والمتطلبات
إعداد البيئة بالسرعة التي تناسبك
- سجِّل الدخول إلى Cloud Console وأنشِئ مشروعًا جديدًا أو أعِد استخدام مشروع حالي. (إذا لم يكن لديك حساب على Gmail أو G Suite، عليك إنشاء حساب).
تذكَّر رقم تعريف المشروع، وهو اسم فريد في جميع مشاريع Google Cloud (الاسم أعلاه مستخدَم حاليًا ولن يكون متاحًا لك، نأسف لذلك). سيتم الإشارة إليه لاحقًا في هذا الدرس العملي باسم PROJECT_ID.
- بعد ذلك، عليك تفعيل الفوترة في Cloud Console من أجل استخدام موارد Google Cloud.
لن تكلفك تجربة هذا الدرس التطبيقي حول الترميز الكثير من المال، إن لم تكلفك شيئًا على الإطلاق. احرص على اتّباع أي تعليمات في قسم "التنظيف" الذي ينصحك بكيفية إيقاف الموارد حتى لا تتحمّل رسومًا تتجاوز هذا البرنامج التعليمي. يمكن لمستخدمي Google Cloud الجدد الاستفادة من برنامج الفترة التجريبية المجانية بقيمة 300 دولار أمريكي.
Google Cloud Shell
على الرغم من إمكانية تشغيل خدمات Google Cloud عن بُعد من الكمبيوتر المحمول، سنستخدم في هذا الدرس التطبيقي حول الترميز Google Cloud Shell، وهي بيئة سطر أوامر تعمل في السحابة الإلكترونية.
تفعيل Cloud Shell
- من Cloud Console، انقر على تفعيل Cloud Shell
.
إذا لم يسبق لك بدء Cloud Shell، ستظهر لك شاشة وسيطة (الجزء السفلي غير المرئي من الصفحة) توضّح ماهيته. في هذه الحالة، انقر على متابعة (ولن تظهر لك مرة أخرى). في ما يلي الشكل الذي ستظهر به هذه الشاشة لمرة واحدة:
يستغرق توفير Cloud Shell والاتصال به بضع لحظات فقط.
يتم تحميل هذه الآلة الافتراضية مزوّدة بكل أدوات التطوير التي ستحتاج إليها. توفّر هذه الخدمة دليلًا رئيسيًا دائمًا بسعة 5 غيغابايت وتعمل في Google Cloud، ما يؤدي إلى تحسين أداء الشبكة والمصادقة بشكل كبير. يمكن إنجاز معظم العمل في هذا الدرس التطبيقي حول الترميز، إن لم يكن كله، باستخدام متصفّح أو جهاز Chromebook فقط.
بعد الاتصال بـ Cloud Shell، من المفترض أن يظهر لك أنّه تم إثبات هويتك وأنّه تم ضبط المشروع على رقم تعريف مشروعك.
- نفِّذ الأمر التالي في 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
بعد بدء تشغيل التطبيق، انقر على رمز "معاينة الويب"
في شريط أدوات Cloud Shell واختَر المعاينة على المنفذ 8080.
بعد فترة قصيرة، من المفترض أن تظهر لك النتيجة:

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
بعد بدء تشغيل التطبيق، انقر على رمز "معاينة الويب"
في شريط أدوات Cloud Shell واختَر المعاينة على المنفذ 8080.
بعد فترة قصيرة، من المفترض أن تظهر لك النتيجة:

يمكنك أيضًا ربط القيمة بسمة في 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=-
أعِد تشغيل التطبيق، وسيتم عرض الإصدار الجديد من السر.

توسيع نطاق هذا المفهوم
تكون هذه الطريقة مفيدة بشكل خاص إذا كنت تستخدم ملفات تعريف مختلفة لتطبيق 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.
بعد فترة قصيرة، من المفترض أن تظهر لك النتيجة:

6. ملخّص
في هذا الدرس التطبيقي، أنشأت خدمة يمكن ضبطها باستخدام أسرار مخزّنة في Secret Manager من خلال استخدام أسماء خصائص Spring التي تبدأ بالبادئة sm:// وإدخال القيمة من ملف applications.properties والتعليقات التوضيحية @Value.
7. تهانينا!
تعرّفت على كيفية استخدام Secret Manager API في Java.
مزيد من المعلومات
- مشروع Spring on GCP: http://cloud.spring.io/spring-cloud-gcp/
- مستودع Spring on GCP GitHub: https://github.com/GoogleCloudPlatform/spring-cloud-gcp
- Java على Google Cloud: https://cloud.google.com/java/
- التحكّم في الوصول إلى المفاتيح السرّية في Secret Manager: https://cloud.google.com/secret-manager/docs/access-control
- تسجيل التدقيق في Secret Manager: https://cloud.google.com/secret-manager/docs/audit-logging
الترخيص
يخضع هذا العمل لترخيص المشاع الإبداعي مع نسب العمل إلى مؤلفه 2.0 Generic License.