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

۱. مرور کلی

اطلاعات محرمانه‌ای مانند رمزهای عبور، کلیدهای 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 چگونه ارزیابی می‌کنید؟

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

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

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

۲. تنظیمات و الزامات

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

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

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aTQz5GpG0T

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5 OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

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

  1. در مرحله بعد، برای استفاده از منابع گوگل کلود، باید پرداخت را در Cloud Console فعال کنید .

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

پوسته ابری گوگل

اگرچه سرویس‌های گوگل کلود را می‌توان از راه دور و از طریق لپ‌تاپ خود مدیریت کرد، اما در این آزمایشگاه کد، ما از گوگل کلود شل ، یک محیط خط فرمان که در فضای ابری اجرا می‌شود، استفاده خواهیم کرد.

فعال کردن پوسته ابری

  1. از کنسول ابری، روی فعال کردن پوسته ابری کلیک کنید 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

این ماشین مجازی با تمام ابزارهای توسعه‌ای که نیاز دارید، مجهز شده است. این ماشین یک دایرکتوری خانگی ۵ گیگابایتی پایدار ارائه می‌دهد و در فضای ابری گوگل اجرا می‌شود که عملکرد شبکه و احراز هویت را تا حد زیادی بهبود می‌بخشد. بخش عمده‌ای از کار شما در این آزمایشگاه کد، اگر نگوییم همه، را می‌توان به سادگی با یک مرورگر یا کروم‌بوک انجام داد.

پس از اتصال به 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].

۳. پیکربندی یک راز

برای استفاده از 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

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

پس از کمی انتظار، نتیجه را خواهید دید:

۱e9a7884ff113c14.png

۵. یک راز را بازیابی کنید

شما می‌توانید از حاشیه‌نویسی @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

پس از شروع برنامه، روی نماد پیش‌نمایش وب کلیک کنید e18df08334f0d809.png در نوار ابزار 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=-

برنامه را مجدداً راه اندازی کنید و ببینید که نسخه جدید رمز برگردانده می‌شود.

تصویر برنامه در حال اجرا، که عبارت «Greeings World!» را نشان می‌دهد.

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

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

پس از کمی انتظار، نتیجه را خواهید دید:

تصویر برنامه در حال اجرا، که عبارت «Hola World!» را نشان می‌دهد.

۶. خلاصه

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

۷. تبریک می‌گویم!

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

اطلاعات بیشتر

مجوز

این اثر تحت مجوز عمومی Creative Commons Attribution 2.0 منتشر شده است.