top of page

Databricks - Gerar um Personal Access Token (PAT) para uma ServicePrincipal - Automatize seus apps

Fala dataholics, no tema de hoje falaremos um pouco sobre segurança, é comum surgir a necessidade de conectar no Databricks com uma ferramenta externa e para isso usar uma conta de usuário normal pode não ser a melhor opção, pois, a maioria dos ambientes possui duplo fator de autenticação, logo a melhor saída é utilizar uma ServiceAccount ou Conta de serviço e mostrarei aqui algumas dicas.

Service Account, App Registration e Service Principal, independente da nomenclatura, elas têm um papel muito importante na arquitetura de aplicações (e dados) e você precisa conhecer sobre isso, o tema de hoje será sobre App Registration e Service Principal no Azure Databricks.


No Azure há algumas maneiras de liberar acessos para aplicações e pessoas, para comunicação de aplicações entre aplicações temos algumas maneiras como Managed Identity (mais recomendado no ecossistema Azure sem necessidade de tokens ou senhas) e App Registration ou Enterprise Application, para conectar com aplicações externas ou de terceiros essa é uma boa recomendação, usando um token ou secret.


Dentro do Azure Databricks também temos uma forma de conectar com aplicações usando uma Service Principal que estará atrelada a uma App Registration no seu Microsoft Entra ID (Azure Active Directory) e no post de hoje mostrarei como configurar e gerar um PAT para essa Service Principal.


Gerar um PAT (Personal access token) é realmente simples, porém, por padrão ela só vem habilitada para Admins gerarem, recomendo fortemente manter assim e liberar essa opção selecionadamente e, em geral, para Service Principal.


Contudo, gerar um PAT para uma Service Principal já não é tão simples como gerar um PAT para um login, pois, você não loga no portal com uma Service principal, isso que veremos aqui hoje.


O que veremos hoje:

  1. Criar App Registration no Azure

  2. Gerar Secret para essa App

  3. Criar ServicePrincipal no Databricks vinculado nessa App

  4. Liberar acesso da ServicePrincipal em um grupo específico

  5. Listar groupid via API

  6. Criar um token temporário para chamar a API do Databricks

  7. Liberar acesso de criação de PAT para uma ServicePrincipal

  8. Criar PAT para a ServicePrincipal

  9. Listar token daquela ServicePrincipal via API

  10. Testar PAT chamando uma API do Databricks

  11. Usando nossa ServicePrincipal em um Job

  12. Boas práticas e recomendações

Bom nesse ponto é importante ressaltar que a maneira de configurar esse token difere nas três Clouds (Azure, GCP e AWS) cada uma possui seus próprios termos como Service Account ou App Registration, embora, no Databricks sempre vamos nos referir como Service Principal, no exemplo de hoje focaremos no Azure Databricks.

 

Uma ServicePrincipal no Databricks é uma maneira de liberar acesso para ferramentas externas, ou usar em suas automações e jobs, sem precisar criar um login no domínio da empresa para aquela aplicação, pode ser muito útil e recomendado para algumas coisas como:

  • Tirar dependências de logins nominais, ou seja, ao invés de deixar os owners de objetos com uma pessoa (login nominal), você pode colocar uma ServicePrincipal, assim se o dono daquele objeto perder o acesso, nada acontecerá, exemplo, pode configurar nos seus Jobs Databricks para executar com uma ServicePrincipal

  • Liberar acessos para ferramentas externas, exemplo, pode utilizar para acessar com o Power BI, ao invés de deixar o acesso configurado no login do pedrinho@datainaction, você configura uma ServicePrincipal para aquele ambiente, assim se o pedrinho sair, nada vai parar de funcionar.

  • Gerenciar quem pode gerar PAT (personal access token), é muito valido não deixar essa opção liberada para todos os usuários, libere apenas para ServicePrincipal e admins.

Para criarmos uma ServicePrincipal no Azure Databricks ela precisa estar vinculada a uma AppRegistration la no seu Microsoft Entra ID (antigo AAD), uma AppRegistration tem o mesmo objetivo de uma ServicePrincipal, porém, no escopo do Azure.

Para casos de automações com aplicações do ecossistema Azure recomendo utilizar uma Managed Identity, uma maneira mais simples de conceder acesso e sem precisar de tokens ou senhas, mas para hoje, vamos de AppRegistration.


Primeiro passo, acesse seu portal Azure e dentro do Microsoft Entra ID vá na aba App Registrations e clique em New Registration.


De um nome para sua App e registre ela.

Essas são as informações que serão geradas, você usara o client ID e é necessário gerar uma secret.

Na aba Certificates & secrets, crie uma nova secret e defina um tempo de expiração, salve bem essa secret, de preferência em um Key Vault.


Pronto, agora é só pegar essa secret e usar nas minhas Apps? Nops, não é tão simples assim.


Agora vamos para o Databricks, precisaremos criar uma ServicePrincipal e um PAT para ela, atualmente conseguimos criar uma ServicePrincipal pela interface gráfica, mas o token somente via API, então faremos tudo via código.


Criando a ServicePrincipal vinculada a nossa AppRegistration, note que também já estou adicionando ela em um grupo específico.

Ela já fica disponível visualmente no Databricks.

Como encontrar o GroupID para colocar no script? (Você pode criar sem grupo também e adicionar manualmente depois)


Via script, listando todos os grupos via API ou SDK.


E agora visualmente também é possível.


Listando as ServicePrincipal, seria equivalente à tela do print anterior, mas via código, tem gente que já prefere ver um belo JSON do que uma interface gráfica não é?


E agora Reginaldo, é só gerar o PAT para ServicePrincipal correto? Calma, ainda não.


Primeiro precisamos gerar um Token temporário para a nossa App e com esse token sim usaremos para gerar o PAT.


Gerei o token usando a AppRegistration e a secret que criamos la no começo, agora com esse token que expira em 1 hora, usaremos para chamar a API do Databricks e criar um PAT para nossa ServicePrincipal.

Obs: Você poderia usar esse token, embora ele tenha expiração de 1 hora, não seria últil para a maioria dos casos, geralmente alguns SDKs usam esse token e ele controlam isso internamente.


Agora vai, não pera, acesso negado?!


Geração de PAT por padrão vem habilitada, mas só quem é admin pode criar PAT.

Vamos liberar somente nossa ServicePrincipal para gerar PAT.


Agora sim, PAT gerado com sucesso, use o valor retornado em token_value.

Para listar os tokens de uma ServicePrincipal, faça uma chamada na API /token/list usando o token gerado para ela e você verá todos os tokens daquele login.


Por último, testaremos esse Token, usarei ele em uma chamada de API para listar clusters, ele precisa retornar apenas os clusters em que aquela ServicePrincipal ou o grupo que ela pertence possui acesso, nesse caso tenho 4 clusters criados e essa app tem acesso em apenas 1 deles, o retorno abaixo é somente de 1 cluster.


Para mostrar um exemplo de usabilidade, trocarei o Owner de um job para usar a ServicePrincipal.

Esse Job abaixo esta rodando com o login Reginaldo Silva, mas e se o Reginaldo Silva for demitido? Já sabe né, coisas vão parar de funcionar, evite Jobs com logins nominais.


Vá até o final do Job e clique em Permissions.

Na mesma alteração, adicione a ServicePrincipal como Owner e troque o Reginaldo Silva para Can Manage e salve a alteração.


Pronto, o Creator se mantém para rastreabilidade, mas agora o Job rodará com a nossa ServicePrincpal.


Bom, agora sim finalizamos, porém, deixo algumas considerações.

  • Só libere PAT assim para casos específicos onde de fato será usado por uma aplicação de terceiro, uma automação, uso interno para deixar como Owner de jobs e clusters.

  • Não entregue o token na mão de usuários, diferente do login e senha, o token é muito mais fácil de compartilhar.

  • Restrinja bem o acesso daquele token, liberando apenas os acessos necessários para aquele projeto que ele precisa.

  • Use um tempo de expiração para renovar o token a cada x meses, isso forçara pessoas indevidas perderem o acesso.

  • Salve o token em um cofre de senhas como o Keyvault

Resumindo tudo que fizemos:

  1. Criar App Registration no Azure

  2. Gerar Secret para essa App

  3. Criar ServicePrincipal no Databricks vinculado nessa App

  4. Liberar acesso da ServicePrincipal em um grupo específico

  5. Listar grupid via API

  6. Criar um token temporário para chamar a API do Databricks

  7. Liberar acesso de criação de PAT para uma ServicePrincipal

  8. Criar PAT para a ServicePrincipal

  9. Listar token daquela ServicePrincipal via API

  10. Testar PAT chamando uma API do Databricks

  11. Usando nossa ServicePrincipal em um Job.

Espero que esse post te ajude.


Link Script:


Fique bem e até a próxima.


Referências:





176 visualizações0 comentário

Comments


Post: Blog2 Post
bottom of page