Configurar o Kerberos para endpoints do Thrift do metastore do Dataproc

Nesta página, explicamos como configurar o Kerberos para seu serviço Metastore do Dataproc que usa o protocolo de endpoint do Thrift. Se o serviço Metastore do Dataproc usar o protocolo de endpoint do gRPC, consulte Configurar o Kerberos para endpoints do gRPC.

Antes de começar

  • Entenda os princípios básicos do Kerberos.

    Nestas instruções, você usará um cluster do Dataproc para criar os seguintes recursos do Kerberos:

    • Um arquivo Keytab.
    • Um arquivo krb5.conf.
    • Um principal do Kerberos.

    Para saber mais sobre como esses recursos do Kerberos funcionam com um serviço do Metastore do Dataproc, consulte Sobre o Kerberos.

  • Crie e hospede seu próprio KDC do Kerberos ou aprenda a usar o KDC local de um cluster do Dataproc.

  • Crie um bucket do Cloud Storage ou acesse um atual. Você precisa armazenar o arquivo krb5.conf nesse bucket.

Considerações sobre a rede

Antes de configurar o Kerberos, considere as seguintes configurações de rede:

  • Configure uma conexão IP entre a rede VPC e o KDC. Isso precisa ser feito para autenticar o arquivo KDC com o serviço Dataproc Metastore.

  • Configure todas as regras de firewall necessárias no KDC. Essas regras são necessárias para permitir o tráfego do Metastore do Dataproc. Para mais informações, consulte Regras de firewall para seus serviços.

  • Se você estiver usando o VPC Service Controls, o secret do Secret Manager e o objeto krb5.conf do Cloud Storage precisam pertencer a um projeto que reside no mesmo perímetro de serviço que o serviço Metastore do Dataproc.

  • Decida qual rede de peering VPC você quer usar. Configure o cluster do Dataproc e o serviço do Metastore do Dataproc com a mesma rede de peering VPC.

Papéis necessários

Para conseguir a permissão necessária para criar um metastore do Dataproc com o Kerberos, peça ao administrador para conceder a você os seguintes papéis do IAM no seu projeto, com base no princípio de privilégio mínimo:

Para mais informações sobre como conceder papéis, consulte Gerenciar acesso.

Esse papel predefinido contém a permissão metastore.services.create, que é necessária para criar um metastore do Dataproc com o Kerberos.

Talvez você também consiga essa permissão com papéis personalizados ou outros papéis predefinidos.

Para saber mais sobre papéis e permissões específicos do Dataproc Metastore, consulte Gerenciar acesso com o IAM.

Para mais informações, consulte IAM e Dataproc de controle de acesso.

Ativar o Kerberos para o metastore do Dataproc

As instruções a seguir mostram como configurar o Kerberos para um serviço Metastore do Dataproc anexado a um cluster do Dataproc.

Criar um cluster do Dataproc e ativar o Kerberos

gcloud

Para configurar um cluster do Dataproc com o Kerberos, execute o seguinte comando gcloud dataproc clusters create:

gcloud dataproc clusters create CLUSTER_NAME \
    --image-version=2.0 \
    --enable-kerberos \
    --scopes 'https://www.googleapis.com/auth/cloud-platform'

Substitua:

  • CLUSTER_NAME: o nome do cluster do Dataproc.

Configurar o cluster do Dataproc para o kerberos

As instruções a seguir mostram como usar o SSH para se conectar a um cluster principal do Dataproc associado ao serviço Metastore do Dataproc.

Depois, modifique o arquivo hive-site.xml e configure o Kerberos para seu serviço.

  1. No console do Google Cloud, acesse a página Instâncias de VM.
  2. Na lista de instâncias de máquina virtual, clique em SSH na linha do nó principal do Dataproc (your-cluster-name-m).

    Uma janela de navegador é aberta no diretório principal do nó.

  3. Abra o arquivo /etc/hive/conf/hive-site.xml.

    sudo vim /etc/hive/conf/hive-site.xml
    

    O resultado será semelhante a este:

    <property>
    <name>hive.metastore.kerberos.principal</name>
    <value>PRINCIPAL_NAME</value>
    </property>
    <property>
    <name>hive.metastore.kerberos.keytab.file</name>
    <value>METASTORE_PRINCPAL_KEYTAB</value>
    </property>
    

    Substitua:

    • PRINCIPAL_NAME: um nome principal, no seguinte formato primary/instance@REALM. Por exemplo, hive/test@C.MY-PROJECT.INTERNAL.
    • METASTORE_PRINCIPAL_KEYTAB: o local do arquivo keytab do Metastore do Hive. Use o valor a seguir /etc/security/keytab/metastore.service.keytab.

Criar um arquivo keytab

As instruções a seguir mostram como criar um arquivo keytab.

Um arquivo keytab contém um par de principais do Kerberos e um par de chaves criptografadas. É usado para autenticar um principal de serviço com um KDC do Kerberos.

Para criar um arquivo keytab

  1. Na sessão SSH do Dataproc, crie o keytab e o principal.

    sudo kadmin.local -q "addprinc -randkey PRINCIPAL_NAME"
    sudo kadmin.local -q "ktadd -k /etc/security/keytab/metastore.service.keytab PRINCIPAL_NAME"
    
  2. Na sessão SSH do Dataproc, crie e faça upload do arquivo keytab para o Secret Manager.

    gcloud secrets create SECRET_NAME --replication-policy automatic
    sudo gcloud secrets versions add SECRET_NAME --data-file /etc/security/keytab/metastore.service.keytab

    Substitua:

    • SECRET_NAME: o nome do secret.

Atualizar o arquivo krb5.conf

Em seguida, atualize o arquivo krb5.conf para associá-lo ao cluster do Dataproc.

  1. Determine o endereço IP interno primário da instância principal do cluster do Dataproc.

    gcloud compute instances list
    

    Por exemplo, executar este comando produz uma saída semelhante:

    ~$ gcloud compute instances list --project kerberos-project
    NAME                                                 ZONE           MACHINE_TYPE   PREEMPTIBLE  INTERNAL_IP    EXTERNAL_IP     STATUS
    cluster-236-m                                        us-central1-c  n2-standard-4               192.0.2.2      *.*.*.*         RUNNING
    ...
    

    Nesse caso, o endereço IP interno do cluster é 192.0.2.2.

  2. Abra o arquivo krb5.conf.

    sudo vim /etc/krb5.conf
    
  3. No arquivo, substitua os parâmetros KDC e admin_server atuais pelo endereço IP interno do cluster do Dataproc.

    Por exemplo, o valor do endereço IP das etapas anteriores é semelhante a esta saída.

    [realms]
    US-CENTRAL1-A.C.MY-PROJECT.INTERNAL = {
       kdc = 192.0.2.2
       admin_server = 192.0.2.2
    }
    
  4. Faça upload do arquivo /etc/krb5.conf da VM principal do Dataproc para o bucket do Cloud Storage.

    gsutil cp /etc/krb5.conf gs://PATH_TO_KRB5
    

    Substitua:

    • PATH_TO_KRB5: o URI do Cloud Storage que contém o arquivo krb5.conf.

    Depois que o upload for concluído, copie o caminho dele. É preciso usá-lo ao criar o serviço do Dataproc Metastore.

Conceder papéis e permissões do IAM

  1. Forneça à conta de serviço do Dataproc Metastore permissão para acessar o arquivo keytab. Essa conta é gerenciada pelo Google e aparece na página da UI de permissões do IAM selecionando Incluir concessões de papéis fornecidas pelo Google.

      gcloud projects add-iam-policy-binding PROJECT_ID \
          --member serviceAccount:service-PROJECT_NUMBER@gcp-sa-metastore.iam.gserviceaccount.com \
          --role roles/secretmanager.secretAccessor

  2. Forneça à conta de serviço do Dataproc Metastore com permissão para acessar o arquivo krb5.conf.

      gcloud projects add-iam-policy-binding PROJECT_ID \
          --member serviceAccount:service-PROJECT_NUMBER@gcp-sa-metastore.iam.gserviceaccount.com \
          --role roles/storage.objectViewer

Criar um serviço Metastore do Dataproc com o Kerberos

Crie um novo serviço do Dataproc Metastore configurado com seus arquivos do Kerberos.

Certifique-se de criar o serviço na rede VPC como o cluster do Dataproc.

gcloud metastore services create SERVICE \
   --location=LOCATION \
   --instance-size=medium \
   --network=VPC_NETWORK \
   --kerberos-principal=KERBEROS_PRINCIPAL \
   --krb5-config=KRB5_CONFIG \
   --keytab=CLOUD_SECRET

Substitua:

  • SERVICE: o nome do serviço do Metastore do Dataproc.
  • LOCATION: o local do serviço Metastore do Dataproc.
  • VPC_NETWORK:o nome da rede VPC. Use a mesma rede configurada no cluster do Dataproc.
  • KERBEROS_PRINCIPAL: o nome do principal do Kerberos que você criou anteriormente.
  • KRB5_CONFIG: o local do arquivo krb5.config. Use o URI do objeto do Cloud Storage que aponta para o arquivo.
  • CLOUD_SECRET: o nome do recurso relativo de uma versão do secret do Secret Manager.

Depois de criar o cluster, o metastore do Dataproc tenta se conectar com suas credenciais do Kerberos usando o principal, o keytab e o arquivo krb5.conf fornecidos. Se a conexão falhar, a criação do metastore do Dataproc também vai falhar.

Após a criação do serviço Metastore do Dataproc, localize o URI do endpoint do Thrift e o diretório do armazenamento.

  1. Conecte-se por SSH à instância principal do seu cluster do Dataproc.

  2. Na sessão SSH, abra o arquivo /etc/hive/conf/hive-site.xml.

    sudo vim /etc/hive/conf/hive-site.xml
    
  3. Modifique /etc/hive/conf/hive-site.xml no cluster do Dataproc.

    <property>
    <name>hive.metastore.uris</name>
    <!-- Update this value. -->
    <value>ENDPOINT_URI</value>
    </property>
    <!-- Add this property entry. -->
    <property>
    <name>hive.metastore.warehouse.dir</name>
    <value>WAREHOUSE_DIR</value>
    </property>
    
  4. Reinicie o HiveServer2:

    sudo systemctl restart hive-server2.service
    

Configure o Dataproc antes de enviar jobs

Para executar os jobs do Dataproc, adicione o usuário hive à propriedade allowed.system.users no arquivo container-executor.cfg do Hadoop. Isso permite que os usuários executem consultas para acessar dados, como select * from.

  1. Na sessão SSH, abra o arquivo container-executor.cfg do Hadoop.

    sudo vim /etc/hadoop/conf/container-executor.cfg
    

    Adicione a linha a seguir a cada nó do Dataproc.

    allowed.system.users=hive
    

Comprar um ingresso do kerberos

  1. Consiga o tíquete kerberos antes de se conectar à instância do metastore do Dataproc.

    sudo klist -kte /etc/security/keytab/metastore.service.keytab
    sudo kinit -kt /etc/security/keytab/metastore.service.keytab PRINCIPAL_NAME
    sudo klist # gets the ticket information.
    sudo hive
    

    Substitua:

    • PRINCIPAL_NAME: o nome do principal.

A seguir