במאמר הזה מוסבר איך להוסיף הצפנת TLS לפריסה של Spanner Omni במכונות וירטואליות (VM). בפריסה עם תכונות אבטחת רשת, נעשה שימוש ב-Transport Layer Security (TLS) 1.3 כדי להצפין ולאמת את התקשורת בתוך הפריסה ועם הלקוחות שלה. כדי לשפר את האבטחה, Spanner Omni מספק אימות הדדי (mTLS) שבו שני הצדדים מאמתים את הזהות שלהם לפני שהם מחליפים נתונים. mTLS הוא אופציונלי בין הלקוח לשרת, אבל שרתי Spanner Omni מתקשרים זה עם זה באמצעות mTLS.
לפני שמתחילים
לפני שמתחילים, צריך לוודא שהסביבה עומדת בדרישות הבאות:
מוודאים שיש לכם גישת SSH לכל מכונה בפריסה. הגישה הזו מאפשרת לכם להוריד ולהריץ את הקובץ הבינארי של Spanner Omni.
הרשת צריכה לאפשר תקשורת TCP ביציאות 15000 עד 15030.
בכל מכונה צריך להיות מספיק נפח אחסון כדי לארח את הנתונים שהפריסה מטפלת בהם.
כדאי לעיין בדף דרישות המערכת כדי לוודא שההגדרה שלכם עומדת בדרישות.
אם אתם מריצים את הקבצים הבינאריים בפלטפורמת הווירטואליזציה vSphere, השביתו את הווירטואליזציה של TSC. כדי לעשות את זה, מוסיפים את ההגדרה
monitor_control.virtual_rdtsc = FALSEלקובץ התצורה.vmxשל המכונה הווירטואלית.
שלב 1: יוצרים פריסה בלי הצפנת TLS
פועלים לפי השלבים שמפורטים בקטע יצירת פריסה של Spanner Omni VM בלי הצפנה. מוודאים שהפריסה של המכונה הווירטואלית פועלת כמו שצריך בלי הצפנה ואמצעי אבטחה. ההנחה בדף הזה היא שיצרתם פריסה אזורית עם שלושה אזורים.
שלב 2: יוצרים את האישורים
צריך ליצור שלוש קבוצות של אישורים:
| סוג האישור | תיאור |
|---|---|
| אישורי API | אישורי API עוזרים להגן על שרת ה-API של Spanner. |
| אישורי שרת | אישורי שרת עוזרים להגן על התקשורת בין שרתים. |
| אישורי לקוחות | משתמשי קצה או אפליקציות משתמשים באישורי לקוח כדי לאמת את הזהות שלהם וליצור אמון עם שרתי Spanner Omni. |
רשות אישורים (CA) מנפיקה את האישורים האלה. ב-Spanner Omni יש כלים ליצירת רשות אישורים וכל שלושת סוגי האישורים. מבצעים את השלבים הבאים באחד מהמחשבים.
אתם יכולים ליצור את האישורים האלה בתחנת העבודה באמצעות ה-CLI של Spanner Omni, ואז להעביר את קובצי האישורים לכל שרת של Spanner Omni. מידע נוסף זמין במאמר מדריך למתחילים: שימוש ב-CLI של Spanner Omni.
כדי ליצור אישורים, צריך לבצע את השלבים הבאים:
יצירת רשות אישורים (CA)
הרשות הזו היא ה-CA הבסיסי לכל אישורי הלקוח והשרת שתיצרו בשלבים הבאים.
spanner certificates create-ca --ca-certificate-directory=certs
הספרייה certs מכילה את אישור ה-CA. יוצרים עותק של האישור הזה כדי להשתמש בו כרשות אישורים (CA) לאישורי API.
cp certs/ca.crt certs/ca-api.crt
הספרייה $HOME/.spanner/private-keys מכילה את המפתח הפרטי של רשות האישורים.
לגבות ולאבטח את הספרייה הזו. משתמש עם גישה למפתח הפרטי יכול לחתום על אישורים שרירותיים, שלקוחות שסומכים על רשות האישורים (CA) עם החתימה העצמית סומכים עליהם.
אפשר להשתמש באותו CA לכל האישורים, אבל חובה להשתמש באותו CA לאישורי API ולאישורי לקוח. אפשר גם ליצור רשות אישורים נוספת (או להשתמש ברשות אישורים חיצונית מהימנה) בשביל אישורי ה-API.
חשוב להשתמש ברשות האישורים הנכונה בשלבים הבאים ליצירת אישורים. במסמך הזה נעשה שימוש באותה רשות אישורים לכל סוגי האישורים.
יצירת אישורי שרת
אתם יוצרים שני סוגים של אישורי שרת:
אישור שרת Spanner: מצפין את התקשורת בין שרתי Spanner Omni.
אישור API: מצפין את התקשורת ממערכות שמקיימות אינטראקציה עם הפריסה.
ההגדרה הזו מאפשרת לנהל את האישורים האלה בצורה גמישה יותר, למשל רוטציה של אישורים.
יצירת אישור השרת של Spanner
שרתי Spanner Omni משתמשים באישורי שרת כדי להצפין את התקשורת ביניהם (תקשורת בין שרתים).
מריצים את הפקודה הבאה כדי ליצור את אישור השרת. מחליפים את SERVER_LIST ברשימה מופרדת בפסיקים של שמות או סיומות של שרתי Spanner.
SERVER_NAMES=SERVER_LIST
spanner certificates create-server --hostnames=${SERVER_NAMES} --ca-certificate-directory certs --output-directory certs
הפקודה הזו יוצרת שני קבצים, server.crt ו-server.key, בספרייה certs.
יצירת אישור ה-API
אישורי API מצפינים את התקשורת ממערכות שמקיימות אינטראקציה עם הפריסה. שימוש באישורים נפרדים ל-API ולתקשורת בין שרתים מאפשר לכם לנהל כל סוג בנפרד ולבצע רוטציה של כל סוג בנפרד.
כדי ליצור את אישור ה-API, מריצים את הפקודה הבאה: מחליפים את LB_DNS ב-DNS של מאזן העומסים.
SERVER_NAMES=LB_DNS
spanner certificates create-server --filename-prefix=api --hostnames=${SERVER_NAMES} --ca-certificate-directory certs --output-directory certs
הפקודה הזו יוצרת שני קבצים נוספים, api.crt ו-api.key, בספרייה certs. אם צריך, אתם יכולים להשתמש ברשות אישורים (CA) חיצונית מהימנה לאישורי ה-API.
הפצת האישורים לכל השרתים
מעתיקים את הספרייה certs לכל השרתים האחרים בפריסה כדי להפעיל אותם עם תכונות אבטחת הרשת.
scp -r certs REMOTE_HOST:SPANNER_DIR/certs
שלב 3: יצירת אישורי לקוח
אתם יכולים להשתמש באישורי לקוח כדי לאמת משתמשים ואפליקציות ב-Spanner. אישורי לקוח מאפשרים mTLS בין הלקוח לשרת.
אישורי הלקוח חייבים להיות חתומים על ידי אותה רשות אישורים (CA) כמו אישור ה-API, והם חייבים להכיל שם משתמש לצורך הרשאה. בדוגמה הזו משתמשים במשתמש admin, שהוא המשתמש שמוגדר כברירת מחדל לכל מסד נתונים. מידע נוסף על משתמשים, תפקידים ואפשרויות אימות זמין במאמר אימות והרשאה ב-Spanner Omni.
USERNAME=admin
spanner certificates create-client $USERNAME --output-directory clientcerts --ca-certificate-directory certs
הפקודה הזו יוצרת את הקבצים client.crt ו-client.key בספרייה clientcerts. שולחים את הקבצים האלה לכל מכונה שמתחברת לשרתים של הפריסה.
אם אתם מתכננים להשתמש באישורי הלקוח עם ספריית הלקוח של Java, אתם צריכים ליצור את מפתח האישור בפורמט PKCS#8. משתמשים בפקודה הבאה:
USERNAME=admin
spanner certificates create-client $USERNAME \
--output-directory clientcerts \
--ca-certificate-directory certs \
--generate-pkcs8-key
שלב 4: יוצרים את קבוצת מפתחות ה-wrapper
Spanner Omni משתמש בקבוצת מפתחות עוטפת של מפתח להצפנת מפתחות הצפנה (KEK) כדי להצפין מפתחות פנימיים, כמו מפתחות להצפנה ולחתימה של טוקנים.
שרתי Spanner Omni קוראים את קבוצת המפתחות הזו מ-BASE_DIR/kms/wrapper_key.
כדי ליצור קובץ חדש של קבוצת מפתחות wrapper באמצעות spanner keys create-keyset, מריצים את הפקודה הבאה:
spanner keys create-keyset --output-file=kms/wrapper_key
כברירת מחדל, spanner keys create-keyset יוצר מפתח AES256_GCM. כדי ליצור סוג אחר של מפתח, משתמשים בדגל --key-template עם אחד מהערכים הבאים של סוג המפתח: AES256_GCM, AES128_GCM, AES256_GCM_RAW, CHACHA20_POLY1305 או XCHACHA20_POLY1305.
הפצת קבוצת המפתחות של ה-wrapper לכל השרתים
מעתיקים את הספרייה kms לספריית הבסיס בכל השרתים בפריסה לפני שמפעילים אותם:
scp -r kms REMOTE_HOST:BASE_DIR/kms
שלב 5: מפעילים את השרתים
כדי להפעיל את השרתים בפריסה, פועלים לפי השלבים הבאים:
- מוודאים שיצרתם את האישורים ואת קבוצת מפתחות ה-wrapper והעתקתם אותם לכל השרתים בפריסה.
- יוצרים ספריית בסיס בכל שרת כדי לאחסן נתונים, מטא-נתונים ויומנים. אם צריך להפעיל מחדש את השרת, צריך לציין את אותה ספריית בסיס כדי לשמור על המשכיות.
- מפעילים כל שרת לפי ההוראות לסוג הפריסה בקטעים הבאים.
פריסה בשרת יחיד
כדי להתחיל פריסה של שרת יחיד עם הצפנה, יוצרים קובץ סיסמה למשתמש admin הראשוני ומפעילים את השרת עם שיטות האימות והאישורים הנתמכים.
יוצרים את קובץ הסיסמה עם הרשאות שמוגדרות ל-600, כדי שרק הבעלים יוכל לקרוא אותו:
printf '%s' 'PASSWORD' > admin_password.txt chmod 600 admin_password.txtהסיסמה צריכה לעמוד בדרישות הבאות:
- באורך של בין 8 ל-32 תווים.
- לפחות אות גדולה אחת.
- לפחות אות קטנה אחת.
- לפחות מספר אחד.
- לפחות תו מיוחד אחד.
מפעילים את השרת היחיד עם הגדרות TLS ואימות:
nohup spanner start-single-server \ --base-dir=BASE_DIR \ --certificate-directory=${HOME}/.spanner/certs \ --auth-methods=password,client-certificate \ --password-protocol=opaque \ --initial-admin-password-file=admin_password.txt &בהפעלה הראשונית,
spanner start-single-serverמגדיר את שיטות האימות הנתמכות ואת פרוטוקול הסיסמה, ויוצר את המשתמש הראשוני שלadminעם התפקידroles/spanner.adminבאמצעות קובץ הסיסמה שצוין.
למידע על אינטראקציה עם הפריסה, ראו שלב 8: אינטראקציה עם הפריסה.
פריסה של הרחבה אופקית (scale out)
בפריסות עם הרחבה אופקית בהתאם לעומס (scale out), צריך להפעיל את השרת בכל מכונה. הערכים של server-address ו-zone צריכים להתאים לערכים בהגדרות הפריסה. הרשת צריכה לפתור את הבעיה ב-server-address. השרתים משתמשים ב-server-address לתקשורת פנימית. מריצים את הפקודה הבאה כדי להפעיל את שרת הבסיס:
nohup spanner start \
--root \
--server-address=HOST_NAME \
--zone=ZONE_NAME \
--base-dir=BASE_DIR \
--certificate-directory=${HOME}/.spanner/certs &
הפקודה הבאה מציגה דוגמה עם ערכים ספציפיים:
nohup spanner start \
--root \
--server-address=rootserver1 \
--zone=us-central-1a \
--base-dir=./spanbasedir \
--certificate-directory=${HOME}/.spanner/certs &
עכשיו, כשהשרתים פועלים בכל מכונה, אפשר ליצור את הפריסה.
שלב 6: יצירת פריסה עם הצפנת TLS
כדי ליצור את הפריסה:
יוצרים קובץ סיסמה שמכיל את הסיסמה של משתמש ברירת המחדל
admin, עם הרשאות שמוגדרות ל-600 (ניתן לקריאה רק על ידי הבעלים):printf '%s' 'PASSWORD' > admin_password.txt chmod 600 admin_password.txtהסיסמה צריכה לעמוד בדרישות הבאות:
- באורך של בין 8 ל-32 תווים.
- לפחות אות גדולה אחת.
- לפחות אות קטנה אחת.
- לפחות מספר אחד.
- לפחות תו מיוחד אחד.
מוודאים ש-
deployment.yamlכולל את שיטות האימות שבחרתם ואת פרוטוקול הסיסמה:deployment_settings: security_settings: authentication_methods: - AUTHENTICATION_METHOD_PASSWORD - AUTHENTICATION_METHOD_CLIENT_CERTIFICATE password_authentication_protocol: PASSWORD_AUTHENTICATION_PROTOCOL_OPAQUEאפשר לציין אחת או יותר משיטות האימות הבאות:
-
AUTHENTICATION_METHOD_PASSWORD: אימות סיסמה -
AUTHENTICATION_METHOD_CLIENT_CERTIFICATE: אימות אישור לקוח
אפשר לציין את פרוטוקול הסיסמה הבא:
-
PASSWORD_AUTHENTICATION_PROTOCOL_OPAQUE: פרוטוקול OPAQUE
-
מריצים את הפקודה
spanner deployment createמאחד משרתי הבסיס כדי ליצור את הפריסה. מציינים את ספריית הבסיס באמצעות הדגל--base-dir(באמצעות אותו BASE_DIR שצוין בהפעלת שרת הבסיס), ומספקים את קובץ הסיסמה של האדמין באמצעות הדגל--admin-password-file:spanner deployment create \ --config-file=deployment.yaml \ --base-dir=BASE_DIR \ --admin-password-file=admin_password.txt
במסוף של כל מכונה מוצגות הודעות שמציינות שהפריסה כוללת עכשיו הצפנת TLS. כל השרתים מתקשרים זה עם זה בערוץ מוצפן.
שלב 7: (אופציונלי) הגדרת מאזן עומסים
כדי לנהל ולהפיץ את תנועת הלקוחות בין השרתים בפריסה, צריך להגדיר מאזן עומסים. מוודאים שהגדרת בדיקת התקינות של מאזן העומסים משתמשת ב-HTTPS במקום ב-HTTP. משתמשים בפרטי ההגדרה הבאים:
| פרמטר | ערך |
|---|---|
| פרוטוקול | TCP |
| כתובת ה-IP של הקצה העורפי | כתובות ה-IP של השרתים שלכם. |
| יציאה | 15000 (זו יציאת ברירת המחדל. אם השתמשתם ביציאה אחרת בדגל --server-address, השתמשו ביציאה הזו.) |
| כתובת ה-URL של בדיקת התקינות | https://IP_ADDRESS:15012/healthz |
| אסטרטגיית איזון | roundrobin (מפיץ בקשות באופן רציף בין השרתים) |
שלב 8: אינטראקציה עם הפריסה
אתם יכולים להשתמש בפריסה של Spanner Omni מכל VM באמצעות Spanner Omni CLI.
כדי ליצור חיבור מוצפן, צריך לכלול את הדגל הבא בכל פקודה:
--ca-certificate-file=certs/ca-api.crt
אם הפעלתם mTLS ללקוחות, צריך לכלול גם את הדגל הבא בכל פקודה:
--client-certificate-directory=clientcerts
כדי להיכנס לחשבון ולבצע פעולות בפריסה:
כניסה ל-Spanner Omni
spanner auth login admin \ --ca-certificate-file=certs/ca-api.crt \ --deployment-endpoint=ENDPOINTכשמופיעה בקשה, מזינים את הסיסמה שהוגדרה ב-
admin_password.txt.Successfully logged in as "admin"יצירת מסד נתונים
spanner --deployment-endpoint=ENDPOINT databases create mydb --ca-certificate-file=certs/ca-api.crtCreating database...done.פתיחת SQL Shell
spanner sql --database=mydb --ca-certificate-file=certs/ca-api.crtConnected. spanner>יצירת טבלה והוספת נתונים
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)אימות הנתונים
מציגים את רשימת מסדי הנתונים:
spanner databases list --ca-certificate-file=certs/ca-api.crtNAME STATE VERSION_RETENTION_PERIOD EARLIEST_VERSION_TIME KMS_KEY_NAME ENABLE_DROP_PROTECTION mydb READY 1h 2025-02-07T12:25:30Z falseמשיגים את הנתונים מהטבלה:
spanner sql --database=mydb --ca-certificate-file=certs/ca-api.crtConnected. spanner> show tables; +----------------+ | Tables_in_mydb | +----------------+ | names | +----------------+ 1 rows in set (0.14 sec) spanner> select * from names; +--------+--------+ | nameId | name | +--------+--------+ | 1 | Jack | +--------+--------+ 1 rows in set (18.69 msecs)
שלב 9: (אופציונלי) התאמת קנה המידה של הפריסה
כדי להגדיל את הקיבולת של אזור, אפשר להוסיף לו שרתים שהם לא שרתי בסיס. כדי להוסיף שרת שאינו שרת בסיס:
יוצרים אישור שרת לשרת שאינו שרת הבסיס ומעתיקים אליו את האישורים. מידע נוסף זמין במאמר שלב 2: יצירת האישורים.
מעתיקים את קבוצת המפתחות של ה-wrapper לשרת שאינו שרת הבסיס. מידע נוסף זמין במאמר שלב 4: יצירת קבוצת המפתחות של ה-wrapper.
מפעילים את השרת שאינו ברמה הבסיסית (root):
spanner start \ --server-address=NON_ROOT_MACHINE \ --join-servers=ROOT_SERVER1,ROOT_SERVER2,ROOT_SERVER3 \ --zone=us-central1-a \ --base-dir=./spandir \ --certificate-directory=${HOME}/.spanner/certs
השלבים הבאים
- משתמשים בספריות לקוח ובמנהלי התקנים של JDBC כדי לחבר את האפליקציה לפריסה.
- ניהול משתמשים ותפקידים.