בדף הזה מוסבר איך להטמיע הצפנה מצד הלקוח ב-Cloud SQL.
סקירה כללית
הצפנה בצד הלקוח היא פעולת הצפנה של נתונים לפני כתיבתם ל-Cloud SQL. אתם יכולים להצפין את הנתונים ב-Cloud SQL באופן שרק האפליקציה שלכם יכולה לפענח.
כדי להפעיל את ההצפנה מצד הלקוח, יש לכם את האפשרויות הבאות:
- שימוש במפתח הצפנה שמאוחסן ב-Cloud Key Management Service (Cloud KMS).
- שימוש במפתח הצפנה שמאוחסן באופן מקומי באפליקציה.
במאמר הזה נסביר איך להשתמש באפשרות הראשונה, שהיא האפשרות הכי חלקה לניהול מפתחות. אנחנו יוצרים מפתח הצפנה ב-Cloud KMS ומטמיעים הצפנת מעטפה באמצעות Tink,ספריית הקריפטוגרפיה בקוד פתוח של Google.
למה צריך הצפנה מצד הלקוח?
אם רוצים להגן על נתונים ב-Cloud SQL ברמת העמודה, צריך להשתמש בהצפנה מצד הלקוח. נניח שיש לכם טבלה עם שמות ומספרי כרטיסי אשראי. אתם רוצים להעניק למשתמש גישה לטבלה הזו, אבל לא רוצים שהוא יוכל לראות את מספרי כרטיסי האשראי. אפשר להצפין את המספרים באמצעות הצפנה מצד הלקוח. כל עוד למשתמש אין גישה למפתח ההצפנה ב-Cloud KMS, הוא לא יכול לקרוא את פרטי כרטיס האשראי.
אפשר גם להגביל את הגישה ברמת המופע או מסד הנתונים.
יצירת מפתחות באמצעות Cloud KMS
Cloud KMS מאפשר לכם ליצור ולנהל מפתחות ב- Google Cloud.
Cloud KMS תומך בסוגים רבים ושונים של מפתחות. כדי להשתמש בהצפנה מצד הלקוח, צריך ליצור מפתח סימטרי.
כדי לתת לאפליקציה גישה למפתח ב-Cloud KMS, צריך להעניק לחשבון השירות שבו האפליקציה משתמשת את cloudkms.cryptoKeyEncrypterDecrypterהתפקיד. ב-CLI של gcloud, משתמשים בפקודה הבאה כדי לעשות זאת:
gcloud kms keys add-iam-policy-binding key \ --keyring=key-ring \ --location=location \ --member=serviceAccount:service-account-name@example.domain.com \ --role=roles/cloudkms.cryptoKeyEncrypterDecrypter
אפשר להשתמש במפתח ה-KMS כדי להצפין נתונים באופן ישיר, אבל כאן נשתמש בפתרון גמיש יותר שנקרא הצפנת מעטפות. כך אנחנו יכולים להצפין הודעות באורך של יותר מ-64KB, שהוא הגודל המקסימלי של הודעה שממשק Cloud Key Management Service API יכול לתמוך בו.
הצפנת מעטפה ב-Cloud KMS
בהצפנת מעטפת, מפתח ה-KMS פועל כמפתח להצפנת מפתחות הצפנה (KEK). כלומר, הוא משמש להצפנה של מפתחות להצפנת נתונים (DEK), שמשמשים בתורם להצפנה של הנתונים בפועל.
אחרי שיוצרים KEK ב-Cloud KMS, כדי להצפין כל הודעה צריך:
- יוצרים מפתח להצפנת נתונים (DEK) באופן מקומי.
- משתמשים במפתח הזה להצפנת נתונים באופן מקומי כדי להצפין את ההודעה.
- שולחים קריאה ל-Cloud KMS כדי להצפין (לעטוף) את ה-DEK באמצעות ה-KEK.
- אחסון הנתונים המוצפנים וה-DEK הארוז.
במקום להטמיע הצפנת מעטפה מאפס, אנחנו משתמשים ב-Tink במסמך הזה.
Tink
Tink היא ספרייה חוצת-פלטפורמות ורב-לשונית שמספקת ממשקי API קריפטוגרפיים ברמה גבוהה. כדי להצפין נתונים באמצעות הצפנת המעטפת של Tink, צריך לספק ל-Tink מזהה URI של מפתח שמפנה אל ה-KEK ב-Cloud KMS, ופרטי כניסה שמאפשרים ל-Tink להשתמש ב-KEK. Tink יוצר את ה-DEK, מצפין את הנתונים, עוטף את ה-DEK ומחזיר טקסט מוצפן יחיד עם הנתונים המוצפנים וה-DEK העטוף.
Tink תומך בהצפנת מעטפות ב-C++, Java, Go ו-Python באמצעות ה-API של AEAD:
public interface Aead{
byte[] encrypt(final byte[] plaintext, final byte[] associatedData)
throws…
byte[] decrypt(final byte[] ciphertext, final byte[] associatedData)
throws…
}
בנוסף לארגומנט הרגיל של הודעה או טקסט מוצפן, השיטות encrypt ו-decrypt תומכות בנתונים משויכים אופציונליים. אפשר להשתמש בארגומנט הזה כדי לקשר את הטקסט המוצפן לחלק מהנתונים. לדוגמה, נניח שיש לכם מסד נתונים עם השדה user-id והשדה encrypted-medical-history. במקרה הזה, כדאי להשתמש בשדה user-id כנתונים משויכים כשמצפינים את ההיסטוריה הרפואית. כך תוקף לא יכול להעביר היסטוריה רפואית ממשתמש אחד למשתמש אחר. הוא משמש גם כדי לוודא שקיבלתם את שורת הנתונים הנכונה כשאתם מריצים שאילתה.
דוגמאות
בקטע הזה נסביר על קוד לדוגמה של מסד נתונים של מידע על מצביעים שמשתמש בהצפנה מצד הלקוח. קוד לדוגמה מראה איך:
- יצירה של טבלת מסד נתונים ומאגר חיבורים
- הגדרת Tink להצפנת מעטפות
- הצפנה ופענוח של נתונים באמצעות הצפנת מעטפה של Tink עם KEK ב-Cloud KMS
לפני שמתחילים
כדי ליצור מכונה של Cloud SQL, כדאי להיעזר בהוראות האלה. חשוב לרשום לפניכם את מחרוזת החיבור, את משתמש מסד הנתונים ואת הסיסמה של מסד הנתונים שאתם יוצרים.
יוצרים מסד נתונים לאפליקציה בעזרת ההוראות האלה. רושמים את שם מסד הנתונים.
יוצרים מפתח KMS לאפליקציה לפי ההוראות האלה. מעתיקים את שם המשאב של המפתח שיצרתם.
יוצרים חשבון שירות עם ההרשאות 'לקוח Cloud SQL' לפי ההוראות האלה.
מוסיפים את ההרשאה Cloud KMS CryptoKey Encrypter/Decrypter (הצפנה/פענוח של מפתח קריפטוגרפי ב-Cloud KMS) למפתח בחשבון השירות שלכם באמצעות ההוראות האלה.