יצירת פריסה עם הצפנת TLS במכונות וירטואליות

במאמר הזה מוסבר איך להוסיף הצפנת 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: מפעילים את השרתים

כדי להפעיל את השרתים בפריסה, פועלים לפי השלבים הבאים:

  1. מוודאים שיצרתם את האישורים ואת קבוצת מפתחות ה-wrapper והעתקתם אותם לכל השרתים בפריסה.
  2. יוצרים ספריית בסיס בכל שרת כדי לאחסן נתונים, מטא-נתונים ויומנים. אם צריך להפעיל מחדש את השרת, צריך לציין את אותה ספריית בסיס כדי לשמור על המשכיות.
  3. מפעילים כל שרת לפי ההוראות לסוג הפריסה בקטעים הבאים.

פריסה בשרת יחיד

כדי להתחיל פריסה של שרת יחיד עם הצפנה, יוצרים קובץ סיסמה למשתמש admin הראשוני ומפעילים את השרת עם שיטות האימות והאישורים הנתמכים.

  1. יוצרים את קובץ הסיסמה עם הרשאות שמוגדרות ל-600, כדי שרק הבעלים יוכל לקרוא אותו:

    printf '%s' 'PASSWORD' > admin_password.txt
    chmod 600 admin_password.txt
    

    הסיסמה צריכה לעמוד בדרישות הבאות:

    • באורך של בין 8 ל-32 תווים.
    • לפחות אות גדולה אחת.
    • לפחות אות קטנה אחת.
    • לפחות מספר אחד.
    • לפחות תו מיוחד אחד.
  2. מפעילים את השרת היחיד עם הגדרות 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

כדי ליצור את הפריסה:

  1. יוצרים קובץ סיסמה שמכיל את הסיסמה של משתמש ברירת המחדל admin, עם הרשאות שמוגדרות ל-600 (ניתן לקריאה רק על ידי הבעלים):

    printf '%s' 'PASSWORD' > admin_password.txt
    chmod 600 admin_password.txt
    

    הסיסמה צריכה לעמוד בדרישות הבאות:

    • באורך של בין 8 ל-32 תווים.
    • לפחות אות גדולה אחת.
    • לפחות אות קטנה אחת.
    • לפחות מספר אחד.
    • לפחות תו מיוחד אחד.
  2. מוודאים ש-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
  3. מריצים את הפקודה 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

כדי להיכנס לחשבון ולבצע פעולות בפריסה:

  1. כניסה ל-Spanner Omni

    spanner auth login admin \
        --ca-certificate-file=certs/ca-api.crt \
        --deployment-endpoint=ENDPOINT
    

    כשמופיעה בקשה, מזינים את הסיסמה שהוגדרה ב-admin_password.txt.

    Successfully logged in as "admin"
    
  2. יצירת מסד נתונים

    spanner --deployment-endpoint=ENDPOINT databases create mydb --ca-certificate-file=certs/ca-api.crt
    
    Creating database...done.
    
  3. פתיחת SQL Shell

    spanner sql --database=mydb --ca-certificate-file=certs/ca-api.crt
    
    Connected.
    spanner>
    
  4. יצירת טבלה והוספת נתונים

    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. אימות הנתונים

    מציגים את רשימת מסדי הנתונים:

    spanner databases list --ca-certificate-file=certs/ca-api.crt
    
    NAME  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.crt
    
    Connected.
    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: (אופציונלי) התאמת קנה המידה של הפריסה

כדי להגדיל את הקיבולת של אזור, אפשר להוסיף לו שרתים שהם לא שרתי בסיס. כדי להוסיף שרת שאינו שרת בסיס:

  1. יוצרים אישור שרת לשרת שאינו שרת הבסיס ומעתיקים אליו את האישורים. מידע נוסף זמין במאמר שלב 2: יצירת האישורים.

  2. מעתיקים את קבוצת המפתחות של ה-wrapper לשרת שאינו שרת הבסיס. מידע נוסף זמין במאמר שלב 4: יצירת קבוצת המפתחות של ה-wrapper.

  3. מפעילים את השרת שאינו ברמה הבסיסית (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
    

השלבים הבאים