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

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

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

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

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

מה תלמדו

  • איך יוצרים אפליקציית Java ב-Spring Boot ומגדירים את Secret Manager.

מה תצטרכו

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

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

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

מה מידת שביעות הרצון שלך מחוויית השימוש ב-HTML/CSS ליצירת אפליקציות אינטרנט?

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

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

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

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

הגדרת סביבה בקצב אישי

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

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQTan7F01iePL5DtqQ

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

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

  1. לאחר מכן, תצטרכו להפעיל את החיוב ב-Cloud Console כדי להשתמש במשאבים של Google Cloud.

העלות של התרגול הזה לא אמורה להיות גבוהה, ואולי אפילו לא תצטרכו לשלם בכלל. חשוב לפעול לפי ההוראות בקטע 'ניקוי' כדי להשבית את המשאבים, וכך לא תחויבו אחרי שתסיימו את המדריך הזה. משתמשים חדשים ב-Google Cloud זכאים לתוכנית תקופת ניסיון בחינם בשווי 300$.

Google Cloud Shell

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

הפעלת Cloud Shell

  1. ב-Cloud Console, לוחצים על Activate Cloud Shell H7JlbhKGHITmsxhQIcLwoe5HXZMhDlYue4K-SPszMxUxDjIeWfOHBfxDHYpmLQTzUmQ7Xx8o6OJUlANnQF0iBuUyfp1RzVad_4nCa0Zz5LtwBlUZFXFCWFrmrWZLqg1MkZz2LdgUDQ.

zlNW0HehB_AFW1qZ4AyebSQUdWm95n7TbnOr7UVm3j9dFcg6oWApJRlC0jnU1Mvb-IQp-trP1Px8xKNwt6o3pP6fyih947sEhOFI4IRF0W7WZk6hFqZDUGXQQXrw21GuMm2ecHrbzQ

אם זו הפעם הראשונה שאתם מפעילים את Cloud Shell, יוצג לכם מסך ביניים (בחלק הנגלל) עם תיאור של 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. יצירת שירות 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, כך שתוכלו להפנות לסודות באמצעות ערך מאפיין, עם הקידומת 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

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

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

$ ./mvnw -DskipTests spring-boot:run

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

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

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

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

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

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

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

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

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

6. סיכום

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

7. מעולה!

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

מידע נוסף

רישיון

עבודה זו מורשית תחת רישיון Creative Commons שמותנה בייחוס 2.0 כללי.