הגדרת אישורי SSL/TLS

בדף הזה מוסבר איך לאכוף הצפנה באמצעות SSL/TLS במופע כדי לוודא שכל החיבורים מוצפנים. במאמר איך Cloud SQL משתמש באישורי SSL/TLS בניהול עצמי מוסבר גם איך להתחבר למכונות Cloud SQL בצורה מאובטחת.

סקירה כללית

כשיוצרים מכונה, Cloud SQL יוצר באופן אוטומטי אישור שרת. מומלץ לאכוף שכל החיבורים ישתמשו ב-SSL/TLS.

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

מידע נוסף זמין בקטע הפעלת חיבורים מוצפנים למנוע מסד הנתונים במאמרי העזרה של SQL Server.

אם אוכפים SSL עבור מופע, צריך להפעיל מחדש את המופע. יכול להיות שתידרש הפעלה מחדש גם אחרי שינוי של אישורי SSL או TLS. במקרה שנדרשת הפעלה מחדש, Cloud SQL מפעיל מחדש את המכונה באופן אוטומטי. הפעלה מחדש של מופע עלולה לגרום להשבתה.

אכיפת הצפנת SSL/TLS

אפשר להשתמש בהגדרה מצב SSL כדי לאכוף הצפנת SSL בדרכים הבאות:

  • לאפשר חיבורים מסוג SSL/TLS וגם חיבורים שלא מסוג SSL/TLS. (זוהי ברירת המחדל)

  • אפשר לאפשר רק חיבורים מוצפנים באמצעות SSL/TLS.

אם בוחרים באפשרות Allow non-SSL/non-TLS and SSL/TLS connections (אישור חיבורים ללא SSL/TLS וחיבורים עם SSL/TLS) עבור מופע Cloud SQL, המערכת מקבלת חיבורים עם SSL/TLS וגם חיבורים לא מוצפנים ולא מאובטחים. אם לא נדרש SSL/TLS לכל החיבורים, עדיין מותרים חיבורים לא מוצפנים. לכן, אם אתם ניגשים למופע באמצעות כתובת IP ציבורית, מומלץ מאוד לאכוף SSL לכל החיבורים.

אפשר להתחבר ישירות למכונות באמצעות אישורי SSL/TLS, או להתחבר באמצעות שרת proxy ל-Cloud SQL Auth או Cloud SQL Connectors. אם מתחברים באמצעות שרת proxy ל-Cloud SQL Auth או Cloud SQL Connectors, החיבורים מוצפנים אוטומטית באמצעות SSL/TLS. עם Cloud SQL Auth Proxy ו-Cloud SQL Connectors, הזהויות של הלקוח והשרת מאומתות באופן אוטומטי, ללא קשר להגדרת מצב ה-SSL.

אכיפה של SSL מבטיחה שכל החיבורים מוצפנים.

כדי להפעיל את הדרישה ל-SSL/TLS:

המסוף

  1. נכנסים לדף Cloud SQL Instances במסוף Google Cloud .

    כניסה לדף Cloud SQL Instances

  2. כדי לפתוח את הדף סקירה כללית של מכונה, לוחצים על שם המכונה.
  3. בתפריט הניווט של SQL, לוחצים על Connections (קישורים).
  4. בוחרים בכרטיסייה אבטחה.
  5. בוחרים אחת מהאפשרויות הבאות:
    • התרת תנועה ברשת לא מוצפנת (לא מומלץ)
    • מתן הרשאה לחיבורי SSL בלבד. האפשרות הזו מאפשרת רק חיבורים באמצעות הצפנת SSL/TLS.

gcloud

   gcloud sql instances patch INSTANCE_NAME \
   --ssl-mode=SSL_ENFORCEMENT_MODE
  

מחליפים את SSL_ENFORCEMENT_MODE באחת מהאפשרויות הבאות:

  • ALLOW_UNENCRYPTED_AND_ENCRYPTED מאפשר חיבורים ללא SSL/TLS וחיבורים עם SSL/TLS. זה ערך ברירת המחדל.
  • השיטה ENCRYPTED_ONLY מאפשרת רק חיבורים מוצפנים באמצעות SSL/TLS.

Terraform

כדי לאכוף הצפנת SSL/TLS, משתמשים במשאב של Terraform:

resource "google_sql_database_instance" "sqlserver_instance" {
  name             = "sqlserver-instance"
  region           = "asia-northeast1"
  database_version = "SQLSERVER_2019_STANDARD"
  root_password    = "INSERT-PASSWORD-HERE"
  settings {
    tier = "db-custom-2-7680"
    ip_configuration {
      ssl_mode = "ENCRYPTED_ONLY"
    }
  }
  # set `deletion_protection` to true, will ensure that one cannot accidentally delete this instance by
  # use of Terraform whereas `deletion_protection_enabled` flag protects this instance at the GCP level.
  deletion_protection = false
}

החלה של השינויים

כדי להחיל את ההגדרות של Terraform בפרויקט ב- Google Cloud , מבצעים את השלבים בקטעים הבאים.

הכנת Cloud Shell

  1. מפעילים את Cloud Shell.
  2. מגדירים את פרויקט ברירת המחדל שבו רוצים להחיל את ההגדרות של Terraform. Google Cloud

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

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

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

הכנת הספרייה

לכל קובץ תצורה של Terraform צריכה להיות ספרייה משלו (שנקראת גם מודול ברמה הבסיסית).

  1. יוצרים ספרייה חדשה ב-Cloud Shell ובה יוצרים קובץ חדש. שם הקובץ חייב לכלול את הסיומת .tf, למשל main.tf. במדריך הזה, הקובץ נקרא main.tf.
    mkdir DIRECTORY && cd DIRECTORY && touch main.tf
  2. אם אתם עוקבים אחרי המדריך, תוכלו להעתיק את הקוד לדוגמה בכל קטע או שלב.

    מעתיקים את הקוד לדוגמה בקובץ main.tf החדש שיצרתם.

    לחלופין, אפשר גם להעתיק את הקוד מ-GitHub. כדאי לעשות את זה כשקטע הקוד של Terraform הוא חלק מפתרון מקצה לקצה.

  3. בודקים את הפרמטרים לדוגמה ומשנים אותם בהתאם לסביבה שלכם.
  4. שומרים את השינויים.
  5. מפעילים את Terraform. צריך לעשות זאת רק פעם אחת לכל ספרייה.
    terraform init

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

    terraform init -upgrade

החלה של השינויים

  1. בודקים את ההגדרות ומוודאים שהמשאבים שמערכת Terraform תיצור או תעדכן תואמים לציפיות שלכם:
    terraform plan

    מתקנים את ההגדרות לפי הצורך.

  2. מריצים את הפקודה הבאה ומזינים yes בהודעה שמופיעה, כדי להחיל את הגדרות Terraform:
    terraform apply

    ממתינים עד שב-Terraform תוצג ההודעה "Apply complete!‎".

  3. פותחים את Google Cloud הפרויקט כדי לראות את התוצאות. במסוף Google Cloud , נכנסים למשאבים בממשק המשתמש כדי לוודא שהם נוצרו או עודכנו ב-Terraform.

מחיקת השינויים

כדי למחוק את השינויים:

  1. כדי להשבית את ההגנה מפני מחיקה, בקובץ התצורה של Terraform מגדירים את הארגומנט deletion_protection לערך false.
    deletion_protection =  "false"
  2. מריצים את הפקודה הבאה ומזינים yes בהודעה שמופיעה, כדי להחיל את הגדרות Terraform המעודכנות:
    terraform apply
  1. כדי להסיר משאבים שהוחלו בעבר על הגדרות Terraform, מריצים את הפקודה הבאה ומזינים yes בהודעה שמופיעה:

    terraform destroy

REST v1

  1. לפני שמשתמשים בנתוני הבקשה, צריך להחליף את הנתונים הבאים:

    • PROJECT_ID: מזהה הפרויקט
    • SSL_ENFORCEMENT_MODE: מבצעים את אחת מהאפשרויות הבאות:
      • ALLOW_UNENCRYPTED_AND_ENCRYPTED: מאפשר חיבורים ללא SSL/TLS וחיבורים עם SSL/TLS.
      • ENCRYPTED_ONLY: מאפשר רק חיבורים מוצפנים באמצעות SSL/TLS.
    • INSTANCE_ID: מזהה המכונה

    ה-method של ה-HTTP וכתובת ה-URL:

    PATCH https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/INSTANCE_ID

    תוכן בקשת JSON:

    
    {
      "settings": {
        "ipConfiguration": {"sslMode": "SSL_ENFORCEMENT_MODE"}
      }
    }
    

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

    אתם אמורים לקבל תגובת JSON שדומה לזו:

REST v1beta4

  1. לפני שמשתמשים בנתוני הבקשה, צריך להחליף את הנתונים הבאים:

    • PROJECT_ID: מזהה הפרויקט
    • SSL_ENFORCEMENT_MODE: מבצעים את אחת מהאפשרויות הבאות:
      • ALLOW_UNENCRYPTED_AND_ENCRYPTED: מאפשר חיבורים ללא SSL/TLS וחיבורים עם SSL/TLS.
      • ENCRYPTED_ONLY: מאפשר רק חיבורים מוצפנים באמצעות SSL/TLS.
    • INSTANCE_ID: מזהה המכונה

    ה-method של ה-HTTP וכתובת ה-URL:

    PATCH https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/INSTANCE_ID

    תוכן בקשת JSON:

    {
      "settings": {
        "ipConfiguration": {"sslMode": "SSL_ENFORCEMENT_MODE"}
      }
    }
    

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

    אתם אמורים לקבל תגובת JSON שדומה לזו:

אישורי שרת

מערכת Cloud SQL יוצרת אישור שרת באופן אוטומטי כשיוצרים את המכונה. כל עוד אישור השרת תקף, לא צריך לנהל באופן פעיל את אישור השרת. ב-Cloud SQL אפשר לבחור בין שלוש היררכיות שונות של רשויות אישורים (CA). היררכיית ה-CA שתבחרו תהפוך למצב ה-CA של השרת במופע. אם אתם משתמשים ב-CA לכל מופע כמצב CA של השרת עבור המופע, תאריך התפוגה של אישורי השרת הוא 10 שנים. אם אתם משתמשים ב-CA משותף או ב-CA בניהול הלקוח כמצב ה-CA של השרת במופע שלכם, תוקף אישור השרת הוא שנה אחת*. אחרי תאריך התפוגה, אישור השרת כבר לא תקף, והלקוחות לא יכולים יותר ליצור חיבור מאובטח למופע באמצעות האישור הזה. אם לקוח מוגדר לאמת את הרשות שמנפיקה את האישורים (CA) או לאמת את שם המארח באישור השרת, החיבורים של הלקוח הזה למופעי Cloud SQL עם אישורי שרת שתוקפם פג ייכשלו. כדי למנוע שיבושים בחיבורים של הלקוחות, צריך להחליף את אישור השרת לפני שהוא יפוג. אתם מקבלים מדי פעם הודעה על כך שהתוקף של אישור השרת עומד לפוג. ההתראות נשלחות במספר הימים הבא לפני תאריך התפוגה: 90,‏ 30,‏ 10,‏ 2 ו-1.

* אם בחרתם תאריך תפוגה קצר יותר לתקופת התוקף של רשות האישורים, יכול להיות שתאריך התפוגה של אישור השרת יהיה קצר משנה.

הצגת רשימה ויצירה של אישורי שרת

כדי לראות את הפרטים של אישורי השרת במסוף Google Cloud , עוברים לדף Connections ולוחצים על הכרטיסייה Security.

בטבלת האישורים אפשר לראות את הפרטים הבאים:

  • סטטוס האישור:בקרוב, פעיל או קודם
    • בקרוב: האישור זמין לשימוש, אבל הוא לא פעיל. כדי להפעיל את האישור, צריך להשתמש בתהליך הרוטציה.
    • Active: האישור נמצא בשימוש.
    • קודם: האישור כבר לא בשימוש. כדי להפעיל את האישור, משתמשים בהליך החזרה לגרסה קודמת.
  • נוצר: התאריך והשעה שבהם נוצר האישור
  • בתוקף עד: התאריך והשעה שבהם יפוג תוקף האישור

לפני שתוקף האישור הפעיל יפוג, תוכלו ליצור אישור חדש באופן ידני.

המסוף

למופעים שמשתמשים באישור שרת בחתימה עצמית (CA לכל מופע):

  1. נכנסים לדף Cloud SQL Instances במסוף Google Cloud .

    כניסה לדף Cloud SQL Instances

  2. כדי לפתוח את הדף סקירה כללית של מכונה, לוחצים על שם המכונה.
  3. בתפריט הניווט של SQL, לוחצים על Connections (קישורים).
  4. בוחרים בכרטיסייה אבטחה.
  5. עוברים לקטע ניהול אישורי CA של שרת.
  6. לוחצים על ניהול אישורים כדי להרחיב אותו.
  7. לוחצים על יצירת אישור CA חדש.

אישור ה-CA החדש של השרת מופיע במשבצת בקרוב. אם רוצים לעבור לאישור ה-CA החדש של השרת באופן מיידי, צריך לעדכן את הלקוחות ולהשלים את הרוטציה לפי ההוראות שבקטע רוטציה של אישור CA של השרת.

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

  1. נכנסים לדף Cloud SQL Instances במסוף Google Cloud .

    כניסה לדף Cloud SQL Instances

  2. כדי לפתוח את הדף סקירה כללית של מכונה, לוחצים על שם המכונה.
  3. בתפריט הניווט של SQL, לוחצים על Connections (קישורים).
  4. בוחרים בכרטיסייה אבטחה.
  5. עוברים לקטע ניהול אישורי שרת.
  6. לוחצים על ניהול אישורים כדי להרחיב אותו.
  7. לוחצים על יצירת אישור שרת.

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

gcloud

למופעים שמשתמשים באישור שרת בחתימה עצמית (CA לכל מופע):

  1. כדי לקבל מידע על אישור השרת, משתמשים בפקודה sql ssl server-ca-certs list:
    gcloud sql ssl server-ca-certs list \
    --instance=INSTANCE_NAME
  2. כדי ליצור אישור שרת, משתמשים בפקודה sql ssl server-ca-certs create:
    gcloud sql ssl server-ca-certs create \
    --instance=INSTANCE_NAME
  3. מורידים את פרטי האישור לקובץ PEM מקומי:
    gcloud sql ssl server-ca-certs list \
    --format="value(cert)" \
    --instance=INSTANCE_NAME > \
    FILE_PATH/FILE_NAME.pem
  4. כדי לעדכן את כל הלקוחות במידע החדש, צריך להעתיק את הקובץ שהורדתם למחשבי המארחים של הלקוחות ולהחליף את קובצי server-ca.pem הקיימים.

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

  1. כדי לקבל מידע על אישור השרת, משתמשים בפקודה sql ssl server-certs list:
    gcloud sql ssl server-certs list \
       --instance=INSTANCE_NAME
  2. כדי ליצור אישור שרת, משתמשים בפקודה sql ssl server-certs create:
    gcloud sql ssl server-certs create \
       --instance=INSTANCE_NAME
  3. מורידים את פרטי האישור לקובץ PEM מקומי:
    gcloud sql ssl server-certs list \
       --format="value(ca_cert.cert)" \
       --instance=INSTANCE_NAME > \
       FILE_PATH/FILE_NAME.pem
  4. כדי לעדכן את כל הלקוחות במידע החדש, צריך להעתיק את הקובץ שהורדתם למחשבי המארחים של הלקוחות ולהחליף את קובצי server-ca.pem הקיימים.

Terraform

כדי לספק מידע על אישור השרת כפלט, משתמשים במקור נתונים של Terraform:

  1. מוסיפים את השורות הבאות לקובץ התצורה של Terraform:
       data "google_sql_ca_certs" "ca_certs" {
         instance = google_sql_database_instance.default.name
       }
    
       locals {
         furthest_expiration_time = reverse(sort([for k, v in data.google_sql_ca_certs.ca_certs.certs : v.expiration_time]))[0]
         latest_ca_cert           = [for v in data.google_sql_ca_certs.ca_certs.certs : v.cert if v.expiration_time == local.furthest_expiration_time]
       }
    
       output "db_latest_ca_cert" {
         description = "Latest CA certificate used by the primary database server"
         value       = local.latest_ca_cert
         sensitive   = true
       }
       
  2. כדי ליצור את הקובץ server-ca.pem, מריצים את הפקודה הבאה:
       terraform output db_latest_ca_cert > server-ca.pem
       

שימוש בחיבורים מוצפנים

מידע נוסף על השימוש בחיבורים מוצפנים ב-SQL Server

אימות זהות השרת

אימות זהות השרת תלוי בהגדרת היררכיית רשות האישורים (CA) של השרת במופע Cloud SQL.

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

אם יש לכם CA לכל מופע, תוכלו לבצע אימות של זהות השרת על סמך שם DNS רק עבור מופעים שהוגדרו עם Private Service Connect. אם יש לכם CA משותף, אתם יכולים לבצע אימות של זהות השרת על סמך שם DNS לכל סוגי המופעים, כלומר Private Service Connect,‏ גישה לשירותים פרטיים ומופעים של כתובת IP ציבורית.

אם אתם משתמשים ב-CA בניהול הלקוח, אתם יכולים לאמת את שרשרת האמון של ה-CA ולבצע אימות של זהות השרת על סמך שם ה-DNS לכל סוג של מכונה שמשתמשת ב-CA בניהול הלקוח בשביל serverCAmode.

כשבוחרים באפשרות של רשות אישורים בניהול הלקוח עבור המופע, אפשר להוסיף שמות DNS מותאמים אישית בשדה SAN של אישור השרת. מידע נוסף מופיע במאמר בנושא עריכה של שדה SAN בהתאמה אישית.

כדי לראות איזו היררכיית CA מוגדרת למכונה ב-Cloud SQL, צריך להציג את פרטי המכונה. מידע נוסף זמין במאמר בנושא צפייה בפרטי המופע.

הפעלת אימות זהות השרת

אם בוחרים ב-CA משותף כמצב ה-CA של השרת במופע Cloud SQL או אם מגדירים שמות DNS בהתאמה אישית באמצעות ערכי SAN בהתאמה אישית, מומלץ להפעיל גם אימות של זהות השרת.

מופעים שמשתמשים ב-CA משותף במצב CA של השרת מכילים את שם ה-DNS של המופע בשדה Subject Alternative Name (SAN) של אישור השרת. אפשר לקבל את שם ה-DNS הזה באמצעות ה-API של חיפוש המופעים, ולהשתמש בתגובה כשם מארח לאימות זהות השרת. צריך להגדיר פענוח DNS לשם ה-DNS.

כדי להפעיל אימות של זהות השרת במופע שמשתמש ב-CA משותף, מבצעים את השלבים הבאים:

  1. מאחזרים את שם ה-DNS.

    1. כדי להציג סיכום מידע על מכונת Cloud SQL, כולל שם ה-DNS של המכונה, משתמשים בפקודה gcloud sql instances describe:

      gcloud sql instances describe INSTANCE_NAME \
        --project=PROJECT_ID

      מחליפים את הפרטים הבאים:

      • INSTANCE_NAME: השם של מכונת Cloud SQL
      • PROJECT_ID: המזהה או מספר הפרויקט של Google Cloud הפרויקט שמכיל את המופע
    2. מחפשים את השדה dnsNames: בתשובה. השדה הזה יכול להחזיר כמה שמות DNS, בפורמטים הבאים:

      הגדרת רשת פורמט של שם DNS שם הרמה
      Private Service Connect או כתובת IP ציבורית INSTANCE_UID.PROJECT_DNS_LABEL.REGION_NAME.sql.goog.

      לדוגמה:
      1a23b4cd5e67.1a2b345c6d27.us-central1.sql.goog.
      Instance
      גישה לשירותים פרטיים INSTANCE_UID.PROJECT_DNS_LABEL.REGION_NAME.sql-psa.goog.

      לדוגמה:
      1a23b4cd5e67.1a2b345c6d27.us-central1.sql-psa.goog.
      Instance
  2. יוצרים את רשומת ה-DNS בתחום DNS. אם אתם מתחברים באופן פרטי, צרו את רשומת ה-DNS בתחום DNS פרטי ברשת הענן הווירטואלי הפרטי (VPC) המתאימה.

  3. כשמתחברים למופע Cloud SQL ל-SQL Server, מגדירים את שם ה-DNS או את כתובת ה-IP כשם המארח. לאחר מכן מפעילים את אימות הזהות של השרת על ידי ציון הדגל -N עבור sqlcmd או על ידי בחירה באפשרות Encrypt Connection/Encryption (הצפנת החיבור) של SSMS.

    לדרייברים אחרים של SQL Server יש דגלים או הגדרות דומים.

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