۱. مرور کلی
اطلاعات محرمانهای مانند رمزهای عبور، کلیدهای API، اطلاعات حساسی هستند که باید در یک فضای ذخیرهسازی امن، رمزگذاریشده، با دسترسی کنترلشده و قابل حسابرسی ذخیره شوند. برخی از سیستمها از Vault برای ذخیره این اطلاعات محرمانه استفاده میکنند. در Google Cloud، میتوانید از Secret Manager، یک سرویس مدیریتشده، برای ذخیره ایمن اطلاعات محرمانه استفاده کنید و با استفاده از IAM دسترسی به اطلاعات محرمانه شخصی را کنترل کنید.
در Spring Boot، میتوانید با استفاده از Spring Cloud GCP و با ارجاع به این اسرار مانند سایر ویژگیهای Spring، به راحتی به آنها دسترسی پیدا کنید.
در این آزمایشگاه کد، شما یک راز را در Secret Manager ذخیره خواهید کرد، سپس میکروسرویسهای ساده Spring Boot را میسازید و راز را بازیابی میکنید.
آنچه یاد خواهید گرفت
- نحوه ایجاد یک برنامه جاوا Spring Boot و پیکربندی Secret Manager.
آنچه نیاز دارید
- یک پروژه ابری گوگل
- یک مرورگر، مانند کروم یا فایرفاکس
- آشنایی با ویرایشگرهای متن استاندارد لینوکس مانند Vim، EMACs یا Nano
چگونه از این آموزش استفاده خواهید کرد؟
تجربه خود را در ساخت برنامههای وب HTML/CSS چگونه ارزیابی میکنید؟
تجربه خود را در استفاده از خدمات ابری گوگل چگونه ارزیابی میکنید؟
۲. تنظیمات و الزامات
تنظیم محیط خودتنظیم
- وارد Cloud Console شوید و یک پروژه جدید ایجاد کنید یا از یک پروژه موجود دوباره استفاده کنید. (اگر از قبل حساب Gmail یا G Suite ندارید، باید یکی ایجاد کنید .)
شناسه پروژه را به خاطر بسپارید، یک نام منحصر به فرد در تمام پروژههای Google Cloud (نام بالا قبلاً گرفته شده و برای شما کار نخواهد کرد، متاسفیم!). بعداً در این آزمایشگاه کد به آن PROJECT_ID گفته خواهد شد.
- در مرحله بعد، برای استفاده از منابع گوگل کلود، باید پرداخت را در Cloud Console فعال کنید .
اجرای این آزمایشگاه کد، اگر اصلاً هزینهای نداشته باشد، نباید هزینه زیادی داشته باشد. حتماً دستورالعملهای بخش «پاکسازی» را که به شما نحوه خاموش کردن منابع را آموزش میدهد، دنبال کنید تا پس از این آموزش، متحمل هزینه نشوید. کاربران جدید Google Cloud واجد شرایط برنامه آزمایشی رایگان ۳۰۰ دلاری هستند.
پوسته ابری گوگل
اگرچه سرویسهای گوگل کلود را میتوان از راه دور و از طریق لپتاپ خود مدیریت کرد، اما در این آزمایشگاه کد، ما از گوگل کلود شل ، یک محیط خط فرمان که در فضای ابری اجرا میشود، استفاده خواهیم کرد.
فعال کردن پوسته ابری
- از کنسول ابری، روی فعال کردن پوسته ابری کلیک کنید
.
اگر قبلاً Cloud Shell را شروع نکردهاید، یک صفحه میانی (در زیر صفحه) به شما نمایش داده میشود که توضیح میدهد چیست. در این صورت، روی ادامه کلیک کنید (و دیگر هرگز آن را نخواهید دید). آن صفحه یکبار مصرف به این شکل است:
آمادهسازی و اتصال به Cloud Shell فقط چند لحظه طول میکشد.
این ماشین مجازی با تمام ابزارهای توسعهای که نیاز دارید، مجهز شده است. این ماشین یک دایرکتوری خانگی ۵ گیگابایتی پایدار ارائه میدهد و در فضای ابری گوگل اجرا میشود که عملکرد شبکه و احراز هویت را تا حد زیادی بهبود میبخشد. بخش عمدهای از کار شما در این آزمایشگاه کد، اگر نگوییم همه، را میتوان به سادگی با یک مرورگر یا کرومبوک انجام داد.
پس از اتصال به 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].
۳. پیکربندی یک راز
برای استفاده از Secret Manager، ابتدا API را فعال کنید:
$ gcloud services enable secretmanager.googleapis.com
سپس، یک فایل مخفی به نام greeting با مقدار Hello ایجاد کنید:
$ echo -n "Hello" | \ gcloud secrets create greeting \ --data-file=-
این دستور از STDIN برای ارائه مقدار به خط فرمان استفاده میکند. با این حال، میتوانید به سادگی مقدار مخفی را در یک فایل قرار دهید، و نام فایل را برای آرگومان --data-file مشخص کنید.
شما میتوانید با استفاده از رابط خط فرمان gcloud، تمام اسرار را فهرست کنید:
$ gcloud secrets list
۴. یک سرویس Spring Boot REST جدید ایجاد کنید
پس از راهاندازی 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 را پیکربندی میکند، به طوری که میتوانید با استفاده از یک مقدار ویژگی، با پیشوند 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 و پیشنمایش روی پورت ۸۰۸۰ را انتخاب کنید.
پس از کمی انتظار، نتیجه را خواهید دید:

۵. یک راز را بازیابی کنید
شما میتوانید از حاشیهنویسی @Value برای ارجاع به ویژگی مخفی با استفاده از پیشوند sm:// استفاده کنید.
در کلاس HelloSecretController، مقدار greeting را با استفاده از annotation تزریق کنید:
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 و پیشنمایش روی پورت ۸۰۸۰ را انتخاب کنید.
پس از کمی انتظار، نتیجه را خواهید دید:

همچنین میتوانید مقدار را به یک ویژگی در 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 و پیشنمایش روی پورت ۸۰۸۰ را انتخاب کنید.
بهروزرسانی مقدار مخفی
با استفاده از سینتکس کوتاه sm://greeting ، شما به طور خودکار از آخرین نسخه راز استفاده میکنید. با ایجاد یک نسخه جدید از راز، میتوانید برنامه خود را بدون تغییر کد بهروزرسانی کنید.
با افزودن یک نسخه جدید، مقدار راز را بهروزرسانی کنید:
$ echo -n "Greetings" | gcloud secrets versions add greeting \ --data-file=-
برنامه را مجدداً راه اندازی کنید و ببینید که نسخه جدید رمز برگردانده میشود.

گسترش این مفهوم
این تکنیک به خصوص اگر از پروفایلهای مختلف برنامه Spring Boot استفاده میکنید، مفید است. برای مثال، میتوانید رمزهایی مانند greeting-dev ، greeting-staging ، greeting-prod ایجاد کنید. و در هر پروفایل، greetings را به پروفایلهای مناسب نگاشت کنید.
یک راز 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 و پیشنمایش روی پورت ۸۰۸۰ را انتخاب کنید.
پس از کمی انتظار، نتیجه را خواهید دید:

۶. خلاصه
در این آزمایش، شما سرویسی ایجاد کردهاید که میتواند با استفاده از اسرار ذخیره شده در Secret Manager و با استفاده از نامهای ویژگی Spring که با پیشوند sm:// شروع میشوند و تزریق مقدار از فایل applications.properties و حاشیهنویسیهای @Value پیکربندی شود.
۷. تبریک میگویم!
شما یاد گرفتید که چگونه از API مدیریت مخفی در جاوا استفاده کنید.
اطلاعات بیشتر
- پروژه اسپرینگ روی GCP: http://cloud.spring.io/spring-cloud-gcp/
- مخزن گیتهاب اسپرینگ روی GCP: https://github.com/GoogleCloudPlatform/spring-cloud-gcp
- جاوا در گوگل کلود: https://cloud.google.com/java/
- کنترل دسترسی به اطلاعات محرمانه در Secret Manager: https://cloud.google.com/secret-manager/docs/access-control
- ورود به سیستم حسابرسی در مدیر مخفی: https://cloud.google.com/secret-manager/docs/audit-logging
مجوز
این اثر تحت مجوز عمومی Creative Commons Attribution 2.0 منتشر شده است.