بازیابی اعتبار / اسرار از Secret Manager با Spring Boot

1. بررسی اجمالی

رازهایی مانند رمز عبور، کلیدهای API، اطلاعات حساسی هستند که باید در یک فضای ذخیره‌سازی امن، رمزگذاری‌شده، دسترسی کنترل‌شده و قابل بازرسی ذخیره شوند. برخی از سیستم ها ترجیح می دهند از Vault برای ذخیره این اسرار استفاده کنند. در Google Cloud، می‌توانید از Secret Manager، یک سرویس مدیریت‌شده، برای ذخیره امن اسرار و کنترل دسترسی به اسرار فردی با استفاده از IAM استفاده کنید.

در Spring Boot، می‌توانید از Spring Cloud GCP برای دسترسی آسان به این اسرار با ارجاع به آنها به عنوان سایر ویژگی‌های Spring استفاده کنید.

در این کد، شما یک راز را در Secret Manager ذخیره می‌کنید، سپس میکروسرویس‌های ساده Spring Boot را می‌سازید و راز را بازیابی می‌کنید.

چیزی که یاد خواهید گرفت

  • نحوه ایجاد یک برنامه Java Boot Spring و پیکربندی Secret Manager.

آنچه شما نیاز دارید

  • یک پروژه Google Cloud
  • یک مرورگر، مانند کروم یا فایرفاکس
  • آشنایی با ویرایشگرهای متن استاندارد لینوکس مانند Vim، EMACs یا Nano

چگونه از این آموزش استفاده خواهید کرد؟

فقط از طریق آن را بخوانید آن را بخوانید و تمرینات را کامل کنید

تجربه خود را با ساختن برنامه های وب HTML/CSS چگونه ارزیابی می کنید؟

تازه کار متوسط مسلط

تجربه خود را در استفاده از خدمات Google Cloud چگونه ارزیابی می کنید؟

تازه کار متوسط مسلط

2. راه اندازی و الزامات

تنظیم محیط خود به خود

  1. به کنسول Cloud وارد شوید و یک پروژه جدید ایجاد کنید یا از یک موجود استفاده مجدد کنید. (اگر قبلاً یک حساب Gmail یا G Suite ندارید، باید یک حساب ایجاد کنید .)

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJHHXieCvXw5 Zw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aTQz5GpG0T

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3UUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3UUUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3UUUO1A8CXUF

شناسه پروژه را به خاطر بسپارید، یک نام منحصر به فرد در تمام پروژه های Google Cloud (نام بالا قبلاً گرفته شده است و برای شما کار نخواهد کرد، متأسفیم!). بعداً در این آزمایشگاه کد به عنوان PROJECT_ID نامیده خواهد شد.

  1. در مرحله بعد، برای استفاده از منابع Google Cloud، باید صورت‌حساب را در Cloud Console فعال کنید .

اجرا کردن از طریق این کد لبه نباید هزینه زیادی داشته باشد، اگر اصلاً باشد. حتماً دستورالعمل‌های موجود در بخش «تمیز کردن» را دنبال کنید که به شما توصیه می‌کند چگونه منابع را خاموش کنید تا بیش از این آموزش متحمل صورت‌حساب نشوید. کاربران جدید Google Cloud واجد شرایط برنامه آزمایشی رایگان 300 دلاری هستند.

Google Cloud Shell

در حالی که خدمات Google Cloud را می توان از راه دور از لپ تاپ شما اداره کرد، در این کد لبه از Google Cloud Shell استفاده خواهیم کرد، یک محیط خط فرمان که در Cloud اجرا می شود.

Cloud Shell را فعال کنید

  1. از Cloud Console، روی Activate Cloud Shell کلیک کنید H7JlbhKGHITmsxhQIcLwoe5HXZMhDlYue4K-SPszMxUxDjIeWfOHBfxDHYpmLQTzUmQ7Xx8o6OJUlANnQF0iBuUyfp1RzVad_4nCa0ZlWzVDLWD2Ca0ZlUZRWLXT دی کیو .

zlNW0HehB_AFW1qZ4AyebSQUdWm95n7TbnOr7UVm3j9dFcg6oWApJRlC0jnU1Mvb-IQp-trP1Px8xKNwt6o3pP6fyih947sEhOFI4ZIRF6HQWQ2 rbzQ

اگر قبلاً Cloud Shell را راه‌اندازی نکرده‌اید، با یک صفحه میانی (زیر تاشو) روبرو می‌شوید که آن را توصیف می‌کند. اگر اینطور است، روی Continue کلیک کنید (و دیگر آن را نخواهید دید). در اینجا به نظر می رسد که آن صفحه یک بار مصرف:

kEPbNAo_w5C_pi9QvhFwWwky1cX8hr_xEMGWySNIoMCdi-Djx9AQRqWn-__DmEpC7vKgUtl-feTcv-wBxJ8NwzzAp7mY65-fi2LJo4tw1Uo6VRh1

تهیه و اتصال به Cloud Shell فقط باید چند لحظه طول بکشد.

pTv5mEKzWMWp5VBrg2eGcuRPv9dLInPToS-mohlrqDASyYGWnZ_SwE-MzOWHe76ZdCSmw0kgWogSJv27lrQE8pvA5OD6P1I47nz8vrAdK7PyGWnZ_SwE-MzOWHe76ZdCSmw0kgWogSJv27lrQE8pvA5OD6P1I47nz8vrAdK7PyGWnZ_SwE-MzOWHe76ZdCSmw0kgWogSJv27lrQE8pvA5OD6P1I47nz8vrAdK7PyRvcD

این ماشین مجازی با تمام ابزارهای توسعه که شما نیاز دارید بارگذاری شده است. این دایرکتوری اصلی 5 گیگابایتی دائمی را ارائه می دهد و در Google Cloud اجرا می شود و عملکرد شبکه و احراز هویت را بسیار افزایش می دهد. بیشتر، اگر نه همه، کار شما در این کد لبه را می توان به سادگی با یک مرورگر یا Chromebook انجام داد.

پس از اتصال به Cloud Shell، باید ببینید که قبلاً احراز هویت شده اید و پروژه قبلاً روی ID پروژه شما تنظیم شده است.

  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، ابتدا API را فعال کنید:

$ 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. یک سرویس 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

پس از شروع برنامه، روی نماد Web Preview کلیک کنید 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

پس از شروع برنامه، روی نماد Web Preview کلیک کنید e18df08334f0d809.png در نوار ابزار Cloud Shell و پیش نمایش در پورت 8080 را انتخاب کنید.

پس از مدت کوتاهی باید نتیجه را مشاهده کنید:

اسکرین شات از برنامه در حال اجرا، با نشان دادن "Hello World!"

همچنین می توانید مقدار را به یک ویژگی در 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

پس از شروع برنامه، روی نماد Web Preview کلیک کنید نماد پیش نمایش وب در نوار ابزار Cloud Shell و پیش نمایش در پورت 8080 را انتخاب کنید.

به روز رسانی مقدار مخفی

با استفاده از نحو کوتاه sm://greeting ، به طور خودکار از آخرین نسخه Secret استفاده می کنید. با ایجاد یک نسخه جدید از Secret، می توانید برنامه خود را بدون تغییر کد خود به روز کنید.

با افزودن یک نسخه جدید، مقدار Secret را به روز کنید:

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

برنامه را مجددا راه اندازی کنید و ببینید نسخه جدید راز در حال بازگشت است.

اسکرین شات از برنامه در حال اجرا، نشان دهنده "Greeings World!"

گسترش این مفهوم

این تکنیک به خصوص اگر از پروفایل های مختلف برنامه 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

پس از شروع برنامه، روی نماد Web Preview کلیک کنید نماد پیش نمایش وب در نوار ابزار Cloud Shell و پیش نمایش در پورت 8080 را انتخاب کنید.

پس از مدت کوتاهی باید نتیجه را مشاهده کنید:

اسکرین شات از برنامه در حال اجرا، که "هولا ورلد!"

6. خلاصه

در این آزمایشگاه، سرویسی ایجاد کرده‌اید که می‌تواند با استفاده از اسرار ذخیره‌شده در Secret Manager با استفاده از نام ویژگی Spring با پیشوند sm:// و تزریق مقدار از فایل applications.properties و حاشیه‌نویسی @Value پیکربندی شود.

7. تبریک می گویم!

شما یاد گرفتید که چگونه از Secret Manager API در جاوا استفاده کنید.

بیشتر بدانید

مجوز

این اثر تحت مجوز Creative Commons Attribution 2.0 Generic مجوز دارد.