Nesta página, explicamos como analisar políticas de gerenciamento de identidade e acesso (IAM) de forma assíncrona e gravar resultados no BigQuery. O processo é semelhante à análise das políticas de IAM, exceto pelo fato do resultado da análise ser gravado nas tabelas do BigQuery.
Antes de começar
É necessário ativar a API Cloud Asset no seu projeto.
Se você estiver usando a API para executar essas consultas, precisará configurar o ambiente e
gcurl
.Para configurar um alias do
gcurl
, conclua as seguintes etapasSe você estiver em uma instância do Compute Engine, execute o seguinte comando.
alias gcurl='curl -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ -H "Content-Type: application/json" -X POST'
Se você não estiver em uma instância do Compute Engine, execute o seguinte comando.
alias gcurl='curl -H "$(oauth2l header --json CREDENTIALS cloud-platform)" \ -H "Content-Type: application/json" -X POST'
Em que CREDENTIALS é o caminho do arquivo de credenciais, como
~/credentials.json
.
Chamando AnalyzeIamPolicyLongrunning
O
método AnalyzeIamPolicyLongrunning
permite emitir uma solicitação de análise e receber resultados no destino do
BigQuery especificado.
gcloud
É possível chamar AnalyzeIamPolicyLongrunning
no projeto com API ativada usando
o
comando do gcloud
asset analyze-iam-policy-longrunning
. É preciso executar o SDK do Cloud versão 314.0.0 ou posterior.
Para verificar sua versão, use o comando gcloud version
.
gcloud asset analyze-iam-policy-longrunning \ --organization="ORG_ID" \ --full-resource-name="FULL_RESOURCE_NAME" \ --permissions="COMMA_SEPARATED_PERMISSIONS" \ --bigquery-dataset="projects/BQ_PROJECT_ID/datasets/BQ_DATASET_NAME" \ --bigquery-table-prefix="BQ_TABLE_PREFIX"
Por exemplo, para gravar resultados de análise de quem tem permissões compute.instances.get
e compute.instances.start
na instância do Compute Engine
ipa-gce-instance-2
no órgão 123456789 do BigQuery para o
conjunto de dados do BigQuery projects/project1/datasets/bq-dataset-01
com um prefixo de tabela como
some_prefix
, faça o seguinte:
gcloud asset analyze-iam-policy-longrunning --organization=123456789 \ --full-resource-name="//compute.googleapis.com/projects/project1/zones/us-central1-a/instances/ipa-gce-instance-2" \ --permissions="compute.instances.get,compute.instances.start" \ --bigquery-dataset="projects/project1/datasets/bq-dataset-01" \ --bigquery-table-prefix="some_prefix"
Saiba mais na ajuda:
gcloud asset analyze-iam-policy-longrunning --help
REST
Analise as políticas do IAM e grave os resultados usando
o alias gcurl
.
gcurl -d "$JSON_REQUEST" \ "https://cloudasset.googleapis.com/v1/organizations/${YOUR_ORG_ID}:analyzeIamPolicyLongrunning"
Em que:
YOUR_ORG_ID é o ID da organização, como:
123456789
JSON_REQUEST é a solicitação de análise no formato JSON. Por exemplo, para analisar quem tem permissões
compute.instances.get
ecompute.instances.start
na instância do Compute Engineipa-gce-instance-2
na organização 123456789 para o conjunto de dados do BigQueryprojects/project1/datasets/bq-dataset-01
com um prefixo de tabela comosome_prefix
, faça o seguinte:JSON_REQUEST='{ "analysisQuery":{ "scope":"organization/123456789", "resourceSelector":{ "fullResourceName":"//compute.googleapis.com/projects/project1/zones/us-central1-a/instances/ipa-gce-instance-2" }, "accessSelector":{ "permissions":[ "compute.instances.get", "compute.instances.start" ] } }, "outputConfig":{ "bigqueryDestination":{ "dataset":"projects/project1/datasets/bq-dataset-01", "tablePrefix":"some_prefix" } } }'
Como definir a chave de partição
As tabelas do BigQuery podem ser particionadas, o que pode melhorar o desempenho da consulta e reduzir o custo da consulta filtrando partições. As seguintes chaves de partição são compatíveis:
REQUEST_TIME
: o momento em que a solicitação é recebida.
Como definir a disposição de gravação
Especifica a ação que ocorre se a tabela ou partição de destino já existir. Consulte também disposição de gravação no BigQuery. Os valores a seguir são compatíveis:
WRITE_APPEND
: valor padrão. Anexa os dados à tabela ou à partição mais recente.WRITE_TRUNCATE
: substitui toda a tabela ou todos os dados das partições.WRITE_EMPTY
: retorna um erro.
Como ver os resultados da análise de política do IAM
Para visualizar sua análise de política do IAM, faça o seguinte:
Console
Acesse a página do BigQuery no Console do Cloud.
Acessar a página do BigQueryPara exibir as tabelas e visualizações no conjunto de dados, abra o painel de navegação. Na seção Recursos, selecione seu projeto para expandi-lo e selecione um conjunto de dados.
Na lista, selecione as tabelas com seu prefixo. A tabela com o sufixo
analysis
contém a consulta e os metadados (por exemplo, nome da operação, horário da solicitação e erros não críticos). A tabela com o sufixoanalysis_result
é a tupla de listagem de resultados de{identity, role(s)/permission(s), resource}
com as políticas do IAM que geram essas tuplas.Para visualizar um conjunto de dados de amostra, selecione Visualizar.
API
Para procurar os dados da tabela,
chame tabledata.list
.
No parâmetro tableId
, especifique o nome da sua tabela.
É possível configurar os seguintes parâmetros opcionais para controlar a saída.
maxResults
é o número máximo de resultados a serem retornados.selectedFields
é uma lista de colunas separadas por vírgulas a ser retornada. Se não for especificado, todas as colunas serão retornadas.startIndex
é o índice baseado em zero da primeira linha a ser lida.
Os valores são retornados incorporados em um objeto JSON para análise, conforme descrito na documentação de referência de tabledata.list
.
Como criar uma consulta
Para saber mais sobre outros casos de uso e opções para consultas, veja como analisar exemplos de consultas de políticas do IAM.
Como consultar o BigQuery
Nesta seção, apresentamos exemplos de consultas SQL para mostrar como usar
tabelas do BigQuery escritas por AnalyzeIamPolicyLongrunning
. Para mais
informações sobre a sintaxe do BigQuery, consulte
Sintaxe de consulta SQL padrão.
OP_ID é necessário para a maioria das consultas. É possível recebê-lo na
resposta
AnalyzeIamPolicyLongrunning
. Por exemplo, no gcloud, você encontrará OP_ID como 123456
em
"Usar [gcloud asset operations describe organizations/123456789/operations/AnalyzeIamPolicyLongrunning/123456]
para verificar o status da operação".
Listar operações
A tabela pode armazenar resultados de várias operações
AnalyzeIamPolicyLongrunning
. Use a seguinte consulta para listar todos eles:
SELECT DISTINCT requestTime, opName FROM `BQ_PROJECT_ID.BQ_DATASET_NAME.BQ_TABLE_PREFIX_analysis` ORDER BY 1 DESC ;
Listar análises em uma operação
Em uma operação AnalyzeIamPolicyLongrunning
, pode haver vários registros de análise
gerados. Por exemplo, quando você ativa a
opção analyze_service_account_impersonation
na solicitação, o resultado pode
conter uma análise principal (com analysisId 0) e várias análises
de representação de contas de serviço.
Use a consulta a seguir para encontrar toda a análise fornecendo um nome de operação.
DECLARE _opName STRING DEFAULT "organizations/ORG_ID/operations/AnalyzeIamPolicyLongrunning/OP_ID"; SELECT analysisId, requestTime, TO_JSON_STRING(analysis.analysisQuery, true) as analysisQuery, analysis.fullyExplored, TO_JSON_STRING(analysis.nonCriticalErrors, true) as nonCriticalErrors FROM `BQ_PROJECT_ID.BQ_DATASET_NAME.BQ_TABLE_PREFIX_analysis` WHERE opName=_opName ORDER BY 1 ;
Listar ACEs (Entradas de controle de acesso) em uma análise
Uma ACE é uma entrada de controle de acesso {identity, role(s)/permission(s), resource}
.
Você pode usar a consulta a seguir para listar as ACE em uma análise.
DECLARE _opName STRING DEFAULT "organizations/ORG_ID/operations/AnalyzeIamPolicyLongrunning/OP_ID"; SELECT DISTINCT ids.name AS identity, resources.fullResourceName AS resource, accesses.role AS role, accesses.permission AS permission FROM `BQ_PROJECT_ID.BQ_DATASET_NAME.BQ_TABLE_PREFIX_analysis_result`, UNNEST(analysisResult.identityList.identities) AS ids, UNNEST(analysisResult.accessControlLists) AS acls, UNNEST(acls.accesses) AS accesses, UNNEST(acls.resources) AS resources WHERE opName=_opName AND analysisId = 0 ORDER BY 1,2,3,4 ;
Listar ACEs (Entradas no controle de acesso) com a vinculação de política do IAM em uma análise
Nessa consulta, listamos a ACE e a vinculação de política do IAM que gera essa ACE para uma análise.
DECLARE _opName STRING DEFAULT "organizations/ORG_ID/operations/AnalyzeIamPolicyLongrunning/OP_ID"; SELECT ids.name AS identity, resources.fullResourceName AS resource, accesses.role AS role, accesses.permission AS permission, analysisResult.attachedResourceFullName as iam_policy_attached_resource, TO_JSON_STRING(analysisResult.iamBinding, true) as iam_policy_binding FROM `BQ_PROJECT_ID.BQ_DATASET_NAME.BQ_TABLE_PREFIX_analysis_result`, UNNEST(analysisResult.identityList.identities) AS ids, UNNEST(analysisResult.accessControlLists) AS acls, UNNEST(acls.accesses) AS accesses, UNNEST(acls.resources) AS resources WHERE opName=_opName AND analysisId = 0 ORDER BY 1,2,3,4 ;
Listar vinculações de políticas do IAM em uma análise
Nesta consulta, listamos as vinculações de política do IAM exibidas em uma análise.
DECLARE _opName STRING DEFAULT "organizations/ORG_ID/operations/AnalyzeIamPolicyLongrunning/OP_ID"; SELECT DISTINCT analysisResult.attachedResourceFullName as iam_policy_attached_resource, TO_JSON_STRING(analysisResult.iamBinding, true) as iam_policy_binding FROM `BQ_PROJECT_ID.BQ_DATASET_NAME.BQ_TABLE_PREFIX_analysis_result` WHERE opName=_opName AND analysisId = 0 ORDER BY 1, 2 ;
Listar vinculações da política do IAM com a ACE (Entrada de controle de acesso) em uma análise
Nesta consulta, listamos as vinculações de política do IAM com as ACEs derivadas em uma análise.
DECLARE _opName STRING DEFAULT "organizations/ORG_ID/operations/AnalyzeIamPolicyLongrunning/OP_ID"; SELECT analysisResult.attachedResourceFullName as iam_policy_attached_resource, TO_JSON_STRING(analysisResult.iamBinding, true) as iam_policy_binding, TO_JSON_STRING(analysisResult.identityList.identities, true) as identities, TO_JSON_STRING(acls.accesses, true) as accesses, TO_JSON_STRING(acls.resources, true) as resources FROM `BQ_PROJECT_ID.BQ_DATASET_NAME.BQ_TABLE_PREFIX_analysis_result`, UNNEST(analysisResult.accessControlLists) AS acls WHERE opName=_opName AND analysisId = 0 ORDER BY 1,2 ;