יצירת פריסה עם הצפנת TLS ב-Kubernetes

ב-Spanner Omni אנחנו משתמשים ב-TLS 1.3 כדי להצפין את הנתונים שזורמים בין הלקוח לשרת, ובין שרתי Spanner Omni. ‫Spanner Omni מספק mTLS לאבטחה משופרת, שבה שני הצדדים מאמתים את האותנטיות של כל אחד מהם לפני שהם מחליפים נתונים. אם משתמשים בהצפנה, השרתים צריכים לתקשר באמצעות mTLS. אתם יכולים לבחור אם הלקוח והשרת שלכם ישתמשו גם ב-mTLS.

גרסת הטרום-השקה של Spanner Omni לא תומכת בהצפנת TLS, והיא מפסיקה לכתוב נתונים 90 יום אחרי שיוצרים פריסה. כדי לקבל גישה מוקדמת למהדורה עם כל התכונות, אפשר לפנות אל Google.

לפני שמתחילים

חשוב לוודא שאתם עומדים בדרישות הבאות:

  • יוצרים אשכול Kubernetes. ההגדרה תומכת ב-Google Kubernetes Engine ‏ (GKE) וב-Amazon Elastic Kubernetes Service ‏ (Amazon EKS). יכול להיות שתצטרכו להתאים אישית את ההגדרה כדי שהיא תפעל בסביבות אחרות.

  • מוודאים שלקלאסטר Kubernetes יש גישה לארטיפקט של Artifact Registry שמארח את קונטיינר Spanner Omni.

  • מתקינים ומגדירים את כלי שורת הפקודה kubectl ואת Helm.

  • אם הגדרתם את סביבת Kubernetes במכונות של פלטפורמת הווירטואליזציה vSphere, צריך להשבית את הווירטואליזציה של Time Stamp Counter ‏ (TSC) על ידי הוספת monitor_control.virtual_rdtsc = FALSE לקובץ ההגדרה .vmx של המכונה הווירטואלית. כך מבטיחים ש-TrueTime יפעל בצורה תקינה.

  • מוודאים שהסביבה עומדת בדרישות המערכת של Spanner Omni.

שלב 1: יצירת האישורים

צריך ליצור שלוש קבוצות של אישורים:

  • אישורים של API: האישורים האלה עוזרים להגן על השרת של Spanner Omni API.

  • אישורים לשרתים: עוזרים להגן על התקשורת בין השרתים.

  • אישורי לקוח: משתמשי קצה או אפליקציות משתמשים בהם כדי לבסס את הזהות שלהם ואת האמון בשרתי Spanner Omni.

רשות אישורים (CA) מנפיקה את האישורים האלה. ב-Spanner Omni יש כלים ליצירת רשות אישורים בחתימה עצמית וכל שלושת סוגי האישורים.

מבצעים את השלבים הבאים באחד מהמחשבים. השלבים מניחים שמרחב השמות הוא spanner-ns. משנים את זה למרחב השמות שרוצים להשתמש בו בפריסה.

אפשר ליצור את האישורים האלה בתחנת העבודה באמצעות Spanner Omni CLI.

1. יצירת רשות אישורים (CA)

כל האישורים מונפקים על ידי רשות אישורים (CA). יכול להיות שבארגון שלכם יש רשות אישורים מרכזית, או שאתם יכולים להשתמש ברשות אישורים ציבורית. אפשר להשתמש באותו CA לכל האישורים, אבל אישורי API ואישורי לקוח חייבים להשתמש באותו CA.

בעזרת Spanner Omni אפשר ליצור רשות אישורים פרטית.

./google/spanner/bin/spanner certificates create-ca --ca-certificate-directory=certs

הפקודה create-ca יוצרת את אישור ה-CA בספרייה certs. אפשר להעתיק את האישור הזה כדי להשתמש בו כ-CA לאישורי API, או ליצור CA אחר. חשוב לוודא שאתם משתמשים ב-CA הנכון כשאתם יוצרים אישורים.

cp certs/ca.crt certs/ca-api.crt

הספרייה $HOME/.spanner/private-keys מכילה את המפתח הפרטי של רשות האישורים. חשוב מאוד לגבות את הספרייה הזו ולאבטח אותה. משתמשים שיש להם גישה למפתח הפרטי יכולים לחתום על אישורים שרירותיים שהלקוחות סומכים על רשות האישורים בחתימה עצמית שסומכים עליה. אופציונלי: אפשר ליצור רשות אישורים נוספת (או להשתמש ברשות אישורים חיצונית מהימנה) לאישורי ה-API. במסמך הזה נעשה שימוש באותו CA לכל סוגי האישורים.

2. יצירת אישורי שרת

צריך ליצור שני סוגים של אישורים לשרת:

  • אישור API: משתמשים באישור הזה כדי להצפין את התקשורת ממערכות שמתקשרות עם הפריסה.

  • אישור שרת Spanner: שרתי Spanner Omni משתמשים באישור הזה כדי להצפין את התקשורת ביניהם.

ההגדרה הזו מאפשרת גמישות בניהול האישורים האלה. לדוגמה, היא מאפשרת להשתמש ברוטציה של אישורים.

יצירת אישור שרת Spanner

כדי ליצור את אישור השרת, מריצים את הפקודה הבאה:

# Comma-separate names of the Spanner servers; wildcards are supported.
SERVER_NAMES=*.pod.NAMESPACE
./google/spanner/bin/spanner certificates create-server --hostnames=${SERVER_NAMES} --ca-certificate-directory certs --output-directory certs

הפקודה הזו יוצרת את הקבצים server.crt ו-server.key בספרייה certs.

יצירת אישור API

כדי ליצור את אישור ה-API, מריצים את הפקודה הבאה:

OMNI_ENDPOINT=spanner.NAMESPACE
./google/spanner/bin/spanner certificates create-server --filename-prefix=api --hostnames=${OMNI_ENDPOINT} --ca-certificate-directory certs --output-directory certs

הפקודה הזו יוצרת את הקבצים api.crt ו-api.key בספרייה certs. אם צריך, משתמשים ב-CA חיצוני מהימן לאישורי ה-API.

3. יצירת אישורי לקוח

אתם יכולים להשתמש באישורי לקוח כדי לאמת משתמשים ואפליקציות. אישורי לקוח מאפשרים mTLS בין הלקוח לשרת. אם אתם לא מתכננים להשתמש ב-mTLS, אתם יכולים לדלג על השלב הזה.

אותה רשות אישורים שחותמת על אישור ה-API צריכה לחתום על אישורי הלקוח, שצריכים לכלול גם שם משתמש לצורך הרשאה. בדוגמה הזו, משתמשים במשתמש admin, שהוא משתמש ברירת המחדל לכל מסד נתונים חדש. מידע נוסף זמין במאמר אימות והרשאה ב-Spanner Omni.

USERNAME=admin
./google/spanner/bin/spanner certificates create-client $USERNAME --output-directory clientcerts --ca-certificate-directory certs

הפקודה הזו יוצרת את הקבצים client.crt ו-client.key בספרייה clientcerts. שולחים את הקבצים האלה לכל מכונה שמתחברת לפריסה.

אם אתם מתכננים להשתמש באישור לקוח עם ספריית הלקוח של Java, אתם צריכים ליצור את מפתח האישור בפורמט PKCS#8. משתמשים בפקודה הבאה:

USERNAME=admin
./google/spanner/bin/spanner certificates create-client $USERNAME --output-directory clientcerts --ca-certificate-directory certs --generate-pkcs8-key

שלב 2: דחיפת האישורים לאשכול Kubernetes

מריצים את הפקודות הבאות כדי להעביר את האישורים לאשכול Kubernetes:

kubectl create namespace NAMESPACE

kubectl create secret generic tls-certs \
  --from-file=ca.crt="certs/ca.crt" \
  --from-file=ca-api.crt="certs/ca-api.crt" \
  --from-file=server.crt="certs/server.crt" \
  --from-file=server.key="certs/server.key" \
  --from-file=api.crt="certs/api.crt" \
  --from-file=api.key="certs/api.key" \
  -n NAMESPACE

שלב 3: יצירת הפריסה עם הצפנת TLS

כדי ליצור פריסה עם הצפנת TLS, פועלים לפי השלבים הבאים.

1. הכנת הגדרות Helm

עוברים אל יצירת הגדרת תרשים Helm ויוצרים את הגדרת הפריסה לסביבה שלכם.

כדי להפעיל TLS, מגדירים את הערכים הבאים בהגדרות של תרשים Helm:

# Enables TLS
global:
  insecureMode: false

# Enables client certificate authentication (mTLS)
deployment:
  enableClientCertificateAuthentication: true

2. יצירת הפריסה

מריצים את הפקודה הבאה כדי ליצור את הפריסה:

kubectl create ns monitoring

helm upgrade --install spanner-omni oci://us-docker.pkg.dev/spanner-omni/charts/spanner-omni \
  --version VERSION \
  --set global.platform=gke \
  --set global.insecureMode=false \
  --set deployment.enableClientCertificateAuthentication=true \
  --namespace NAMESPACE \
  --set monitoring.enabled=true

הפקודה מפעילה עבודת אתחול. אפשר לעקוב אחרי ההתקדמות באמצעות הצפייה ביומני הרישום של הפעולה הזו:

kubectl logs -n NAMESPACE -l app.kubernetes.io/component=bootstrap -f

הפלט מציין את ההתקדמות. בסיום, תופיע ההודעה 'הפריסה נוצרה בהצלחה'.

3. בדיקת הסטטוס של ה-pods

מריצים את הפקודה הבאה כדי לוודא מה הסטטוס של ה-pod:

kubectl get pods --watch --namespace NAMESPACE

כל הפודים במצב READY.

4. עדכון האישור והפריסה עם פרטים של מאזן עומסים

השלב הזה נדרש אם רוצים שהלקוחות יתחברו מחוץ לאשכול Kubernetes.

# Get the service details
kubectl get service spanner -n NAMESPACE

# The EXTERNAL-IP:PORT is the API or deployment endpoint for your deployment.
# Update the API certificate with these details.
OMNI_ENDPOINT=EXTERNAL_IP,spanner.NAMESPACE.svc
./google/spanner/bin/spanner certificates update --filename_prefix=api --hostnames=${OMNI_ENDPOINT} --ca_certificate_directory certs --output_directory certs --overwrite

# Update the secrets in Kubernetes
kubectl patch secret tls-certs -n NAMESPACE -p "{\"data\":{\"api.crt\":\"$(base64 -w 0 certs/api.crt)\"}}"

שלב 4: אינטראקציה עם Spanner Omni

אתם יכולים לקיים אינטראקציה עם פריסת Spanner Omni מכל מכונת VM באמצעות Spanner Omni CLI.

אם הפעלתם mTLS ללקוחות, צריך להשתמש בדגלים הבאים בכל פקודה:

  • --client-certificate-directory=CLIENT_CERTIFICATE_DIRECTORY

  • --ca-certificate-file=API_CA_CERT_FILE_PATH

1. כניסה ל-Spanner Omni

מריצים את הפקודה הבאה כדי להתחבר:

./google/spanner/bin/spanner auth login admin --ca-certificate-file=certs/ca-api.crt \
--client-certificate_directory=clientcerts --deployment-endpoint=DEPLOYMENT_ENDPOINT

סיסמת ברירת המחדל היא admin.

Successfully logged in as "admin"

2. יצירת מסד נתונים

מריצים את הפקודה הבאה כדי ליצור מסד נתונים:

./google/spanner/bin/spanner --deployment-endpoint=DEPLOYMENT_ENDPOINT databases create DATABASE_NAME --ca-certificate-file=certs/ca-api.crt --client-certificate-directory=clientcerts

3. פתיחה של SQL Shell

מריצים את הפקודה הבאה כדי לפתוח את המעטפת:

./google/spanner/bin/spanner sql --database=DATABASE_NAME --deployment-endpoint=DEPLOYMENT_ENDPOINT --ca-certificate-file=certs/ca-api.crt --client-certificate-directory=clientcerts

4. יצירת טבלה והוספת נתונים

מריצים את פקודות ה-SQL הבאות:

spanner> CREATE TABLE names (nameId INT64 NOT NULL, name String(100)) PRIMARY KEY (nameId);
Query OK, 0 rows affected (4.62 sec)

spanner> INSERT names (nameId, name) VALUES (1, "Jack");
Query OK, 1 rows affected (0.18 sec)

5. אימות הפריסה

כדי להציג את רשימת מסדי הנתונים, מריצים את הפקודה הבאה:

./google/spanner/bin/spanner databases list --ca-certificate-file=certs/ca-api.crt --client-certificate-directory=clientcerts --deployment-endpoint=DEPLOYMENT_ENDPOINT

הפלט אמור להיראות כך:

שם STATE VERSION_RETENTION_PERIOD EARLIEST_VERSION_TIME ENABLE_DROP_PROTECTION
DATABASE_NAME מוכן שעה 2025-02-07T12:25:30Z FALSE

כדי לשלוח שאילתה לנתונים, מריצים את הפקודה הבאה:

./google/spanner/bin/spanner sql --database=DATABASE_NAME --ca-certificate-file=certs/ca-api.crt --client-certificate-directory=clientcerts --deployment-endpoint=DEPLOYMENT_ENDPOINT

מריצים את פקודות ה-SQL הבאות:

SHOW TABLES;
SELECT * FROM names;

לחלופין, אפשר לפעול לפי ההוראות במאמר שימוש ב-PGAdapter עם Spanner Omni כדי להגדיר את PGAdapter ולבצע אינטראקציה באמצעות כלים כמו psql.

שלב 5: מעקב אחר הפריסה

אם התקנתם את Spanner Omni עם monitoring.enabled=true, מערכת Prometheus תאסוף מדדים. אפשר להשתמש ב-Grafana כדי להציג את המדדים האלה באופן חזותי.

1. קבלת פרטי השירות

מריצים את הפקודות הבאות כדי לקבל את פרטי השירות:

# Prometheus service details. Default port is 9090.
kubectl get service prometheus-service -n monitoring

# Grafana service details. Default port is 3000.
kubectl get service grafana -n monitoring

המאמרים הבאים