1. סקירה כללית
סודות כמו סיסמאות ומפתחות API הם מידע רגיש שצריך לאחסן במאגר מוצפן ומאובטח, עם בקרת גישה ועם אפשרות לביקורת. בחלק מהמערכות בוחרים להשתמש ב-Vault כדי לאחסן את הסודות האלה. ב-Google Cloud, אתם יכולים להשתמש ב-Secret Manager, שירות מנוהל, כדי לאחסן את הסודות בצורה מאובטחת ולשלוט בגישה לסודות נפרדים באמצעות IAM.
ב-Spring Boot, אפשר להשתמש ב-Spring Cloud GCP כדי לגשת בקלות לסודות האלה על ידי הפניה אליהם כמו לכל מאפיין אחר של Spring.
בשיעור ה-Codelab הזה תאחסנו סוד ב-Secret Manager, ואז תיצרו מיקרו-שירותים פשוטים של Spring Boot ותאחזרו את הסוד.
מה תלמדו
- איך יוצרים אפליקציית Spring Boot Java ומגדירים את Secret Manager.
מה תצטרכו
- פרויקט ב-Google Cloud
- דפדפן, כמו Chrome או Firefox
- היכרות עם כלים לעריכת טקסט של Linux, כמו Vim, EMACs או Nano
איך תשתמשו במדריך הזה?
מה מידת שביעות הרצון שלך מחוויית הפיתוח של אפליקציות אינטרנט ב-HTML/CSS?
איזה דירוג מתאים לדעתך לחוויית השימוש שלך בשירותי Google Cloud?
2. הגדרה ודרישות
הגדרת סביבה בקצב אישי
- נכנסים אל Cloud Console ויוצרים פרויקט חדש או משתמשים בפרויקט קיים. (אם עדיין אין לכם חשבון Gmail או G Suite, אתם צריכים ליצור חשבון).
חשוב לזכור את מזהה הפרויקט, שהוא שם ייחודי בכל הפרויקטים ב-Google Cloud (השם שלמעלה כבר תפוס ולא יתאים לכם, מצטערים!). בהמשך ה-codelab הזה נתייחס אליו כאל PROJECT_ID.
- לאחר מכן, תצטרכו להפעיל את החיוב ב-Cloud Console כדי להשתמש במשאבים של Google Cloud.
העלות של התרגול הזה לא אמורה להיות גבוהה, ואולי לא תהיה עלות בכלל. חשוב לפעול לפי ההוראות בקטע 'ניקוי' שבו מוסבר איך להשבית משאבים כדי שלא תחויבו אחרי שתסיימו את המדריך הזה. משתמשים חדשים ב-Google Cloud זכאים לתוכנית תקופת ניסיון בחינם בשווי 300 USD.
Google Cloud Shell
אפשר להפעיל שירותי Google Cloud מרחוק מהמחשב הנייד, אבל בשיעור Codelab הזה נשתמש ב-Google Cloud Shell, סביבת שורת פקודה שפועלת בענן.
הפעלת Cloud Shell
- ב-Cloud Console, לוחצים על Activate Cloud Shell
.
אם זו הפעם הראשונה שאתם מפעילים את Cloud Shell, יוצג לכם מסך ביניים (מתחת לקו הקיפול) עם תיאור של Cloud Shell. במקרה כזה, לוחצים על המשך (והמסך הזה לא יוצג לכם יותר). כך נראה המסך החד-פעמי:
יחלפו כמה רגעים עד שההקצאה והחיבור ל-Cloud Shell יושלמו.
המכונה הווירטואלית הזו כוללת את כל הכלים שדרושים למפתחים. יש בה ספריית בית בנפח מתמיד של 5GB והיא פועלת ב-Google Cloud, מה שמשפר מאוד את הביצועים והאימות של הרשת. אפשר לבצע את רוב העבודה ב-codelab הזה, אם לא את כולה, באמצעות דפדפן או Chromebook.
אחרי שמתחברים ל-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].
3. הגדרת סוד
כדי להשתמש ב-Secret Manager, קודם צריך להפעיל את ה-API:
$ gcloud services enable secretmanager.googleapis.com
לאחר מכן, יוצרים Secret בשם 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
אחרי שהאפליקציה מופעלת, לוחצים על סמל התצוגה המקדימה של האינטרנט
בסרגל הכלים של Cloud Shell ובוחרים באפשרות תצוגה מקדימה ביציאה 8080.
אחרי המתנה קצרה, התוצאה אמורה להופיע:

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

אפשר גם למפות את הערך למאפיין ב-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
אחרי שהאפליקציה מופעלת, לוחצים על סמל התצוגה המקדימה של האינטרנט
בסרגל הכלים של Cloud Shell ובוחרים באפשרות תצוגה מקדימה ביציאה 8080.
עדכון ערך הסוד
כשמשתמשים בתחביר המקוצר sm://greeting, המערכת משתמשת אוטומטית בגרסה האחרונה של הסוד. כשיוצרים גרסה חדשה של הסוד, אפשר לעדכן את האפליקציה בלי לשנות את הקוד.
מעדכנים את ערך הסוד על ידי הוספת גרסה חדשה:
$ echo -n "Greetings" | gcloud secrets versions add greeting \ --data-file=-
מפעילים מחדש את האפליקציה ורואים שהגרסה החדשה של הסוד מוחזרת.

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

6. סיכום
בשיעור ה-Lab הזה יצרתם שירות שאפשר להגדיר באמצעות סודות שמאוחסנים ב-Secret Manager, באמצעות שמות המאפיינים של Spring עם הקידומת sm:// והזרקת הערך מהקובץ applications.properties וההערות @Value.
7. מעולה!
למדתם איך להשתמש ב-Secret Manager API ב-Java.
מידע נוסף
- פרויקט Spring ב-GCP: http://cloud.spring.io/spring-cloud-gcp/
- מאגר GitHub של Spring ב-GCP: https://github.com/GoogleCloudPlatform/spring-cloud-gcp
- Java ב-Google Cloud: https://cloud.google.com/java/
- שליטה בגישה לסודות ב-Secret Manager: https://cloud.google.com/secret-manager/docs/access-control
- יומן ביקורת ב-Secret Manager: https://cloud.google.com/secret-manager/docs/audit-logging
רישיון
העבודה הזו בשימוש במסגרת רישיון Creative Commons שמותנה בייחוס כללי מגרסה 2.0.