במאמר הזה מוסבר איך להצפין נתונים באופן מקומי ולהעלות אותם ל-Cloud Storage באמצעות Tink ו-Cloud Key Management Service (Cloud KMS). Tink היא ספריית קוד פתוח לקריפטוגרפיה שנכתבה על ידי מומחי קריפטוגרפיה ומהנדסי אבטחה ב-Google.
סקירה כללית
הצפנה מצד הלקוח היא כל הצפנה שמבוצעת לפני שליחת הנתונים לענן. כשמשתמשים בהצפנה מצד הלקוח, אתם אחראים ליצירה ולניהול של מפתחות ההצפנה ולהצפנה של הנתונים לפני ששולחים אותם לענן.
בנושא הזה נסביר איך להטמיע הצפנת מעטפות בצד הלקוח באמצעות Tink, עם מפתח הצפנה ב-Cloud KMS.
גרסה של המדריך הזה שמבוססת על Terraform זמינה במאגר GitHub של kms-solutions.
לפני שמתחילים
- יוצרים מפתח הצפנה סימטרי של Cloud KMS להצפנה. רושמים את ה-URI של המפתח. תצטרכו אותו בהמשך.
- מתקינים את Tink לשימוש עם Cloud KMS.
- יוצרים קטגוריה ב-Cloud Storage כדי להעלות את הנתונים המוצפנים.
התפקידים הנדרשים
כדי לוודא שלחשבון השירות שלכם יש את ההרשאות הנדרשות לשימוש במפתחות Cloud KMS עם Tink, צריך לבקש מהאדמין לתת לחשבון השירות את תפקיד ה-IAM Cloud KMS CryptoKey Encrypter/Decrypter (roles/cloudkms.cryptoKeyEncrypterDecrypter) במפתח.
יכול להיות שהאדמין יוכל גם לתת לחשבון השירות את ההרשאות שנדרשות באמצעות תפקידים בהתאמה אישית או תפקידים מוגדרים מראש אחרים.
הצפנת מעטפות באמצעות Tink
בהצפנת מעטפות, מפתח Cloud KMS משמש כמפתח להצפנת מפתחות הצפנה (KEK). כלומר, הוא משמש להצפנת מפתחות להצפנת נתונים (DEK), שמשמשים להצפנת הנתונים בפועל.
אחרי שיוצרים KEK ב-Cloud KMS, כדי להצפין כל הודעה צריך:
- יוצרים מפתח להצפנת נתונים (DEK) באופן מקומי.
- משתמשים במפתח ה-DEK באופן מקומי כדי להצפין את ההודעה.
- משתמשים ב-Cloud KMS כדי להצפין (לארוז) את ה-DEK באמצעות ה-KEK.
- אחסון הנתונים המוצפנים וה-DEK הארוז.
אם משתמשים ב-Tink, לא צריך להטמיע את תהליך ההצפנה הזה מאפס.
כדי להשתמש ב-Tink להצפנת מעטפות, צריך לספק ל-Tink URI של מפתח ופרטי כניסה. מזהה ה-URI של המפתח מצביע על ה-KEK ב-Cloud KMS, והפרטים של אמצעי הזיהוי מאפשרים ל-Tink להשתמש ב-KEK. Tink יוצר את ה-DEK, מצפין את הנתונים, עוטף את ה-DEK ואז מחזיר טקסט מוצפן יחיד עם הנתונים המוצפנים וה-DEK העטוף.
Tink תומך בהצפנת מעטפה ב-Python, ב-Java, ב-C++ וב-Go באמצעות הפרימיטיב Authenticated Encryption with Associated Data (AEAD).
חיבור Tink ו-Cloud KMS
כדי להצפין את מפתחות ה-DEK שנוצרו על ידי Tink באמצעות מפתח ה-KEK שלכם ב-Cloud KMS, צריך לאחזר את מזהה ה-URI של מפתח ה-KEK. ב-Cloud KMS, מזהה ה-URI של מפתח ה-KEK הוא בפורמט הבא:
gcp-kms://projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/KEY_NAME/cryptoKeyVersions/KEY_VERSION
במאמר קבלת מזהה משאב של Cloud KMS מוסבר איך לקבל את הנתיב למפתח.
הפעלת Tink והצפנת נתונים
Tink משתמשת בפרימיטיבים – אבני בניין קריפטוגרפיות שמנהלות את הפרטים של האלגוריתמים הבסיסיים שלהן – כדי שתוכלו לבצע משימות בצורה בטוחה. כל פרימיטיב מציע API שמטפל במשימה ספציפית. במקרה הזה אנחנו משתמשים ב-AEAD, ולכן אנחנו משתמשים בפרימיטיב Tink AEAD.
Python
Python
מידע על התקנת ספריית הלקוח של Cloud KMS ושימוש בה מופיע במאמר ספריות הלקוח של Cloud KMS.
כדי לבצע אימות ב-Cloud KMS, אתם צריכים להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.
לפני שמריצים דוגמאות קוד, צריך להגדיר את משתנה הסביבה GOOGLE_CLOUD_UNIVERSE_DOMAIN לערך s3nsapis.fr.
Java
Java
מידע על התקנת ספריית הלקוח של Cloud KMS ושימוש בה מופיע במאמר ספריות הלקוח של Cloud KMS.
כדי לבצע אימות ב-Cloud KMS, אתם צריכים להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.
לפני שמריצים דוגמאות קוד, צריך להגדיר את משתנה הסביבה GOOGLE_CLOUD_UNIVERSE_DOMAIN לערך s3nsapis.fr.
מידע נוסף על הפרימיטיבים והממשקים שנתמכים על ידי Tink זמין בדף תחילת העבודה עם Tink.