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. הגדרה ודרישות
הגדרת סביבה בקצב עצמאי
- נכנסים למסוף Cloud ויוצרים פרויקט חדש או עושים שימוש חוזר בפרויקט קיים. (אם עדיין אין לכם חשבון Gmail או G Suite, עליכם ליצור חשבון).
חשוב לזכור את מזהה הפרויקט, שם ייחודי לכל הפרויקטים ב-Google Cloud (השם שלמעלה כבר תפוס ולא מתאים לכם, סליחה). בהמשך ב-Codelab הזה, היא תיקרא PROJECT_ID
.
- בשלב הבא צריך להפעיל את החיוב במסוף Cloud כדי להשתמש במשאבים של Google Cloud.
מעבר ב-Codelab הזה לא אמור לעלות הרבה, אם בכלל. חשוב לבצע את כל ההוראות בקטע 'ניקוי' שמסביר איך להשבית משאבים כדי שלא תצברו חיובים מעבר למדריך הזה. משתמשים חדשים ב-Google Cloud זכאים להשתתף בתוכנית תקופת ניסיון בחינם בשווי 1,200 ש"ח.
Google Cloud Shell
אומנם אפשר להפעיל את שירותי Google Cloud מרחוק מהמחשב הנייד, אבל ב-Codelab הזה נשתמש ב-Google Cloud Shell, סביבת שורת הפקודה שפועלת ב-Cloud.
הפעלת Cloud Shell
- במסוף Cloud, לוחצים על Activate 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. יצירה של שירות 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 בסרגל הכלים של 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
אחרי שהאפליקציה מתחילה, לוחצים על הסמל של Web Preview בסרגל הכלים של 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
אחרי שהאפליקציה מתחילה, לוחצים על הסמל של Web Preview בסרגל הכלים של Cloud Shell ובוחרים באפשרות תצוגה מקדימה ביציאה 8080.
עדכון ערך הסוד
אם משתמשים בתחביר הקצר sm://greeting
, משתמשים אוטומטית בגרסה האחרונה של הסוד. כשיוצרים גרסה חדשה של הסוד, אפשר לעדכן את האפליקציה בלי לשנות את הקוד.
מעדכנים את ערך ה-Secret על ידי הוספת גרסה חדשה:
$ 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
אחרי שהאפליקציה מתחילה, לוחצים על הסמל של Web Preview בסרגל הכלים של Cloud Shell ובוחרים באפשרות תצוגה מקדימה ביציאה 8080.
לאחר המתנה קצרה אמורה להופיע התוצאה:
6. סיכום
בשיעור ה-Lab הזה יצרתם שירות שאפשר להגדיר באמצעות סודות שמאוחסנים ב-Secret Manager על ידי שימוש בשמות מאפיינים של Spring עם התחילית sm://
והחדרת הערך מקובץ applications.properties
ומהערות @Value
.
7. מעולה!
למדתם איך להשתמש ב-Secret Manager API ב-Java.
מידע נוסף
- פרויקט לאביב ב-GCP: http://cloud.spring.io/spring-cloud-gcp/
- אביב במאגר GitHub של 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 Attribution 2.0 גנרי.