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. הגדרה ודרישות
הגדרת סביבה בקצב אישי
- נכנסים אל Cloud Console ויוצרים פרויקט חדש או משתמשים בפרויקט קיים. (אם עדיין אין לכם חשבון Gmail או G Suite, אתם צריכים ליצור חשבון).
חשוב לזכור את מזהה הפרויקט, שהוא שם ייחודי בכל הפרויקטים ב-Google Cloud (השם שלמעלה כבר תפוס ולא יתאים לכם, מצטערים!). בהמשך ה-codelab הזה נתייחס אליו כאל PROJECT_ID.
- לאחר מכן, תצטרכו להפעיל את החיוב ב-Cloud Console כדי להשתמש במשאבים של Google Cloud.
העלות של התרגול הזה לא אמורה להיות גבוהה, ואולי אפילו לא תצטרכו לשלם בכלל. חשוב לפעול לפי ההוראות בקטע 'ניקוי' כדי להשבית את המשאבים, וכך לא תחויבו אחרי שתסיימו את המדריך הזה. משתמשים חדשים ב-Google Cloud זכאים לתוכנית תקופת ניסיון בחינם בשווי 300$.
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
לאחר מכן, יוצרים סוד בשם 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. נניח שרוצים לדלג על בדיקות במעבדה הזו:
$ ./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. נניח שרוצים לדלג על בדיקות במעבדה הזו:
$ ./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. נניח שרוצים לדלג על בדיקות במעבדה הזו:
$ ./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 כללי.