אחזור פרטי כניסה או סודות מ-Secret Manager באמצעות אתחול Spring

1. סקירה כללית

סודות כמו סיסמאות, מפתחות API הם מידע רגיש צריכים להיות מאוחסנים באחסון מאובטח ומוצפן, עם בקרת גישה שאפשר לבדוק. בחלק מהמערכות מומלץ להשתמש ב-Vault כדי לאחסן את הסודות האלה. ב-Google Cloud, אתם יכולים להשתמש ב-Secret Manager, שירות מנוהל, כדי לאחסן את הסודות בצורה מאובטחת ולשלוט בגישה לסודות ספציפיים באמצעות IAM.

ב-Springboot אפשר להשתמש ב-Spring Cloud GCP כדי לגשת בקלות לסודות האלה על ידי התייחסות אליהם כמו לכל נכס אחר ב-Spring.

ב-Codelab הזה, שומרים סוד ב-Secret Manager, ואז בונים מיקרו-שירותים (microservices) פשוטים ב-Spring Boot ומאחזרים את הסוד.

מה תלמדו

  • איך ליצור אפליקציית Spring Boot Java ולהגדיר את Secret Manager.

מה צריך להכין

  • פרויקט ב-Google Cloud
  • דפדפן, למשל Chrome או Firefox
  • היכרות עם עורכי טקסט סטנדרטיים של Linux, כגון Vim, EMAC או Nano

איך תשתמשו במדריך הזה?

לקריאה בלבד לקרוא אותו ולבצע את התרגילים

איזה דירוג מגיע לחוויה שלך עם בניית אפליקציות אינטרנט מסוג HTML/CSS?

מתחילים בינונית בקיאים

איזה דירוג מגיע לדעתך לחוויית השימוש שלך בשירותי Google Cloud?

מתחילים בינונית בקיאים

2. הגדרה ודרישות

הגדרת סביבה בקצב עצמאי

  1. נכנסים למסוף Cloud ויוצרים פרויקט חדש או עושים שימוש חוזר בפרויקט קיים. (אם עדיין אין לכם חשבון Gmail או G Suite, עליכם ליצור חשבון).

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQTan7F01iePL5DtqQ

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

חשוב לזכור את מזהה הפרויקט, שם ייחודי לכל הפרויקטים ב-Google Cloud (השם שלמעלה כבר תפוס ולא מתאים לכם, סליחה). בהמשך ב-Codelab הזה, היא תיקרא PROJECT_ID.

  1. בשלב הבא צריך להפעיל את החיוב במסוף Cloud כדי להשתמש במשאבים של Google Cloud.

מעבר ב-Codelab הזה לא אמור לעלות הרבה, אם בכלל. חשוב לבצע את כל ההוראות בקטע 'ניקוי' שמסביר איך להשבית משאבים כדי שלא תצברו חיובים מעבר למדריך הזה. משתמשים חדשים ב-Google Cloud זכאים להשתתף בתוכנית תקופת ניסיון בחינם בשווי 1,200 ש"ח.

Google Cloud Shell

אומנם אפשר להפעיל את שירותי Google Cloud מרחוק מהמחשב הנייד, אבל ב-Codelab הזה נשתמש ב-Google Cloud Shell, סביבת שורת הפקודה שפועלת ב-Cloud.

הפעלת Cloud Shell

  1. במסוף Cloud, לוחצים על Activate Cloud Shell H7JlbhKGHITmsxhQIcLwoe5HXZMhDlYue4K-SPszMxUxDjIeWfOHBfxDHYpmLQTzUmQ7Xx8o6OJUlANnQF0iBuUyfp1RWzVad_4nCwUyfp1RWzVad_4nCwlZUDZ5LtFCZUHBfxDHYpmLQTzUmQ7Xx8o6OJUlANnQF0iBuUyfp1RWzVad_4nCwZlZ5Lt.

zlNW0HehB_AFW1qZ4AyebSQUdWm95n7TbnOr7UVm3j9dFcg6oWApJRlC0jnU1Mvb-IQp-trP1Px8xKNwt6o3pP6fyih947sEhOFI4IRF0W7WZk6hFqZDUGXQQXrw21GuMm2ecHrbzQ

אם זו הפעם הראשונה שאתם מפעילים את Cloud Shell, יוצג לכם מסך ביניים (בחלק הנגלל) שמתאר מהו. במקרה כזה, לוחצים על המשך (וזה לא יקרה שוב). כך נראה המסך החד-פעמי:

kEPbNAo_w5C_pi9QvhFwWwky1cX8hr_xEMGWySNIoMCdi-Djx9AQRqWn-__DmEpC7vKgUtl-feTcv-wBxJ8NwzzAp7mY65-fi2LJo4twUoewT1SUjd6Y3h81RG3rKIkqhoVlFR-G7w

ההקצאה וההתחברות ל-Cloud Shell נמשכת כמה דקות.

pTv5mEKzWMWp5VBrg2eGcuRPv9dLInPToS-mohlrqDASyYGWnZ_SwE-MzOWHe76ZdCSmw0kgWogSJv27lrQE8pvA5OD6P1I47nz8vrAdK7yR1NseZKJvcxAZrPb8wRxoqyTpD-gbhA

למכונה הווירטואלית הזו נטען כל כלי הפיתוח הדרושים. יש בה ספריית בית בנפח מתמיד של 5GB והיא פועלת ב-Google Cloud, מה שמשפר משמעותית את ביצועי הרשת והאימות. אם לא את כולן, ניתן לבצע חלק גדול מהעבודה ב-Codelab הזה באמצעות דפדפן או 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, צריך קודם להפעיל את ה-API:

$ gcloud services enable secretmanager.googleapis.com

לאחר מכן, יוצרים סוד בשם greeting, עם הערך Hello:

$ echo -n "Hello" | \
 gcloud secrets create greeting \
 --data-file=-

הפקודה הזו משתמשת ב-STDIN כדי לספק את הערך לשורת הפקודה. עם זאת, אפשר גם פשוט להוסיף את ערך הסוד לקובץ כדי לציין את שם הקובץ לארגומנט --data-file.

אפשר להציג את כל הסודות באמצעות ה-CLI של gcloud:

$ gcloud secrets list

4. יצירה של שירות Spring Boot REST חדש

אחרי ההשקה של Cloud Shell, תוכלו להשתמש בשורת הפקודה כדי ליצור אפליקציית Springboot חדשה עם 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 Cloud:

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/

נדלג על בדיקות לשיעור ה-Lab הזה ונתחיל את היישום:

$ ./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. נדלג על בדיקות בשיעור ה-Lab הזה:

$ ./mvnw -DskipTests spring-boot:run

אחרי שהאפליקציה מתחילה, לוחצים על הסמל של Web Preview e18df08334f0d809.pngבסרגל הכלים של Cloud Shell ובוחרים באפשרות תצוגה מקדימה ביציאה 8080.

לאחר המתנה קצרה אמורה להופיע התוצאה:

צילום מסך של האפליקציה שפועלת, עם הכיתוב &#39;Hello World! &#39;

אפשר גם למפות את הערך לנכס ב-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. נדלג על בדיקות בשיעור ה-Lab הזה:

$ ./mvnw -DskipTests spring-boot:run

אחרי שהאפליקציה מתחילה, לוחצים על הסמל של Web Preview סמל של תצוגה מקדימה באינטרנטבסרגל הכלים של Cloud Shell ובוחרים באפשרות תצוגה מקדימה ביציאה 8080.

עדכון ערך הסוד

אם משתמשים בתחביר הקצר sm://greeting, משתמשים אוטומטית בגרסה האחרונה של הסוד. כשיוצרים גרסה חדשה של הסוד, אפשר לעדכן את האפליקציה בלי לשנות את הקוד.

מעדכנים את ערך ה-Secret על ידי הוספת גרסה חדשה:

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

מפעילים מחדש את האפליקציה ומוודאים שהגרסה החדשה של הסוד מוחזרת.

צילום מסך של האפליקציה שפועלת, שבו מוצג &#39;Greeings World! &#39;

הרחבת הקונספט הזה

הטכניקה הזו שימושית במיוחד אם אתם משתמשים בפרופילים שונים של אפליקציות מסוג 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. נדלג על בדיקות בשיעור ה-Lab הזה:

$ ./mvnw -DskipTests spring-boot:run -Dspring-boot.run.profiles=prod

אחרי שהאפליקציה מתחילה, לוחצים על הסמל של Web Preview סמל של תצוגה מקדימה באינטרנטבסרגל הכלים של Cloud Shell ובוחרים באפשרות תצוגה מקדימה ביציאה 8080.

לאחר המתנה קצרה אמורה להופיע התוצאה:

צילום מסך של האפליקציה שפועלת, שבו מוצג &#39;Hola World! &#39;

6. סיכום

בשיעור ה-Lab הזה יצרתם שירות שאפשר להגדיר באמצעות סודות שמאוחסנים ב-Secret Manager על ידי שימוש בשמות מאפיינים של Spring עם התחילית sm:// והחדרת הערך מקובץ applications.properties ומהערות @Value.

7. מעולה!

למדתם איך להשתמש ב-Secret Manager API ב-Java.

מידע נוסף

רישיון

היצירה הזו בשימוש ברישיון Creative Commons Attribution 2.0 גנרי.