Configuração de segurança do Dataproc

Ao criar um cluster do Dataproc, você pode ativar o modo seguro do Hadoop por meio do Kerberos para fornecer multilocação por meio de autenticação, isolamento e criptografia do usuário em um cluster do Dataproc.

Autenticação de usuário e outros serviços do Google Cloud Platform. A autenticação por usuário via Kerberos só se aplica ao cluster. As interações com outros serviços do Google Cloud, como o Cloud Storage, continuam sendo autenticadas como a conta de serviço do cluster.

Como ativar o modo de segurança do Hadoop com o Kerberos

Ativar o modo segurança do Kerberos e do Hadoop para um cluster incluirá a Distribuição MIT do Kerberos e configurará o YARN do Apache Hadoop, o HDFS, o Hive , o Spark e os componentes relacionados para usá-lo na autenticação.

A ativação do Kerberos cria, no cluster, um Centro de distribuição de chaves (KDC, na sigla em inglês) que contém principais de serviço e um principal de raiz, que é a conta com permissões de administrador para o KDC no cluster. Ele também pode conter principais de usuário padrão ou ser conectado, por meio de confiança entre domínios, a outro KDC que contenha os princípios do usuário.

Criar um cluster do Kerberos

É possível usar o comando gcloud ou a API Dataproc para ativar o Kerberos em clusters que usam a versão 1.3 do Dataproc ou posterior.

Recurso Beta: para configurar automaticamente o Kerberos, use --properties "dataproc:kerberos.beta.automatic-config.enable=true" (consulte Propriedades do serviço do Dataproc).

Comando gcloud

Para criar um cluster kerberos do Dataproc (imagem de versão 1.3 e posterior), use o comando gcloud dataproc clusters create.

gcloud dataproc clusters create cluster-name \  
    --image-version=1.3 \  
    --enable-kerberos

API REST

Os clusters Kerberos podem ser criados por meio do ClusterConfig.SecurityConfig.KerberosConfig como parte de uma solicitação clusters.create. Defina enableKerberos como true.

Crie um cluster do Kerberos com sua própria senha raiz principal

Siga as etapas abaixo para configurar um cluster do Kerberos que usa sua senha raiz principal

Configurar a senha principal da raiz do Kerberos

O principal raiz do Kerberos é a conta com permissões de administrador para o KDC no cluster. Para fornecer a senha do principal raiz do Kerberos com segurança, os usuários podem criptografá-la com uma chave do Serviço de gerenciamento de chaves (KMS) e armazená-la em um bucket do Google Cloud Storage que pode ser acessado pela conta de serviço do cluster. A conta de serviço do cluster precisa receber o cloudkms.cryptoKeyDecrypter Papel do IAM.

  1. Conceda o papel Criptografador/Descriptografador do Cloud KMS CryptoKey à conta de serviço do cluster:

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

  2. Crie um keyring:

    gcloud kms keyrings create my-keyring --location global
    

  3. Crie uma nova chave no keyring:

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

  4. Criptografe sua senha principal raiz do 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. Faça o upload da senha criptografada para um bucket do Cloud Storage no projeto.
      1. Exemplo:
        gsutil cp kerberos-root-principal-password.encrypted gs://my-bucket
        

Criar o cluster

Use o comando gcloud ou a API Dataproc para ativar o Kerberos em clusters com sua própria senha raiz principal.

Comando gcloud

Para criar um cluster kerberos do Dataproc (imagem de versão 1.3 e posterior), use o comando gcloud dataproc clusters create.

gcloud dataproc clusters create cluster-name \
    --region=region \
    --image-version=1.3 \
    --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

Use um arquivo de configuração YAML (ou JSON). Em vez de transmitir sinalizações kerberos-* para o comando gcloud, como mostrado acima, você pode colocar as configurações do kerberos em um arquivo de configuração YAML (ou JSON) e, em seguida, referenciar o arquivo de configuração para criar o cluster do kerberos.

  1. Crie um arquivo de configuração (consulte Certificados SSL, Configurações adicionais do Kerberos e Confiança entre domínios para configurações adicionais que podem ser incluídas no arquivo):
    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. Use o seguinte comando gcloud para criar o cluster do kerberos:
    gcloud dataproc clusters create cluster-name \
        --region=region \
        --kerberos-config-file=local path to config-file \
        --image-version=1.3
    

Considerações sobre segurança. O Dataproc descarta a forma descriptografada da senha após adicionar o principal de raiz ao KDC. Por motivos de segurança, depois de criar o cluster, é possível excluir o arquivo de senha, a chave usada para descriptografar o secret e remover a conta de serviço do papel kmsKeyDecrypter.

API REST

Os clusters Kerberos podem ser criados por meio do ClusterConfig.SecurityConfig.KerberosConfig como parte de uma solicitação clusters.create. Defina enableKerberos como verdadeiro e defina os campos rootPrincipalPasswordUri e kmsKeyUri.

Console

Ao criar um cluster com a versão de imagem 1.3 ou superior no painel "Opções avançadas" da seção "Segurança avançada", selecione Ativar modo seguro do Kerberos e do Hadoop e conclua as opções de segurança (discutidas nas seções a seguir).

Login do SO

É possível executar o gerenciamento do KDC no cluster com o comando kadmin usando o principal do usuário do Kerberos raiz ou o sudo kadmin.local. Ative o login do SO para controlar quem pode executar comandos de superusuário.

Certificados SSL

Como parte da ativação do modo seguro do Hadoop, o Dataproc cria um certificado autoassinado para ativar a criptografia SSL do cluster. Outra opção é fornecer um certificado para a criptografia SSL do cluster adicionando as seguintes configurações ao arquivo de configuração ao criar um cluster do kerberos:

  • ssl:keystore_password_uri: local no Cloud Storage do arquivo criptografado pelo KMS que contém a senha do arquivo do keystore.
  • ssl:key_password_uri: local no Cloud Storage do arquivo criptografado pelo KMS que contém a senha da chave no arquivo do keystore.
  • ssl:keystore_uri: local no Cloud Storage do arquivo do keystore que contém o certificado curinga e a chave privada usada pelos nós do cluster.
  • ssl:truststore_password_uri: local no Cloud Storage do arquivo criptografado pelo KMS que contém a senha para o arquivo truststore.
  • ssl:truststore_uri: local no Cloud Storage do arquivo de armazenamento confiável que contém certificados confiáveis.

Exemplo de arquivo de configuração:

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

Configurações adicionais do Kerberos

Para especificar um domínio Kerberos, crie um cluster kerberos com a seguinte propriedade adicionada no arquivo de configuração Kerberos:

  • realm: o nome do domínio Kerberos no cluster.

Se essa propriedade não estiver definida, o domínio dos nomes do host (em letras maiúsculas) será o domínio.

Para especificar a chave mestra do banco de dados KDC, crie um cluster do kerberos com a seguinte propriedade adicionada no arquivo de configuração do Kerberos:

  • kdc_db_key_uri: local no Cloud Storage do arquivo criptografado pelo KMS que contém a chave mestra do banco de dados KDC.

Se essa propriedade não for definida, o Dataproc gerará a chave mestra.

Para especificar o tempo máximo de vida do tíquete de concessão de tíquete (em horas), crie um cluster do kerberos com a seguinte propriedade adicionada no arquivo de configuração do Kerberos:

  • tgt_lifetime_hours: duração máxima do tíquete de concessão de tíquete em horas.

Se ela não estiver definida, o Dataproc definirá o tempo de vida do tíquete de concessão de tíquete para 10 horas.

Confiança entre domínios

Inicialmente, o KDC no cluster contém apenas o principal de administração raiz e os principais de serviços. É possível adicionar principais de usuário manualmente ou estabelecer uma relação de confiança entre domínios com um servidor externo do KDC ou do Active Directory que detenha principais de usuário. Recomenda-se que o Cloud VPN ou o Cloud Interconnect se conecte a um KDC/Active Directory local.

Para criar um cluster do kerberos compatível com a confiança entre domínios, adicione as configurações listadas abaixo ao arquivo de configuração do Kerberos ao criar um cluster do kerberos. Criptografe a senha compartilhada com o KMS e armazene-a em um bucket do Cloud Storage para que a conta de serviço do cluster possa acessá-la.

  • cross_realm_trust:admin_server: nome do host/endereço do servidor de administração remota.
  • cross_realm_trust:kdc: nome do host/endereço do KDC remoto.
  • cross_realm_trust:realm: nome do domínio remoto confiável.
  • cross_realm_trust:shared_password_uri: local no Cloud Storage da senha compartilhada criptografada pelo KMS.

Exemplo de arquivo de configuração:

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

Para habilitar a confiança entre domínios em um KDC remoto:

  1. Adicione o seguinte no arquivo /etc/krb5.conf no KDC remoto:

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

  2. Crie o usuário de confiança:

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

  3. Digite a senha do usuário quando solicitado. A senha precisa corresponder ao conteúdo do arquivo de senha compartilhada criptografada

Para habilitar a confiança entre domínios com o Active Directory, execute os seguintes comandos em um PowerShell como administrador:

  1. Crie uma definição do KDC no Active Directory.

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

  2. Crie uma confiança no Active Directory.

    netdom trust DATAPROC.REALM /Domain AD.REALM /add /realm /passwordt:TRUST-PASSWORD
    
    A senha precisa corresponder ao conteúdo do arquivo de senha compartilhada criptografada.

dataproc principal

Quando você envia um job por meio da API jobs do Dataproc a um cluster kerberos do Dataproc, ele é executado como kerberos principal dataproc do domínio kerberos do cluster.

A multilocação é compatível com um cluster kerberos do Dataproc se você enviar um job diretamente para o cluster, por exemplo, via SSH. No entanto, se o job lê ou grava em outros serviços do Google Cloud, como o Cloud Storage, ele funciona como a conta de serviço do cluster.

Propriedades de cluster padrão e personalizadas

O modo seguro do Hadoop é configurado com propriedades em arquivos de configuração (em inglês). O Dataproc define valores padrão para elas.

É possível substituir as propriedades padrão ao criar o cluster com a sinalizaçãogcloud dataproc clusters create --properties ou chamando a API clusters.create e configurando as SoftwareConfig propriedades (consulte os exemplos de propriedades do cluster).

Modo de alta disponibilidade

No modo de alta disponibilidade (HA, na sigla em inglês), um cluster do Kerberos terá três KDCs: um em cada mestre. O KDC em execução no "primeiro" mestre ($CLUSTER_NAME-m-0) será o KDC mestre e também servirá como o servidor de administração. O banco de dados do KDC mestre será sincronizado com os dois KDCs de réplica em intervalos de 5 minutos por meio de um cron job, e os três KDCs servirão para o tráfego de leitura.

Se o KDC mestre estiver inativo, o Kerberos não será nativamente compatível com a replicação em tempo real ou com o failover automático. Para executar um failover manual:

  1. Em todas as máquinas KDC, em /etc/krb5.conf, altere admin_server para o novo FQDN (nome de domínio totalmente qualificado) do mestre. Remova o antigo mestre da lista do KDC.
  2. No novo KDC mestre, configure um cron job para propagar o banco de dados.
  3. No novo KDC mestre, reinicie o processo admin_server (krb5-admin-server).
  4. Em todas as máquinas KDC, reinicie o processo (krb5-kdc).

Configuração de rede

Para garantir que os nós de trabalho possam se comunicar com o servidor de administração KDC e Kerberos em execução nos mestres, verifique se as regras de firewall VPC permitem tráfego TCP ou UDP de entrada na porta 88 e tráfego TCP de entrada na porta 749 nos mestres. No modo de alta disponibilidade, verifique se as regras de firewall VPC permitem o tráfego TCP de entrada na porta 754 nos mestres para permitir a propagação de alterações feitas no KDC mestre.

Para mais informações

Veja a documentação do Kerberos MIT (em inglês).