Configurazione della sicurezza di Managed Service for Apache Spark sui cluster

Quando crei un cluster Managed Service for Apache Spark, puoi abilitare la modalità protetta di Hadoop tramite Kerberos per fornire multi-tenancy tramite autenticazione degli utenti, isolamento e crittografia all'interno di un cluster Managed Service for Apache Spark.

Autenticazione degli utenti e altri servizi Google Cloud. L'autenticazione per utente tramite Kerberos si applica solo all'interno del cluster. Le interazioni con altri Google Cloud servizi, come Cloud Storage, continuano a essere autenticate come account di servizio per il cluster.

Abilitare la modalità protetta di Hadoop utilizzando Kerberos

L'abilitazione di Kerberos e della modalità protetta di Hadoop per un cluster include la distribuzione MIT di Kerberos e configura Apache Hadoop YARN, HDFS, Hive, Spark e i componenti correlati per utilizzarlo per l'autenticazione.

L'abilitazione di Kerberos crea un KDC (Key Distribution Center) on-cluster, che contiene entità di servizio ed entità root. L'entità root è l'account con autorizzazioni di amministratore per il KDC on-cluster. Può anche contenere entità utente standard o essere connesso tramite trust tra realm a un altro KDC contenente le entità utente.

Creare un cluster Kerberos

Configura la password dell'entità root Kerberos e poi crea un cluster.

Configurare la password dell'entità root Kerberos

L'entità root Kerberos è l'account con autorizzazioni di amministratore per il KDC on-cluster. Per fornire in modo sicuro la password per l'entità root Kerberos, gli utenti possono criptarla con una chiave Key Management Service (KMS) e poi memorizzarla in un bucket Google Cloud Storage a cui può accedere il service account del cluster . Al account di servizio del cluster deve essere concesso il cloudkms.cryptoKeyDecrypter ruolo IAM.

  1. Concedi il ruolo Cloud KMS CryptoKey Encrypter/Decrypter al service account del cluster:

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

  2. Crea chiavi automatizzate:

    gcloud kms keyrings create my-keyring --location global
    

  3. Crea una chiave nel keyring:

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

  4. Cripta la password dell'entità root 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. Carica la password criptata in un bucket Cloud Storage nel tuo progetto.
      1. Esempio:
        gcloud storage cp kerberos-root-principal-password.encrypted gs://my-bucket
        

Crea il cluster

Puoi utilizzare Google Cloud CLI, l'API Dataproc o la Google Cloud console per abilitare Kerberos sui cluster che utilizzano Managed Service for Apache Spark versione dell'immagine 1.3 e successive.

Google Cloud Console

  1. Apri la pagina Crea cluster.
  2. Fai clic su Configurazione aggiuntiva per espandere la sezione.
  3. Modifica Sicurezza.
  4. Nel riquadro che si apre, in Kerberos, seleziona Abilita, quindi fornisci la password e le informazioni sulla chiave (per ulteriori informazioni, consulta le sezioni seguenti).

Comando gcloud CLI

Per creare un cluster Kerberos Managed Service for Apache Spark (versione dell'immagine 1.3 e successive), utilizza il gcloud dataproc clusters create comando.

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

Utilizza un file di configurazione YAML (o JSON). Anziché passare i flag kerberos-* al comando gcloud come mostrato sopra, puoi inserire le impostazioni di Kerberos in un file di configurazione YAML (o JSON), quindi fare riferimento al file di configurazione per creare il cluster Kerberos.

  1. Crea un file di configurazione (per ulteriori impostazioni di configurazione che possono essere incluse nel file, consulta Certificati SSL, Impostazioni Kerberos aggiuntive e Trust tra realm ):
    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. Utilizza il seguente comando gcloud per creare il cluster Kerberos:
    gcloud dataproc clusters create cluster-name \
        --region=region \
        --kerberos-config-file=local path to config-file \
        --image-version=2.0
    

Considerazioni sulla sicurezza. Managed Service for Apache Spark elimina la forma decriptata della password dopo aver aggiunto l'entità root al KDC. Per motivi di sicurezza, dopo aver creato il cluster puoi decidere di eliminare il file della password e la chiave utilizzata per decriptare il secret e rimuovere il service account dal ruolo kmsKeyDecrypter. Non eseguire questa operazione se prevedi di scalare il cluster, perché sono necessari il file della password, la chiave e il ruolo del account di servizio.

API REST

I cluster Kerberos possono essere creati tramite il ClusterConfig.SecurityConfig.KerberosConfig nell'ambito di una richiesta clusters.create. Imposta enableKerberos su true e imposta i rootPrincipalPasswordUri e kmsKeyUri campi.

OS Login

La gestione del KDC on-cluster può essere eseguita con il kadmin comando utilizzando l'entità utente root Kerberos o utilizzando sudo kadmin.local. Abilita OS Login per controllare chi può eseguire i comandi superutente.

Certificati SSL

Nell'ambito dell'abilitazione della modalità protetta di Hadoop, Managed Service for Apache Spark crea un certificato autofirmato per abilitare la crittografia SSL del cluster. In alternativa, puoi fornire un certificato per la crittografia SSL del cluster aggiungendo le seguenti impostazioni al file di configurazione quando crei un cluster Kerberos:

  • ssl:keystore_password_uri: posizione in Cloud Storage del file criptato con KMS contenente la password del file dell'archivio chiavi.
  • ssl:key_password_uri: posizione in Cloud Storage del file criptato con KMS contenente la password della chiave nel file dell'archivio chiavi.
  • ssl:keystore_uri: posizione in Cloud Storage del file dell'archivio chiavi contenente il certificato con caratteri jolly e la chiave privata utilizzata dai nodi del cluster.
  • ssl:truststore_password_uri: posizione in Cloud Storage del file criptato con KMS contenente la password del file dell'archivio attendibile.
  • ssl:truststore_uri: posizione in Cloud Storage del file dell'archivio di attendibilità contenente i certificati attendibili.

File di configurazione di esempio:

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

Impostazioni Kerberos aggiuntive

Per specificare un realm Kerberos, crea un cluster Kerberos con la seguente proprietà aggiunta nel file di configurazione di Kerberos :

  • realm: il nome del realm Kerberos on-cluster.

Se questa proprietà non è impostata, il dominio dei nomi host (in maiuscolo) sarà il realm.

Per specificare la chiave master del database KDC, crea un cluster Kerberos con la seguente proprietà aggiunta nel file di configurazione di Kerberos :

  • kdc_db_key_uri: posizione in Cloud Storage del file criptato con KMS contenente la chiave master del database KDC.

Se questa proprietà non è impostata, Managed Service for Apache Spark genererà la chiave master.

Per specificare la durata massima (in ore) del ticket Granting Ticket, crea un cluster Kerberos con la seguente proprietà aggiunta nel file di configurazione di Kerberos:

  • tgt_lifetime_hours: durata massima del ticket Granting Ticket in ore.

Se questa proprietà non è impostata, Managed Service for Apache Spark imposterà la durata del ticket Granting Ticket su 10 ore.

Trust tra realm

Il KDC sul cluster inizialmente contiene solo l'entità amministratore root e le entità di servizio. Puoi aggiungere le entità utente manualmente o stabilire un trust tra realm con un KDC esterno o un server Active Directory contenente le entità utente. Cloud VPN o Cloud Interconnect è consigliato per connettersi a un KDC/Active Directory on-premise.

Per creare un cluster Kerberos che supporti il trust tra realm, aggiungi le seguenti impostazioni al file di configurazione di Kerberos quando crei un cluster Kerberos. Cripta la password condivisa con KMS e memorizzala in un bucket Cloud Storage a cui può accedere il account di servizio del cluster.

  • cross_realm_trust:admin_server: nome host o indirizzo del server di amministrazione remoto
  • cross_realm_trust:kdc: nome host o indirizzo del KDC remoto
  • cross_realm_trust:realm: nome del realm remoto da considerare attendibile
  • cross_realm_trust:shared_password_uri: posizione in Cloud Storage della password condivisa criptata con KMS

File di configurazione di esempio:

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

Per abilitare il trust tra realm a un KDC remoto:

  1. Aggiungi quanto segue nel file /etc/krb5.conf nel KDC remoto:

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

  2. Crea l'utente di trust:

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

  3. Quando ti viene richiesto, inserisci la password dell'utente. La password deve corrispondere ai contenuti del file della password condivisa criptata

Per abilitare il trust tra realm con Active Directory, esegui i seguenti comandi in PowerShell come amministratore:

  1. Crea una definizione KDC in Active Directory.

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

  2. Crea trust in Active Directory.

    netdom trust DATAPROC.REALM /Domain AD.REALM /add /realm /passwordt:TRUST-PASSWORD
    
    La password deve corrispondere ai contenuti del file della password condivisa criptata.

Entità dataproc

Quando invii un job utilizzando l'API Managed Service for Apache Spark Jobs a un cluster Kerberos Managed Service for Apache Spark, viene eseguito come entità Kerberos dataproc dal realm Kerberos del cluster.

La multi-tenancy è supportata all'interno di un cluster Kerberos Managed Service for Apache Spark se invii un job direttamente, al cluster, ad esempio utilizzando SSH. Tuttavia, se il job legge o scrive in altri Google Cloud servizi, come Cloud Storage, il job funge da service account del cluster.

Proprietà del cluster predefinite e personalizzate

La modalità protetta di Hadoop è configurata con le proprietà nei file di configurazione. Managed Service for Apache Spark imposta i valori predefiniti per queste proprietà.

Puoi sostituire le proprietà predefinite quando crei il cluster con il gcloud dataproc clusters create --properties flag o chiamando l'API clusters.create e impostando le proprietà SoftwareConfig (vedi esempi di proprietà del cluster).

Modalità ad alta disponibilità

In modalità ad alta disponibilità (HA), un cluster Kerberos avrà 3 KDC: uno su ogni master. Il KDC in esecuzione sul "primo" master ($CLUSTER_NAME-m-0) sarà il KDC master e fungerà anche da server di amministrazione. Il database del KDC master verrà sincronizzato con i due KDC di replica a intervalli di 5 minuti tramite un job cron e i 3 KDC gestiranno il traffico di lettura.

Kerberos non supporta in modo nativo la replica in tempo reale o il failover automatico se il KDC master non è attivo. Per eseguire un failover manuale:

  1. Su tutte le macchine KDC, in /etc/krb5.conf, modifica admin_server con il nome di dominio completo (FQDN) del nuovo master. Rimuovi il vecchio master dall'elenco KDC.
  2. Sul nuovo KDC master, configura un cron job per propagare il database.
  3. Sul nuovo KDC master, riavvia il processo admin_server (krb5-admin-server).
  4. Su tutte le macchine KDC, riavvia il processo KDC (krb5-kdc).

Configurazione di rete

Per assicurarti che i nodi worker possano comunicare con il KDC e il server di amministrazione Kerberos in esecuzione sul master, verifica che le regole firewall VPC consentano il traffico TCP e UDP in entrata sulla porta 88 e il traffico TCP in entrata sulla porta 749 sul master. In modalità ad alta disponibilità, assicurati che le regole firewall VPC consentano il traffico TCP in entrata sulla porta 754 sui master per consentire la propagazione delle modifiche apportate al KDC master. Kerberos richiede che il DNS inverso sia configurato correttamente. Inoltre, per la canonizzazione dell'entità di servizio basata sull'host, assicurati che il DNS inverso sia configurato correttamente per la rete del cluster.

Passaggi successivi