No cadastro da SA, expanda a seção Configurações Avançadas e copie o Cliend ID que será exibido dentro do Domain-wide Delegation. Esta infomação será usada no passo seguinte.
1.2. Ativação do Domain-Wide Delegation
Para permitir que a Service Account atue em nome dos usuários finais:
Acesse o Google Workspace Admin Console. Você pode realizar o acesso clicando na opção View Google Workspace Admin Console do passo anterior.
No menu lateral vá em Segurança > Controle de Dadoes e Acesso > Controles de API.
Na seção Domain wide delegation clique em Gerenciar delegação de todo o domínio.
Adicione um novo cliente OAuth:
ID do cliente: Cole o Client ID da SA do passo 1.4.
Escopos de API: Inclua os escopos necessários:
Clique em Authorize para salvar as alterações.
Com isso, a Service Account pode ser usada para personificar usuários do domínio e garantir que as permissões sejam aplicadas de acordo com os e-mails cadastrados na tabela de segurança.
1.3. Concessão de Permissões à SA no Projeto Alvo
Garanta que a SA possua os papéis mínimos necessários no BigQuery:
Nível IAM:
bigquery.jobs.create
bigquery.readsessions.create
bigquery.readsessions.getData
Nível do Dataset (Leitura):
bigquery.datasets.get
bigquery.jobs.create
bigquery.tables.get
bigquery.tables.getData
bigquery.tables.list
2. Cadastro de Usuários no Projeto Alvo
2.1. Cadastro dos Usuários no Workspace
Garanta que todos os usuários que terão acesso aos dados estejam devidamente cadastrados no Workspace onde a SA com Domain Wide foi cadastradas.
Garanta também que o e-mail de cadastro dos usuários é o mesmo que será usado na tapa 3.
2.2. Permissões de Usuários no BigQuery
Mesmo utilizando impersonificação e tabela de segurança, é necessário que os usuários finais possuam permissões de acesso ao BigQuery dentro do projeto.
Cada usuário deve ter, no mínimo:
roles/bigquery.user – permite executar queries.
bigquery.jobs.create
bigquery.readsessions.create
bigquery.readsessions.getData
Permissões herdadas de dataset/tabelas, caso a organização aplique controles adicionais de IAM em nível de recurso.
Importante:
Se o usuário não tiver permissão de acesso ao BigQuery no projeto, a personificação não funcionará.
A tabela de segurança restringe quais linhas o usuário pode ver, mas não substitui a necessidade de permissão básica de acesso ao serviço.
2.3. Cadastro da Tabela de Permissões
O BigQuery permite até 400 RAPs por tabela.
Para contornar essa limitação:
Aplicamos subqueries em cada RAP, usando a tabela de permissões.
Assim, podemos filtrar até 399 campos diferentes.
Mantemos 1 RAP reservada para a política de full access (quando o usuário precisa visualizar todos os dados sem restrições).
Lembre-se que após criar RAPs em uma tabela, apenas usuários que estão contemplados por elas conseguem acessar os dados. Com isso, SEMPRE crie uma RAP de full access para quem for pertinente.
Crie uma tabela dedicada para armazenar permissões por usuário.
A coluna principal (usuário) precisa conter os mesmos emails que estão cadastrados para os usuários do workspace.
CREATE OR REPLACE ROW ACCESS POLICY full_access_policy
ON `projeto.dataset.tabela_vendas`
GRANT TO ("user:[email protected]")
FILTER USING (
TRUE
)
);
CREATE OR REPLACE ROW ACCESS POLICY loja_policy
ON `projeto.dataset.tabela_vendas`
GRANT TO ("allAuthenticatedUsers")
FILTER USING (
loja_id IN (
SELECT loja_id
FROM `project.dataset.tabela_permissionamento`
WHERE usuario = SESSION_USER()
)
);
from google.oauth2 import service_account
from google.cloud import bigquery
# Carrega a chave da SA
creds = service_account.Credentials.from_service_account_file(
filename="caminha_para_sua_sa.json",
scopes=["https://www.googleapis.com/auth/bigquery"]
)
# Impersona um usuário específico
impersonated_creds = creds.with_subject("email_do_usuario")
# Agora você usa impersonated_creds no cliente BigQuery
client = bigquery.Client(
credentials=impersonated_creds,
project="seu_project_id"
)
query = """
SELECT
*
FROM `project.dataset.tabela_vendas`
"""
for row in client.query(query):
print(row)