כשיוצרים אשכול של Managed Service for Apache Spark, אפשר להפעיל את המצב המאובטח של Hadoop באמצעות Kerberos כדי לספק ריבוי דיירים באמצעות אימות משתמשים, בידוד והצפנה בתוך אשכול של Managed Service for Apache Spark.
אימות משתמשים ושירותים אחרים של Google Cloud Platform. אימות לכל משתמש באמצעות Kerberos חל רק בתוך האשכול. האינטראקציות עם שירותים אחרים של Google Cloud , כמו Cloud Storage, ממשיכות להיות מאומתות כחשבון השירות של האשכול.
הפעלה של מצב מאובטח של Hadoop באמצעות Kerberos
הפעלת Kerberos ומצב מאובטח של Hadoop באשכול תכלול את ההפצה של MIT של Kerberos ותגדיר את Apache Hadoop YARN, HDFS, Hive, Spark ורכיבים קשורים לשימוש בו לאימות.
הפעלת Kerberos יוצרת מרכז להקצאת מפתחות (KDC) באשכול, שמכיל חשבונות שירות וחשבון ראשי. החשבון הראשי הבסיסי הוא החשבון עם הרשאות אדמין ל-KDC באשכול. הוא יכול להכיל גם משתמשים רגילים או להיות מחובר באמצעות cross-realm trust ל-KDC אחר שמכיל את המשתמשים.
יצירת אשכול Kerberos
מגדירים את הסיסמה של ה-principal הבסיסי של Kerberos ואז יוצרים אשכול.
הגדרת הסיסמה של השם הראשי של שרת Kerberos
החשבון הראשי של שורש Kerberos הוא החשבון עם הרשאות אדמין ב-KDC של האשכול. כדי לספק בצורה מאובטחת את הסיסמה של חשבון המשתמש הראשי של Kerberos, המשתמשים יכולים להצפין אותה באמצעות מפתח של Key Management Service (KMS), ואז לאחסן אותה בקטגוריה של Google Cloud Storage שאפשר לגשת אליה באמצעות חשבון השירות של האשכול. צריך להקצות לחשבון השירות של האשכול את תפקיד ה-IAM cloudkms.cryptoKeyDecrypter.
מקצים את התפקיד Cloud KMS CryptoKey Encrypter/Decrypter לחשבון השירות של האשכול:
gcloud projects add-iam-policy-binding project-id \ --member serviceAccount:project-number-compute@developer.gserviceaccount.com \ --role roles/cloudkms.cryptoKeyDecrypter
יוצרים אוסף מפתחות:
gcloud kms keyrings create my-keyring --location global
יוצרים מפתח באוסף המפתחות:
gcloud kms keys create my-key \ --location global \ --keyring my-keyring \ --purpose encryption
הצפנת הסיסמה של המשתמש הראשי ב-Kerberos:
echo "my-password" | \ gcloud kms encrypt \ --location=global \ --keyring=my-keyring \ --key=my-key \ --plaintext-file=- \ --ciphertext-file=kerberos-root-principal-password.encrypted
- מעלים את הסיסמה המוצפנת לקטגוריה של Cloud Storage בפרויקט.
- דוגמה:
gcloud storage cp kerberos-root-principal-password.encrypted gs://my-bucket
- דוגמה:
- מעלים את הסיסמה המוצפנת לקטגוריה של Cloud Storage בפרויקט.
יצירת האשכול
אפשר להשתמש ב-Google Cloud CLI, ב-Dataproc API או בGoogle Cloud מסוף כדי להפעיל את Kerberos באשכולות שמשתמשים בגרסת תמונה 1.3 ואילך של Managed Service for Apache Spark.
מסוףGoogle Cloud
- פותחים את הדף Create cluster.
- לוחצים על הגדרה נוספת כדי להרחיב את הקטע.
- עורכים את האבטחה.
- בחלונית שנפתחת, בקטע Kerberos, בוחרים באפשרות הפעלה ומזינים את הסיסמה ואת פרטי המפתח (מידע נוסף מופיע בקטעים הבאים).
פקודה ב-CLI של gcloud
כדי ליצור אשכול Kerberos Managed Service for Apache Spark (גרסת תמונה 1.3 ואילך), משתמשים בפקודה gcloud dataproc clusters create.
gcloud dataproc clusters create cluster-name \ --region=region \ --image-version=2.0 \ --kerberos-root-principal-password-uri=gs://my-bucket/kerberos-root-principal-password.encrypted \ --kerberos-kms-key=projects/project-id/locations/global/keyRings/my-keyring/cryptoKeys/my-key
משתמשים בקובץ הגדרות בפורמט YAML (או JSON). במקום להעביר את האפשרויות kerberos-*לפקודה gcloud כמו בדוגמה שלמעלה, אפשר להציב את הגדרות Kerberos בקובץ הגדרה בפורמט YAML (או JSON), ואז להפנות לקובץ ההגדרה כדי ליצור את אשכול Kerberos.
- יוצרים קובץ הגדרות (אפשר לעיין במאמרים בנושא אישורי SSL, הגדרות נוספות של Kerberos ויחסי אמון בין תחומים כדי לקבל מידע על הגדרות נוספות שאפשר לכלול בקובץ):
root_principal_password_uri: gs://my-bucket/kerberos-root-principal-password.encrypted kms_key_uri: projects/project-id/locations/global/keyRings/mykeyring/cryptoKeys/my-key
- כדי ליצור את אשכול Kerberos, משתמשים בפקודה
gcloudהבאה:gcloud dataproc clusters create cluster-name \ --region=region \ --kerberos-config-file=local path to config-file \ --image-version=2.0
שיקולי אבטחה. Managed Service for Apache Spark משליך את הטופס המפוענח של הסיסמה אחרי הוספת החשבון הראשי של הבסיס ל-KDC.
מטעמי אבטחה, אחרי שיוצרים את האשכול אפשר למחוק את קובץ הסיסמה ואת המפתח שמשמש לפענוח הסוד, ולהסיר את חשבון השירות מהתפקיד kmsKeyDecrypter. אל תעשו את זה אם אתם מתכננים להגדיל את קנה המידה של האשכול, כי בשביל זה צריך את קובץ הסיסמה, המפתח והתפקיד של חשבון השירות.
API בארכיטקטורת REST
אפשר ליצור אשכולות Kerberos באמצעות ClusterConfig.SecurityConfig.KerberosConfig כחלק מבקשת clusters.create. מגדירים את enableKerberos כ-true ומגדירים את השדות rootPrincipalPasswordUri ו-kmsKeyUri.
OS Login
אפשר לבצע ניהול של KDC באשכול באמצעות הפקודה kadmin, באמצעות המשתמש הראשי של Kerberos או באמצעות sudo kadmin.local.
מפעילים את OS Login כדי לשלוט במי שיכול להריץ פקודות של משתמש-על.
אישורי SSL
כחלק מהפעלת מצב מאובטח של Hadoop, Managed Service for Apache Spark יוצר אישור בחתימה עצמית כדי להפעיל הצפנת SSL באשכול. לחלופין, אפשר לספק אישור להצפנת SSL של אשכול על ידי הוספת ההגדרות הבאות לקובץ ההגדרות כשיוצרים אשכול Kerberos:
-
ssl:keystore_password_uri: המיקום ב-Cloud Storage של הקובץ המוצפן באמצעות KMS שמכיל את הסיסמה לקובץ של מאגר המפתחות. -
ssl:key_password_uri: המיקום ב-Cloud Storage של הקובץ המוצפן ב-KMS שמכיל את הסיסמה למפתח בקובץ של מאגר המפתחות. -
ssl:keystore_uri: המיקום ב-Cloud Storage של קובץ מאגר המפתחות שמכיל את תעודת wildcard ואת המפתח הפרטי שמשמש את צמתי האשכול. -
ssl:truststore_password_uri: המיקום ב-Cloud Storage של הקובץ המוצפן באמצעות KMS שמכיל את הסיסמה לקובץ של מאגר האישורים. -
ssl:truststore_uri: המיקום ב-Cloud Storage של קובץ מאגר האישורים שמכיל אישורים מהימנים.
קובץ תצורה לדוגמה:
root_principal_password_uri: gs://my-bucket/kerberos-root-principal-password.encrypted kms_key_uri: projects/project-id/locations/global/keyRings/mykeyring/cryptoKeys/my-key ssl: key_password_uri: gs://bucket/key_password.encrypted keystore_password_uri: gs://bucket/keystore_password.encrypted keystore_uri: gs://bucket/keystore.jks truststore_password_uri: gs://bucket/truststore_password.encrypted truststore_uri: gs://bucket/truststore.jks
הגדרות נוספות של Kerberos
כדי לציין תחום Kerberos, צריך ליצור אשכול Kerberos עם המאפיין הבא שנוסף לקובץ ההגדרות של Kerberos:
-
realm: השם של תחום Kerberos באשכול.
אם לא מגדירים את המאפיין הזה, הדומיין של שמות המארחים (באותיות רישיות) יהיה התחום.
כדי לציין את מפתח האב של מסד הנתונים של KDC, צריך ליצור אשכול Kerberos עם המאפיין הבא שנוסף לקובץ התצורה של Kerberos:
-
kdc_db_key_uri: המיקום ב-Cloud Storage של הקובץ המוצפן ב-KMS שמכיל את מפתח הראשי של מסד הנתונים של KDC.
אם לא מגדירים את המאפיין הזה, שירות Managed Service for Apache Spark ייצור את מפתח הראשי.
כדי לציין את משך החיים המקסימלי של כרטיס למתן כרטיסים (בשעות), צריך ליצור אשכול Kerberos עם המאפיין הבא שנוסף לקובץ ההגדרות של Kerberos:
-
tgt_lifetime_hours: משך החיים המקסימלי של כרטיס הגישה בשעות.
אם לא מגדירים את המאפיין הזה, Managed Service for Apache Spark יגדיר את תוחלת החיים של כרטיס ההרשאה ל-10 שעות.
אמון בין תחומים
ב-KDC באשכול יש בהתחלה רק את מנהל הבסיס ואת עקרונות השירות. אתם יכולים להוסיף חשבונות משתמשים באופן ידני או ליצור יחסי אמון בין תחומים עם שרת KDC חיצוני או שרת Active Directory שמכיל חשבונות משתמשים. מומלץ להשתמש ב-Cloud VPN או ב-Cloud Interconnect כדי להתחבר ל-KDC או ל-Active Directory מקומיים.
כדי ליצור אשכול Kerberos שתומך באמון בין תחומים, מוסיפים את ההגדרות הבאות לקובץ התצורה של Kerberos כשיוצרים אשכול Kerberos. מצפינים את הסיסמה המשותפת באמצעות KMS ומאחסנים אותה בקטגוריה של Cloud Storage שחשבון השירות של האשכול יכול לגשת אליה.
-
cross_realm_trust:admin_server: שם המארח או הכתובת של שרת האדמין המרוחק cross_realm_trust:kdc: שם המארח או הכתובת של שרת ה-KDC המרוחק-
cross_realm_trust:realm: שם התחום המרוחק שרוצים לתת בו אמון -
cross_realm_trust:shared_password_uri: המיקום ב-Cloud Storage של הסיסמה המשותפת שמוצפנת באמצעות KMS
קובץ תצורה לדוגמה:
root_principal_password_uri: gs://my-bucket/kerberos-root-principal-password.encrypted kms_key_uri: projects/project-id/locations/global/keyRings/mykeyring/cryptoKeys/my-key cross_realm_trust: admin_server: admin.remote.realm kdc: kdc.remote.realm realm: REMOTE.REALM shared_password_uri: gs://bucket/shared_password.encrypted
כדי להפעיל אמון בין תחומים ב-KDC מרוחק, פועלים לפי השלבים הבאים:
מוסיפים את השורות הבאות לקובץ
/etc/krb5.confב-KDC המרוחק:[realms] DATAPROC.REALM = { kdc = MASTER-NAME-OR-ADDRESS admin_server = MASTER-NAME-OR-ADDRESS }
יוצרים את משתמש האמון:
kadmin -q "addprinc krbtgt/DATAPROC.REALM@REMOTE.REALM"
כשמוצגת בקשה, מזינים את הסיסמה של המשתמש. הסיסמה צריכה להיות זהה לתוכן של קובץ הסיסמה המוצפן ששותף
כדי להפעיל אמון בין תחומים באמצעות Active Directory, מריצים את הפקודות הבאות ב-PowerShell כאדמין:
יוצרים הגדרת KDC ב-Active Directory.
ksetup /addkdc DATAPROC.REALM DATAPROC-CLUSTER-MASTER-NAME-OR-ADDRESS
יוצרים יחסי אמון ב-Active Directory.
הסיסמה צריכה להיות זהה לתוכן של קובץ הסיסמה המוצפן ששותף.netdom trust DATAPROC.REALM /Domain AD.REALM /add /realm /passwordt:TRUST-PASSWORD
dataproc חשבון משתמש
כששולחים משימה באמצעות jobs API של Managed Service for Apache Spark לאשכול Kerberos של Managed Service for Apache Spark, המשימה מופעלת כ-dataproc Kerberos principal מתחום Kerberos של האשכול.
יש תמיכה בריבוי דיירים באשכול Kerberos של Managed Service for Apache Spark אם שולחים משימה ישירות לאשכול, למשל באמצעות SSH. עם זאת, אם העבודה קוראת או כותבת לשירותים אחרים Google Cloud , כמו Cloud Storage, העבודה פועלת בתור חשבון השירות של האשכול.
מאפייני ברירת מחדל ומאפיינים מותאמים אישית של אשכול
מצב מאובטח של Hadoop מוגדר באמצעות מאפיינים בקובצי תצורה. Managed Service for Apache Spark מגדיר ערכי ברירת מחדל למאפיינים האלה.
כדי לשנות את מאפייני ברירת המחדל כשיוצרים את האשכול, משתמשים בדגל gcloud dataproc clusters create
--properties או קוראים ל-API clusters.create ומגדירים את מאפייני SoftwareConfig (ראו דוגמאות למאפייני אשכול).
מצב זמינות גבוהה
במצב זמינות גבוהה (HA), לאשכול Kerberos יהיו 3 שרתי KDC: אחד בכל שרת ראשי. ה-KDC שפועל בשרת הראשי 'הראשון' ($CLUSTER_NAME-m-0) יהיה ה-KDC הראשי וישמש גם כשרת האדמין.
מסד הנתונים של ה-KDC הראשי יסונכרן עם שני ה-KDC המשוכפלים במרווחי זמן של 5 דקות באמצעות משימת cron, ושלושת ה-KDC ישרתו תנועת קריאה.
מערכת Kerberos לא תומכת באופן מובנה בשכפול בזמן אמת או במעבר אוטומטי לגיבוי אם שרת ה-KDC הראשי מושבת. כדי לבצע יתירות כשל ידנית:
- בכל מכונות ה-KDC, בקובץ
/etc/krb5.conf, משנים אתadmin_serverלשם הדומיין שמוגדר במלואו (FQDN) של השרת הראשי החדש. מסירים את השרת הראשי הישן מרשימת ה-KDC. - בשרת ה-KDC הראשי החדש, מגדירים משימת cron להפצת מסד הנתונים.
- בשרת ה-KDC הראשי החדש, מפעילים מחדש את התהליך admin_server (
krb5-admin-server). - בכל מכונות ה-KDC, מפעילים מחדש את תהליך ה-KDC (
krb5-kdc).
הגדרת רשת
כדי לוודא שצמתי העובדים יכולים לתקשר עם שרת ה-KDC ועם שרת האדמין של Kerberos שפועלים בצומת הראשי, צריך לוודא שכללי חומת האש של ה-VPC מאפשרים תעבורת TCP ו-UDP נכנסת ביציאה 88 ותעבורת TCP נכנסת ביציאה 749 בצומת הראשי. במצב זמינות גבוהה, מוודאים שכללי חומת האש של ה-VPC מאפשרים תעבורת נתונים נכנסת (ingress) של TCP ביציאה 754 בשרתים הראשיים, כדי לאפשר את הפצת השינויים שבוצעו בשרת הראשי של KDC. כדי ש-Kerberos יפעל כמו שצריך, צריך להגדיר DNS הפוך. בנוסף, כדי לבצע קנוניזציה של חשבון המשתמש בשירות שמבוסס על מארח, צריך לוודא ש-DNS הפוך מוגדר בצורה נכונה ברשת של האשכול.
המאמרים הבאים
- אפשר לעיין במאמרי העזרה של MIT Kerberos.