בדף הזה מוסבר איך להטמיע הצפנה מצד הלקוח ב-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) באופן מקומי.
- משתמשים ב-DEK הזה באופן מקומי כדי להצפין את ההודעה.
- שליחת קריאה ל-Cloud KMS כדי להצפין (לעטוף) את ה-DEK באמצעות ה-KEK.
- מאחסנים את הנתונים המוצפנים ואת ה-DEK הארוז.
במקום להטמיע הצפנת מעטפה מאפס, במסמך הזה אנחנו משתמשים ב-Tink.
Tink
Tink היא ספרייה מרובת שפות ופלטפורמות, שמספקת ממשקי API קריפטוגרפיים ברמה גבוהה. כדי להצפין נתונים באמצעות הצפנת המעטפת של Tink, אתם צריכים לספק ל-Tink כתובת URI של מפתח שמצביעה על ה-KEK שלכם ב-Cloud KMS, ופרטי כניסה שמאפשרים ל-Tink להשתמש ב-KEK. Tink יוצר את ה-DEK, מצפין את הנתונים, אורז את ה-DEK ומחזיר טקסט מוצפן (ciphertext) אחד עם הנתונים המוצפנים וה-DEK הארוז.
Tink תומכת בהצפנת מעטפה ב-C++, ב-Java, ב-Go וב-Python באמצעות AEAD API:
public interface Aead{
byte[] encrypt(final byte[] plaintext, final byte[] associatedData)
throws…
byte[] decrypt(final byte[] ciphertext, final byte[] associatedData)
throws…
}
בנוסף לארגומנט הרגיל של ההודעה או המידע המוצפן (ciphertext), השיטות להצפנה ולפענוח תומכות בנתונים משויכים אופציונליים. אפשר להשתמש בארגומנט הזה כדי לקשר את המידע המוצפן (ciphertext) לנתון מסוים. לדוגמה, נניח שיש לכם מסד נתונים עם השדה user-id והשדה encrypted-medical-history. במקרה כזה, כנראה שצריך להשתמש בשדה user-id כנתונים משויכים כשמצפינים את ההיסטוריה הרפואית. כך תוקפים לא יכולים להעביר היסטוריה רפואית ממשתמש אחד למשתמש אחר. הוא משמש גם כדי לוודא שאתם מקבלים את שורת הנתונים הנכונה כשאתם מריצים שאילתה.
דוגמאות
בקטע הזה נציג קוד לדוגמה של מסד נתונים של מידע על מצביעים, שמשתמש בהצפנה מצד הלקוח. הקוד לדוגמה מראה איך:
- יצירת טבלה במסד נתונים ומאגר חיבורים
- הגדרת Tink להצפנת מעטפה
- הצפנה ופענוח של נתונים באמצעות הצפנת מעטפה של Tink עם KEK ב-Cloud KMS
לפני שמתחילים
כדי ליצור מכונה של Cloud SQL, פועלים לפי ההוראות האלה. שימו לב למחרוזת החיבור, למשתמש במסד הנתונים ולסיסמה למסד הנתונים שאתם יוצרים.
כדי ליצור מסד נתונים לאפליקציה, פועלים לפי ההוראות האלה. רושמים את שם מסד הנתונים.
כדי ליצור מפתח KMS לאפליקציה, פועלים לפי ההוראות האלה. מעתיקים את שם המשאב של המפתח שיצרתם.
יוצרים חשבון שירות עם ההרשאות של "לקוח Cloud SQL" לפי ההוראות האלה.
מוסיפים לחשבון השירות את ההרשאה "הצפנה/פענוח של Cloud KMS CryptoKey" למפתח, לפי ההוראות.