Managed Service for Apache Spark on clusters security configuration

כשיוצרים אשכול Managed Service for Apache Spark, אפשר להפעיל את מצב האבטחה של Hadoop באמצעות Kerberos כדי לספק ריבוי דיירים באמצעות אימות משתמשים, בידוד והצפנה בתוך אשכול Managed Service for Apache Spark.

אימות משתמשים ושירותים אחרים של Google Cloud Platform. אימות לכל משתמש באמצעות Kerberos חל רק בתוך האשכול. אינטראקציות עם שירותים אחרים של Google Cloud , כמו Cloud Storage, ממשיכות לעבור אימות כחשבון השירות של האשכול.

הפעלת מצב מאובטח של Hadoop באמצעות Kerberos

הפעלת Kerberos ו-Hadoop Secure Mode באשכול תכלול את ההפצה של Kerberos ב-MIT, ותגדיר את Apache Hadoop YARN,‏ HDFS,‏ Hive,‏ Spark ורכיבים קשורים כדי להשתמש בהם לאימות.

כשמפעילים את Kerberos, נוצר מרכז להקצאת מפתחות (KDC) באשכול, שמכיל חשבונות שירות וחשבון בסיס. החשבון הראשי ברמה הבסיסית הוא החשבון עם הרשאות אדמין ל-KDC באשכול. הוא יכול גם להכיל ישויות משתמש רגילות או להיות מחובר באמצעות אמון בין-תחומי ל-KDC אחר שמכיל את ישויות המשתמש.

יצירת אשכול Kerberos

מגדירים את סיסמת ה-root principal של Kerberos ואז יוצרים אשכול.

הגדרת הסיסמה של מנהל השורש ב-Kerberos

החשבון הראשי ברמה הבסיסית (root) של Kerberos הוא החשבון עם הרשאות אדמין ל-KDC באשכול. כדי לספק באופן מאובטח את הסיסמה של חשבון המשתמש ברמה הבסיסית (root) של Kerberos, המשתמשים יכולים להצפין אותה באמצעות מפתח של Key Management Service (KMS), ואז לאחסן אותה בקטגוריה של Google Cloud Storage שחשבון השירות של האשכול יכול לגשת אליה. לחשבון השירות של האשכול צריך להיות תפקיד ה-IAM cloudkms.cryptoKeyDecrypter.

  1. מקצים את התפקיד "הצפנה/פענוח של מפתח קריפטוגרפי ב-Cloud KMS" לחשבון השירות של האשכול:

    gcloud projects add-iam-policy-binding project-id \
        --member serviceAccount:project-number-compute@ \
        --role roles/cloudkms.cryptoKeyDecrypter
    

  2. יוצרים אוסף מפתחות:

    gcloud kms keyrings create my-keyring --location global
    

  3. יוצרים מפתח באוסף המפתחות:

    gcloud kms keys create my-key \
        --location global \
        --keyring my-keyring \
        --purpose encryption
    

  4. הצפנת הסיסמה של מנהל השורש של Kerberos:

    echo "my-password" | \
      gcloud kms encrypt \
        --location=global \
        --keyring=my-keyring \
        --key=my-key \
        --plaintext-file=- \
        --ciphertext-file=kerberos-root-principal-password.encrypted
    

    1. מעלים את הסיסמה המוצפנת לקטגוריה של Cloud Storage בפרויקט.
      1. דוגמה:
        gcloud storage cp kerberos-root-principal-password.encrypted gs://my-bucket
        

יצירת האשכול

אתם יכולים להשתמש ב-Google Cloud CLI, ב-Dataproc API או במסוףGoogle Cloud כדי להפעיל את Kerberos באשכולות שמשתמשים ב-Managed Service for Apache Spark מגרסת אימג' 1.3 ואילך.

מסוףGoogle Cloud

  1. פותחים את הדף Create cluster.
  2. לוחצים על הגדרות נוספות כדי להרחיב את הקטע.
  3. עורכים את האבטחה.
  4. בחלונית שנפתחת, בקטע Kerberos, בוחרים באפשרות Enable ומזינים את הסיסמה ואת פרטי המפתח (מידע נוסף מופיע בקטעים הבאים).

פקודת ה-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.

  1. יוצרים קובץ תצורה (במאמרים אישורי 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
  2. משתמשים בפקודה הבאה של gcloud כדי ליצור את אשכול ה-Kerberos:
    gcloud dataproc clusters create cluster-name \
        --region=region \
        --kerberos-config-file=local path to config-file \
        --image-version=2.0
    

שיקולי אבטחה אחרי הוספת חשבון השורש הראשי ל-KDC, המערכת של Managed Service for Apache Spark מוחקת את הסיסמה המפוענחת. מטעמי אבטחה, אחרי שיוצרים את האשכול אפשר למחוק את קובץ הסיסמה ואת המפתח שמשמש לפענוח הסוד, ולהסיר את חשבון השירות מהתפקיד 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 Secure Mode, ‏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 שמכיל את הסיסמה לקובץ ה-truststore.
  • ‫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 באשכול מכיל רק את החשבון הראשי של מנהל המערכת ברמה הבסיסית (root) ואת החשבונות הראשיים של השירות. אפשר להוסיף חשבונות משתמשים באופן ידני או להגדיר יחסי אמון בין תחומים עם שרת KDC חיצוני או שרת Active Directory שמכיל חשבונות משתמשים. כדי להתחבר ל-KDC או ל-Active Directory מקומיים, מומלץ להשתמש ב-Cloud VPN או ב-Cloud Interconnect.

כדי ליצור אשכול 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 מרוחק, צריך לבצע את השלבים הבאים:

  1. מוסיפים את הטקסט הבא לקובץ /etc/krb5.conf ב-KDC המרוחק:

    [realms]
    DATAPROC.REALM = {
      kdc = MASTER-NAME-OR-ADDRESS
      admin_server = MASTER-NAME-OR-ADDRESS
    }

  2. יוצרים את המשתמש המהימן:

    kadmin -q "addprinc krbtgt/DATAPROC.REALM@REMOTE.REALM"
    

  3. כשמופיעה בקשה, מזינים את הסיסמה של המשתמש. הסיסמה צריכה להתאים לתוכן של קובץ הסיסמה המשותף המוצפן

כדי להפעיל יחסי אמון בין תחומים עם Active Directory, מריצים את הפקודות הבאות ב-PowerShell כאדמין:

  1. יוצרים הגדרת KDC ב-Active Directory.

    ksetup /addkdc DATAPROC.REALM DATAPROC-CLUSTER-MASTER-NAME-OR-ADDRESS
    

  2. יוצרים אמון ב-Active Directory.

    netdom trust DATAPROC.REALM /Domain AD.REALM /add /realm /passwordt:TRUST-PASSWORD
    
    הסיסמה צריכה להתאים לתוכן של קובץ הסיסמה המשותפת המוצפנת.

חשבון משתמש אחד (dataproc)

כששולחים משימה באמצעות ממשק ה-API של המשימות ב-Managed Service for Apache Spark לאשכול Kerberos ב-Managed Service for Apache Spark, היא פועלת בתור הישות הראשית של dataproc ב-Kerberos מהתחום של האשכול ב-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 הראשי מושבת. כדי לבצע מעבר ידני במקרה כשל:

  1. בכל מכונות ה-KDC, ב-/etc/krb5.conf, משנים את admin_server ל-FQDN (שם דומיין שמוגדר במלואו) של המאסטר החדש. מסירים את המאסטר הישן מרשימת ה-KDC.
  2. ב-KDC הראשי החדש, מגדירים משימת cron להפצת מסד הנתונים.
  3. ב-KDC הראשי החדש, מפעילים מחדש את התהליך admin_server‏ (krb5-admin-server).
  4. בכל מכונות ה-KDC, מפעילים מחדש את תהליך ה-KDC‏ (krb5-kdc).

הגדרת רשת

כדי לוודא שצומתי העובדים יכולים לתקשר עם שרת הניהול של KDC ו-Kerberos שפועל במאסטר, צריך לוודא שכללי חומת האש של VPC מאפשרים תנועת TCP ו-UDP נכנסת ביציאה 88 ותנועת TCP נכנסת ביציאה 749 במאסטר. במצב זמינות גבוהה, חשוב לוודא שכללי חומת האש של VPC מאפשרים תעבורת נתונים נכנסת (ingress) של TCP ביציאה 754 במאסטרים, כדי לאפשר את הפצת השינויים שבוצעו ב-KDC הראשי. כדי ש-Kerberos יפעל, צריך להגדיר DNS הפוך בצורה נכונה. בנוסף, כדי לבצע קנוניזציה של חשבון המשתמש בשירות שמבוסס על מארח, צריך לוודא שהגדרתם DNS הפוך לרשת של האשכול.

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