בדף הזה מוסבר איך להגדיר התראות על אירועים בסודות שלכם ב-Secret Manager ואיך להשתמש בהן.
סקירה כללית
Secret Manager משתלב עם Pub/Sub כדי לספק התראות על אירועים שקשורים לשינויים בסודות ובגרסאות של סודות. אפשר להשתמש בהתראות האלה כדי להפעיל תהליכי עבודה, כמו הפעלה מחדש של אפליקציה כשמוסיפים גרסה חדשה של סוד, או שליחת התראה למהנדסי אבטחה כשסוד נמחק. במסמכי העזרה של Pub/Sub יש מידע נוסף על השימוש בהתראות האלה כדי להתחיל תהליכי עבודה.
איך פועלות התראות על אירועים ב-Secret Manager
אפשר להגדיר סודות עם רשימה של עד 10 נושאי Pub/Sub. בכל פעם שמבצעים פעולה שמשנה את הסוד או אחת מהגרסאות שלו, Secret Manager מפרסם באופן אוטומטי הודעה בכל אחד מנושאי ה-Pub/Sub שקשורים לסוד הזה.
הקריאות Get, List ו-Access לא גורמות לפרסום הודעות.
להודעות Pub/Sub יש קבוצה של צמדי מפתח-ערך של מאפיינים שמכילים מטא-נתונים על האירוע, וגם שדה data שמכיל סריאליזציה מלאה ב-JSON של משאב Secret או SecretVersion שנוצר או שונה. קובץ ה-JSON הוא מחרוזת בקידוד UTF-8 שמייצגת את המשאב Secret או SecretVersion בדיוק בפורמט שצוין ב-API הציבורי של Secret Manager, בקידוד JSON כמו שצוין במיפוי JSON של proto3.
סוגי אירועים
אלה סוגי האירועים שנתמכים ב-Secret Manager.
| סוג אירוע | תיאור |
|---|---|
SECRET_CREATE |
מתרחש כשנוצר סוד חדש. |
SECRET_UPDATE |
מתרחש כשסוד חדש מתעדכן בהצלחה. |
SECRET_DELETE |
האירוע נשלח כשסוד נמחק, בגלל בקשה של משתמש או בגלל תפוגה של הסוד. |
SECRET_VERSION_ADD |
מתרחש כשמוסיפים בהצלחה גרסה חדשה של סוד. |
SECRET_VERSION_ENABLE |
מתרחש כשגרסת סוד מופעלת. |
SECRET_VERSION_DISABLE |
מתרחש כשגרסה סודית מושבתת. |
SECRET_VERSION_DESTROY |
מתרחש כשגרסה של סוד נהרסת. |
SECRET_VERSION_DESTROY_SCHEDULED |
האירוע נשלח כשמוגדר משך השהיה של השמדה בסוד והמשתמש מנסה להשמיד גרסה של סוד. |
SECRET_ROTATE |
מתרחש כשהגיע הזמן להחליף סוד. מידע נוסף זמין במאמר יצירת לוחות זמנים להחלפה. |
TOPIC_CONFIGURED |
זו הודעת בדיקה ללא גוף או מאפיינים מלבד אם הפעולה בוצעה בהצלחה, תישלח מיד הודעה מסוג בכל פעם שנושאים מתעדכנים בסוד, נשלחת הודעה |
פורמט ההתראות
ההתראות שנשלחות לנושא Pub/Sub כוללות שני חלקים:
-
מאפיינים: קבוצה של צמדי מפתח/ערך שמתארים את האירוע.
-
נתונים: מחרוזת שמכילה את המטא-נתונים של האובייקט שהשתנה.
מאפיינים
המאפיינים הם צמדי מפתח/ערך שכלולים בהתראות שנשלחות מ-Secret Manager לנושא Pub/Sub. כל ההתראות, למעט הודעות הבדיקה TOPIC_CONFIGURED, תמיד מכילות את הקבוצה הבאה של צמדי מפתח/ערך, בלי קשר לנתוני ההתראה:
| דוגמה | תיאור | |
|---|---|---|
eventType |
SECRET_CREATE |
סוג האירוע שהתרחש. בקטע סוגי אירועים מופיעה רשימה של הערכים האפשריים. |
dataFormat |
JSON_API_V1 |
הפורמט של נתוני האובייקט. |
secretId |
projects/p/secrets/my-secret |
השם המלא של המשאב של הסוד שבו התרחש האירוע. |
timestamp |
2021-01-20T11:17:45.081104-08:00 |
השעה שבה האירוע התרחש. |
בנוסף, לפעמים ההתראות מכילות את הקבוצה הבאה של צמדי מפתח/ערך:
| דוגמה | תיאור | |
|---|---|---|
versionId |
projects/p/secrets/my-secret/versions/456 |
השם של גרסת הסוד שבה התרחש האירוע.
ההתראה הזו מופיעה רק בהתראות על אירועים מסוג |
deleteType |
REQUESTED |
האם המחיקה התבקשה על ידי משתמש (REQUESTED)
או שהיא בוצעה בגלל תפוגה של סוד (EXPIRATION). הפרמטר הזה מופיע רק בהתראות על אירועים מסוג SECRET_DELETE.
|
נתונים
שדה הנתונים הוא מחרוזת בקידוד UTF-8 שמכילה את המטא-נתונים של האובייקט שהשתנה. הנתונים הם סוד או גרסה של סוד.
בהתראות של SECRET_DELETE, המטא-נתונים שכלולים בשדה הנתונים מייצגים את המטא-נתונים של האובייקט כפי שהיו לפני המחיקה. בכל ההתראות האחרות, המטא-נתונים שכלולים בשדה הנתונים מייצגים את המטא-נתונים של האובייקט אחרי ביצוע השינוי.
מגבלות
-
התראות על אירועים זמינות רק ב-API של Secret Manager v1 וב-Google Cloud CLI.
-
אי אפשר להשתמש באופן מהימן בהתראות על אירועים עם נושאי Pub/Sub שיש להם מדיניות אחסון הודעות שבה
enforceInTransitמוגדר כ-true.Secret Manager מפרסם את כל ההתראות על אירועים מנקודת קצה גלובלית. אם נושא Pub/Sub מוגדר עם
enforceInTransitכ-true, הוא מגביל את הפרסום לallowedPersistenceRegionsספציפיים. ההגבלה האזורית מתנגשת עם נקודת הקצה הגלובלית לפרסום ב-Secret Manager, ולכן בקשת הפרסום נכשלת עם השגיאהFAILED_PRECONDITION.
לפני שמתחילים
אתם יכולים לאחסן את כל המשאבים באותו פרויקט, או לאחסן סודות ונושאי Pub/Sub בפרויקטים נפרדים.
-
כדי להגדיר את Secret Manager, מבצעים את הפעולות הבאות:
-
יוצרים פרויקט או משתמשים בפרויקט קיים כדי לאחסן את המשאבים של Secret Manager.
-
אם צריך, משלימים את השלבים שמפורטים במאמר הפעלת Secret Manager API.
-
-
כדי להגדיר את Pub/Sub, מבצעים את הפעולות הבאות:
-
יוצרים פרויקט או משתמשים בפרויקט קיים כדי לאחסן את משאבי Pub/Sub.
-
במידת הצורך, מפעילים את Pub/Sub API.
-
-
מריצים את הפקודה הבאה כדי לבצע אימות ב- Google Cloud :
$ gcloud auth login --update-adc
יצירת זהות של סוכן שירות
כדי ליצור זהות של סוכן שירות לכל פרויקט שנדרשים בו סודות עם התראות על אירועים, מבצעים את השלבים הבאים:
-
כדי ליצור זהות שירות באמצעות Google Cloud CLI, מריצים את הפקודה הבאה:
$ gcloud beta services identity create \ --service "secretmanager.googleapis.com" \ --project "PROJECT_ID"
הפקודה הזו מחזירה את השם של חשבון השירות בפורמט הבא:
service-PROJECT_NUMBER@gcp-sa-secretmanager.iam.gserviceaccount.com -
נותנים לחשבון השירות הזה הרשאה לפרסם בנושאי Pub/Sub שהוגדרו בסודות.
-
שומרים את השם של חשבון השירות כמשתנה סביבה באמצעות הפקודה הבאה:
# This is from the output of the command above $ export SM_SERVICE_ACCOUNT="service-...."
משתני הסביבה של פרויקט Secret Manager, פרויקט Pub/Sub וחשבון השירות של Secret Manager צריכים להיות מוגדרים לאורך כל התהליך.
יצירת נושאים ב-Pub/Sub
פועלים לפי המדריך לתחילת העבודה עם Pub/Sub כדי ליצור נושאים בפרויקט Pub/Sub במסוף Google Cloud . אפשר גם ליצור נושאים ב-Google Cloud CLI באמצעות הפקודה הבאה:
gcloud
לפני השימוש בנתוני הפקודה הבאים, צריך להחליף את הנתונים הבאים:
- PUBSUB_PROJECT_ID: המזהה של הפרויקט שבו רוצים ליצור מינויים
- PUBSUB_TOPIC_NAME: השם של הנושא
מריצים את הפקודה הבאה:
Linux, macOS או Cloud Shell
gcloud pubsub topics create "projects/PUBSUB_PROJECT_ID/topics/PUBSUB_TOPIC_NAME"
Windows (PowerShell)
gcloud pubsub topics create "projects/PUBSUB_PROJECT_ID/topics/PUBSUB_TOPIC_NAME"
Windows (cmd.exe)
gcloud pubsub topics create "projects/PUBSUB_PROJECT_ID/topics/PUBSUB_TOPIC_NAME"
אם רוצים ליצור כמה נושאים ב-Pub/Sub בסוד, חוזרים על הפעולה הזו כמה פעמים.
מעניקים לחשבון השירות של Secret Manager הרשאה לפרסם בנושאים
אפשר להעניק הרשאות לחשבון השירות של Secret Manager דרך Google Cloud המסוף או דרך Google Cloud CLI.
כדי להעניק את התפקיד 'פרסום הודעות ב-Pub/Sub' (roles/pubsub.publisher) בנושא ב-Pub/Sub, משתמשים בפקודה הבאה:
gcloud
לפני השימוש בנתוני הפקודה הבאים, צריך להחליף את הנתונים הבאים:
- PUBSUB_TOPIC_NAME: השם של הנושא
מריצים את הפקודה הבאה:
Linux, macOS או Cloud Shell
gcloud pubsub topics add-iam-policy-binding PUBSUB_TOPIC_NAME \ --member "serviceAccount:${SM_SERVICE_ACCOUNT}" \ --role "roles/pubsub.publisher"
Windows (PowerShell)
gcloud pubsub topics add-iam-policy-binding PUBSUB_TOPIC_NAME ` --member "serviceAccount:${SM_SERVICE_ACCOUNT}" ` --role "roles/pubsub.publisher"
Windows (cmd.exe)
gcloud pubsub topics add-iam-policy-binding PUBSUB_TOPIC_NAME ^ --member "serviceAccount:${SM_SERVICE_ACCOUNT}" ^ --role "roles/pubsub.publisher"
יצירת מינויים ל-Pub/Sub
כדי לראות את ההודעות שפורסמו בנושא, צריך גם ליצור מינוי לנושא. כדי ליצור מינויים בפרויקט Pub/Sub במסוף Google Cloud , פועלים לפי ההוראות שבמדריך לתחילת העבודה עם Pub/Sub. אפשר גם ליצור נושאים ב-Google Cloud CLI באמצעות הפקודה הבאה:
gcloud
לפני השימוש בנתוני הפקודה הבאים, צריך להחליף את הנתונים הבאים:
- PUBSUB_PROJECT_ID: המזהה של הפרויקט שבו רוצים ליצור מינויים
- PUBSUB_SUBSCRIPTION_NAME: שם המינוי
- PUBSUB_TOPIC_NAME: השם של הנושא
מריצים את הפקודה הבאה:
Linux, macOS או Cloud Shell
gcloud pubsub subscriptions create projects/PUBSUB_PROJECT_ID/subscriptions/PUBSUB_SUBSCRIPTION_NAME \ --topic projects/PUBSUB_PROJECT_ID/topics/PUBSUB_TOPIC_NAME
Windows (PowerShell)
gcloud pubsub subscriptions create projects/PUBSUB_PROJECT_ID/subscriptions/PUBSUB_SUBSCRIPTION_NAME ` --topic projects/PUBSUB_PROJECT_ID/topics/PUBSUB_TOPIC_NAME
Windows (cmd.exe)
gcloud pubsub subscriptions create projects/PUBSUB_PROJECT_ID/subscriptions/PUBSUB_SUBSCRIPTION_NAME ^ --topic projects/PUBSUB_PROJECT_ID/topics/PUBSUB_TOPIC_NAME
יצירת סוד עם נושאים מוגדרים
יוצרים סוד עם רשימה של עד 10 נושאים מוגדרים. כל הנושאים שהוגדרו בסוד מקבלים התראות על אירועים כשהסוד או אחת מהגרסאות שלו משתנים.
gcloud
לפני השימוש בנתוני הפקודה הבאים, צריך להחליף את הנתונים הבאים:
- SECRET_ID: מזהה הסוד
- PUBSUB_TOPIC_NAME: השם של הנושא
מריצים את הפקודה הבאה:
Linux, macOS או Cloud Shell
gcloud secrets create SECRET_ID --topics PUBSUB_TOPIC_NAME
Windows (PowerShell)
gcloud secrets create SECRET_ID --topics PUBSUB_TOPIC_NAME
Windows (cmd.exe)
gcloud secrets create SECRET_ID --topics PUBSUB_TOPIC_NAME
REST
לפני שמשתמשים בנתוני הבקשה, צריך להחליף את הנתונים הבאים:
- PROJECT_ID: מזהה הפרויקט Google Cloud
- SECRET_ID: מזהה הסוד
- TOPIC_NAME: השם של הנושא
ה-method של ה-HTTP וכתובת ה-URL:
POST https://secretmanager.googleapis.com/v1/projects/PROJECT_ID/secrets?secretId=SECRET_ID
גוף בקשת JSON:
{
"replication":{
"automatic":{}
},
"topics":{
"name": "TOPIC_NAME"
}
}
כדי לשלוח את הבקשה עליכם לבחור אחת מהאפשרויות הבאות:
curl
שומרים את גוף הבקשה בקובץ בשם request.json ומריצים את הפקודה הבאה:
curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://secretmanager.googleapis.com/v1/projects/PROJECT_ID/secrets?secretId=SECRET_ID"
PowerShell
שומרים את גוף הבקשה בקובץ בשם request.json ומריצים את הפקודה הבאה:
$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }
Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://secretmanager.googleapis.com/v1/projects/PROJECT_ID/secrets?secretId=SECRET_ID" | Select-Object -Expand Content
אתם אמורים לקבל תגובת JSON שדומה לזו:
{
"name": "/projects/my-project/locations/me-central2/secrets/my-drz-secret",
"createTime": "2024-03-25T08:24:13.153705Z",
"etag": "\"161477e6071da9\""
}
עדכון נושאים סודיים
כדי לשנות את נושאי Pub/Sub שהוגדרו בסוד, צריך לעדכן את הסוד עם שמות המשאבים החדשים של נושאי Pub/Sub. באמצעות Google Cloud CLI אפשר להוסיף נושא אחד או יותר לסוד או להסיר אותם ממנו, וגם לנקות את כל הנושאים מהסוד.
הוספת נושאים
כדי להוסיף נושא אחד או יותר לסוד, משתמשים בפקודה הבאה:
gcloud
לפני השימוש בנתוני הפקודה הבאים, צריך להחליף את הנתונים הבאים:
- SECRET_ID: מזהה הסוד
- PROJECT_ID: Google Cloud מזהה הפרויקט שמכיל את הסוד
- PUBSUB_PROJECT_ID: המזהה של הפרויקט שבו רוצים ליצור מינויים
- PUBSUB_TOPIC_1_NAME ו-PUBSUB_TOPIC_2_NAME: שמות הנושאים שאתם מוסיפים לסוד
מריצים את הפקודה הבאה:
Linux, macOS או Cloud Shell
gcloud secrets update SECRET_ID \ --project PROJECT_ID \ --add-topics projects/PUBSUB_PROJECT_ID/topics/PUBSUB_TOPIC_1_NAME,projects/PUBSUB_PROJECT_ID/topics/PUBSUB_TOPIC_2_NAME
Windows (PowerShell)
gcloud secrets update SECRET_ID ` --project PROJECT_ID ` --add-topics projects/PUBSUB_PROJECT_ID/topics/PUBSUB_TOPIC_1_NAME,projects/PUBSUB_PROJECT_ID/topics/PUBSUB_TOPIC_2_NAME
Windows (cmd.exe)
gcloud secrets update SECRET_ID ^ --project PROJECT_ID ^ --add-topics projects/PUBSUB_PROJECT_ID/topics/PUBSUB_TOPIC_1_NAME,projects/PUBSUB_PROJECT_ID/topics/PUBSUB_TOPIC_2_NAME
הסרת נושאים
כדי להסיר נושא אחד או יותר מסוד, משתמשים בפקודה הבאה:
gcloud
לפני השימוש בנתוני הפקודה הבאים, צריך להחליף את הנתונים הבאים:
- SECRET_ID: מזהה הסוד
- PROJECT_ID: הפרויקט שמכיל את הסוד Google Cloud
- PUBSUB_PROJECT_ID: המזהה של הפרויקט שבו רוצים ליצור מינויים
- PUBSUB_TOPIC_1_NAME ו-PUBSUB_TOPIC_2_NAME: שמות הנושאים שרוצים להסיר מהסוד
מריצים את הפקודה הבאה:
Linux, macOS או Cloud Shell
gcloud secrets update SECRET_ID \ --project PROJECT_ID \ --remove-topics projects/PUBSUB_PROJECT_ID/topics/PUBSUB_TOPIC_1_NAME,projects/PUBSUB_PROJECT_ID/topics/PUBSUB_TOPIC_2_NAME
Windows (PowerShell)
gcloud secrets update SECRET_ID ` --project PROJECT_ID ` --remove-topics projects/PUBSUB_PROJECT_ID/topics/PUBSUB_TOPIC_1_NAME,projects/PUBSUB_PROJECT_ID/topics/PUBSUB_TOPIC_2_NAME
Windows (cmd.exe)
gcloud secrets update SECRET_ID ^ --project PROJECT_ID ^ --remove-topics projects/PUBSUB_PROJECT_ID/topics/PUBSUB_TOPIC_1_NAME,projects/PUBSUB_PROJECT_ID/topics/PUBSUB_TOPIC_2_NAME
מחיקת הנושאים
כדי להסיר את כל הנושאים מסוד, משתמשים בפקודה הבאה:
gcloud
לפני השימוש בנתוני הפקודה הבאים, צריך להחליף את הנתונים הבאים:
- SECRET_ID: מזהה הסוד
- PROJECT_ID: הפרויקט שמכיל את הסוד Google Cloud
מריצים את הפקודה הבאה:
Linux, macOS או Cloud Shell
gcloud secrets update SECRET_ID \ --project PROJECT_ID \ --clear-topics
Windows (PowerShell)
gcloud secrets update SECRET_ID ` --project PROJECT_ID ` --clear-topics
Windows (cmd.exe)
gcloud secrets update SECRET_ID ^ --project PROJECT_ID ^ --clear-topics
שימוש בהתראות על אירועים באמצעות פונקציות Cloud Run
אפשר להשתמש בהתראות על אירועים כדי להפעיל תהליכי עבודה על ידי יצירת פונקציות Cloud Run לצריכת ההודעות ב-Pub/Sub. מידע נוסף זמין במאמרי העזרה בנושא פונקציות של Cloud Run. קוד הדוגמה הבא הוא לפונקציית Cloud Run שמדפיסה את eventType, secretId ומטא-נתונים בכל פעם שמתפרסם אירוע בנושא.
C#
כדי להריץ את הקוד הזה, קודם צריך להגדיר סביבת פיתוח בשפת C# ולהתקין את Secret Manager C# SDK. ב-Compute Engine או ב-GKE, צריך לעבור אימות באמצעות ההיקף cloud-platform.
using CloudNative.CloudEvents; using Google.Cloud.Functions.Framework; using Google.Events.Protobuf.Cloud.PubSub.V1; using System; using System.Threading; using System.Threading.Tasks; // Triggered from a message on a Cloud Pub/Sub topic. // The printed value will be visible in Cloud Logging // (https://cloud.google.com/functions/docs/monitoring/logging). namespace PubSubSample { public class Function : ICloudEventFunction<MessagePublishedData> { public Task HandleAsync(CloudEvent cloudEvent, MessagePublishedData data, CancellationToken cancellationToken) { string eventType = data.Message.Attributes["eventType"]; string secretId = data.Message.Attributes["secretId"]; string secretMetadata = data.Message.TextData; Console.WriteLine($"Received {eventType} for {secretId}. New metadata: {secretMetadata}."); return Task.CompletedTask; } } }
Go
כדי להריץ את הקוד הזה, קודם צריך להגדיר סביבת פיתוח של Go ולהתקין את Secret Manager Go SDK. ב-Compute Engine או ב-GKE, צריך לעבור אימות באמצעות ההיקף cloud-platform.
Java
מידע על התקנת ספריית הלקוח של Secret Manager והשימוש בה מופיע במאמר ספריות הלקוח של Secret Manager.
כדי לבצע אימות ל-Secret Manager, מגדירים את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.
Node.js
כדי להריץ את הקוד הזה, קודם צריך להגדיר סביבת פיתוח של Node.js ולהתקין את Secret Manager Node.js SDK. ב-Compute Engine או ב-GKE, צריך לעבור אימות באמצעות ההיקף cloud-platform.
/** * Triggered from a message on a Cloud Pub/Sub topic. * The printed value will be visible in Cloud Logging * (https://cloud.google.com/functions/docs/monitoring/logging). * * @param {!Object} event Event payload. * @param {!Object} context Metadata for the event. */ exports.smEventsFunction = (event, context) => { const eventType = event.attributes.eventType; const secretID = event.attributes.secretId; const secretMetadata = Buffer.from(event.data, 'base64').toString(); console.log(`Received ${eventType} for ${secretID}. New metadata: ${secretMetadata}.`); };
Python
כדי להריץ את הקוד הזה, קודם צריך להגדיר סביבת פיתוח בשפת Python ולהתקין את Secret Manager Python SDK. ב-Compute Engine או ב-GKE, צריך לעבור אימות באמצעות ההיקף cloud-platform.
Ruby
כדי להריץ את הקוד הזה, קודם צריך להגדיר סביבת פיתוח של Ruby ולהתקין את Secret Manager Ruby SDK. ב-Compute Engine או ב-GKE, צריך לעבור אימות באמצעות ההיקף cloud-platform.
require "functions_framework" require "base64" # Triggered from a message on a Cloud Pub/Sub topic. # The printed value will be visible in Cloud Logging # (https://cloud.google.com/functions/docs/monitoring/logging). FunctionsFramework.cloud_event "sm_events_function" do |event| message = event.data["message"] event_type = message["attributes"]["eventType"] secret_id = message["attributes"]["secretId"] message_data = Base64.decode64 message["data"] FunctionsFramework.logger.info "Received %s for %s. New metadata: %s." % [event_type, secret_id, message_data] end
רשימה של כל סוגי האירועים זמינה במאמר סוגי אירועים.
נושאים שהוגדרו בצורה שגויה
אם מוסיפים נושאים של Pub/Sub לסוד בפעולת יצירה או עדכון, אבל Secret Manager לא יכול לפרסם הודעות בנושא בגלל הגדרה שגויה, הפעולה נכשלת ומוצגת הודעת שגיאה שמציינת למה הפרסום נכשל. לדוגמה, זה יכול לקרות אם הנושא לא קיים, או אם לחשבון השירות של Secret Manager אין הרשאה לפרסם.
אם מוסיפים נושאי Pub/Sub לסוד ואחר כך משנים את הנושא כך ש-Secret Manager לא יכול יותר לפרסם הודעות (לדוגמה, הנושא נמחק או שההרשאות של חשבון השירות של Secret Manager הוסרו), Secret Manager כותב יומנים ל-Secret Manager Secret עם הודעה שמציינת למה הפרסום נכשל.