Esta página mostra como autorizar ações em recursos nos seus clusters do Google Kubernetes Engine (GKE) através do mecanismo de controlo de acesso baseado em funções (RBAC) incorporado no Kubernetes. O CABF do Kubernetes está ativado por predefinição, o que lhe dá um controlo detalhado sobre o acesso ao cluster.
Vai aprender a definir e atribuir autorizações precisas, criar funções e associações de funções para gerir o acesso dos utilizadores, validar o acesso à API para verificar o nível de acesso, resolver problemas comuns e compreender as limitações quando trabalha com RBAC no GKE.
Esta página destina-se a especialistas e operadores de segurança que querem usar o RBAC para melhorar a segurança nos respetivos clusters do GKE. Para saber mais sobre as funções comuns e as tarefas de exemplo que referimos no conteúdo, consulte o artigo Funções e tarefas comuns do utilizador do GKE. Google Cloud
Antes de ler esta página, certifique-se de que conhece os seguintes conceitos:
- Vista geral do RBAC do Kubernetes
- Práticas recomendadas para o RBAC do GKE para ver diretrizes que melhoram a conceção das suas políticas de RBAC.
Antes de começar
Antes de começar, certifique-se de que realizou as seguintes tarefas:
- Ative a API Google Kubernetes Engine. Ative a API Google Kubernetes Engine
- Se quiser usar a CLI gcloud para esta tarefa,
instale-a e, em seguida,
inicialize-a. Se instalou anteriormente a CLI gcloud, execute
gcloud components update
para obter a versão mais recente.
Interação com a gestão de identidade e de acesso
Pode usar a gestão de identidade e de acesso (IAM) e o RBAC do Kubernetes para controlar o acesso ao seu cluster do GKE:
O IAM não é específico do Kubernetes. Fornece gestão de identidades para vários Google Cloud produtos e opera principalmente ao nível do Google Cloud projeto.
O RBAC do Kubernetes é um componente essencial do Kubernetes e permite-lhe criar e conceder funções (conjuntos de autorizações) para qualquer objeto ou tipo de objeto no cluster.
Para autorizar uma ação, o GKE verifica primeiro uma política de RBAC. Se não existir uma política RBAC, o GKE verifica as autorizações IAM.
No GKE, o IAM e o RBAC do Kubernetes estão integrados para autorizar os utilizadores a realizar ações se tiverem autorizações suficientes de acordo com qualquer uma das ferramentas. Esta é uma parte importante do arranque de um cluster do GKE, uma vez que, por predefinição, Google Cloud os utilizadores não têm nenhuma RoleBinding do RBAC do Kubernetes.
Para autorizar utilizadores através de contas Google Cloud , o cliente tem de estar corretamente configurado para autenticar primeiro através dessas contas. Por exemplo, se estiver a usar o kubectl
, tem de configurar o comando kubectl
para fazer a autenticação no Google Cloud antes de executar quaisquer comandos que exijam autorização.
Em quase todos os casos, pode usar o RBAC do Kubernetes em vez do IAM.
Os utilizadores do GKE precisam, no mínimo, da autorização container.clusters.get
do IAM no projeto que contém o cluster.
Esta autorização está incluída na função container.clusterViewer
e noutras funções com mais privilégios. A autorização container.clusters.get
é necessária para que os utilizadores se autentiquem nos clusters do projeto, mas não os autoriza a realizar ações nesses clusters. A autorização
pode ser fornecida pelo IAM ou pelo RBAC do Kubernetes.
Defina e atribua autorizações
Pode definir regras de RBAC em objetos ClusterRole
e Role
e, em seguida, atribuir essas regras com objetos ClusterRoleBinding
e RoleBinding
da seguinte forma:
- ClusterRole: um agrupamento ao nível do cluster de recursos e operações permitidas que pode atribuir a um utilizador ou a um grupo através de um
RoleBinding
ou umClusterRoleBinding
. - Função: um agrupamento com espaço de nomes de recursos e operações permitidas que pode atribuir a um utilizador ou a um grupo de utilizadores através de um
RoleBinding
. - ClusterRoleBinding: atribui um
ClusterRole
a um utilizador ou a um grupo para todos os namespaces no cluster. - RoleBinding: atribui uma
Role
ou umaClusterRole
a um utilizador ou um grupo num namespace específico.
Quando usa um RoleBinding
para atribuir um ClusterRole
a um utilizador ou a um grupo, esses utilizadores e grupos só podem aceder a recursos no espaço de nomes que especificar no RoleBinding
. Se quiser que os utilizadores ou os grupos acedam ao recurso em todos os
namespaces, use um ClusterRoleBinding
.
Defina autorizações através de funções ou ClusterRoles
Define autorizações num objeto Role ou ClusterRole. Uma função define o acesso a recursos num único espaço de nomes, enquanto uma função de cluster define o acesso a recursos em todo o cluster.
Os Roles e os ClusterRoles têm a mesma sintaxe. Cada um tem uma secção rules
, onde define os recursos aos quais a regra se aplica e as operações permitidas para a função. Por exemplo, a seguinte atribuição de função concede acesso de leitura (get
, watch
e list
) a todos os pods no espaço de nomes accounting
:
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: accounting
name: pod-reader
rules:
- apiGroups: [""] # "" indicates the core API group
resources: ["pods"]
verbs: ["get", "watch", "list"]
Consulte a documentação da API Role e ClusterRole para ver uma lista completa dos campos permitidos.
Role
vs. ClusterRole
Uma vez que as autorizações concedidas por um ClusterRole se aplicam a todo o cluster, pode usar ClusterRoles para controlar o acesso a diferentes tipos de recursos do que com as funções. Por exemplo:
- Recursos com âmbito de cluster, como nós
- Pontos finais REST não de recursos, como
/healthz
- Recursos com espaço de nomes em todos os espaços de nomes (por exemplo, todos os pods em todo o cluster, independentemente do espaço de nomes)
Atribua funções através de RoleBindings ou ClusterRoleBindings
Depois de criar uma função ou uma ClusterRole, atribui-a a um utilizador ou a um grupo de utilizadores criando uma RoleBinding ou uma ClusterRoleBinding. Os utilizadores e os grupos são denominados
subjects
e podem ser qualquer uma das seguintes opções:
Tipo de assunto | Valor para kind |
Valor para name |
---|---|---|
Google Cloud conta de utilizador | User |
Google Cloud Endereço de email registado |
Conta de serviço do Kubernetes | ServiceAccount |
O nome de um objeto Kubernetes ServiceAccount no cluster |
Conta de serviço do IAM | User |
Endereço de email da conta de serviço de IAM gerado automaticamente |
Endereço do Grupo Google num domínio validado | Group |
Endereço de email de um grupo do Google Workspace que é membro do grupo gke-security-groups . Para ver instruções sobre como configurar os Grupos Google para o RBAC, consulte o artigo Configure os Grupos Google para o RBAC. |
A RoleBinding seguinte concede a função pod-reader
a um utilizador, a uma conta de serviço do Kubernetes, a uma conta de serviço do IAM e a um grupo Google:
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: pod-reader-binding
namespace: accounting
subjects:
# Google Cloud user account
- kind: User
name: janedoe@example.com
# Kubernetes service account
- kind: ServiceAccount
name: johndoe
# IAM service account
- kind: User
name: test-account@test-project.iam.gserviceaccount.com
# Google Group
- kind: Group
name: accounting-group@example.com
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io
Valide o acesso à API através de kubectl
kubectl
fornece o subcomando auth can-i
para consultar rapidamente a camada de autorização da API. Enquanto administrador da plataforma, pode ter de se fazer passar por utilizadores para determinar que ações podem realizar. Pode usar o auth can-i
e transmitir uma flag --as
adicional.
Quando executa o comando kubectl auth can-i
sem o sinalizador --as
, a gestão de identidade e de acesso (IAM) realiza a autorização. Por outro lado, quando anexa a flag --as
, o RBAC do Kubernetes executa a autorização. Por conseguinte, tem de criar os objetos Role
e RoleBinding
necessários para o RBAC.
Para mais informações, consulte o artigo Validar o acesso à API.
Utilização e exemplos da API
Para obter informações completas sobre a utilização da API Kubernetes para criar os objetos Role
, ClusterRole
, RoleBinding
e ClusterRoleBinding
necessários para o CABF, consulte o artigo Utilizar a autorização de controlo de acesso baseado em funções na documentação do Kubernetes.
Resolva problemas de RBAC
Para depurar problemas com o RBAC, use o registo de auditoria da atividade do administrador, que está ativado em todos os clusters por predefinição. Se o acesso a um recurso ou a uma operação for recusado devido à falta de autorizações suficientes, o servidor da API regista um erro, juntamente com informações adicionais, como a associação implícita e explícita do utilizador ao grupo.RBAC DENY
Se estiver a usar o Google Groups para RBAC, google groups
aparece na mensagem de registo.
Limitações
As secções seguintes descrevem interações que podem não parecer óbvias quando trabalha com o RBAC e o IAM do Kubernetes.
Funções de descoberta predefinidas
Os clusters são criados com um conjunto de ClusterRoles e ClusterRoleBindings predefinidos.
Os pedidos feitos com credenciais válidas são colocados no grupo system:authenticated
, enquanto todos os outros pedidos pertencem ao grupo system:unauthenticated
.
O system:basic-user
ClusterRole permite que os utilizadores criem
SelfSubjectAccessReviews
para testar as respetivas autorizações no cluster. A função system:discovery
permite que os utilizadores leiam APIs de deteção, que podem revelar informações sobre os CustomResourceDefinitions
adicionados ao cluster.
Os utilizadores anónimos (system:unauthenticated
) recebem o
system:public-info-viewer
ClusterRole, que concede acesso só de leitura
às APIs /healthz
e /version
.
Para ver os pontos finais da API permitidos pelo system:discovery
ClusterRole, execute o seguinte comando:
kubectl get clusterroles system:discovery -o yaml
Erro proibido para contas de serviço em Google Cloud instâncias de VM
O seguinte erro pode ocorrer quando a instância de VM não tem o âmbito
userinfo-email
:
Error from server (Forbidden): error when creating ... "role-name" is forbidden: attempt to grant extra privileges:...
Por exemplo, suponha que a VM tem o âmbito cloud-platform
, mas não tem o âmbito userinfo-email
. Quando a VM recebe um token de acesso, Google Cloud
associa esse token ao âmbito cloud-platform
. Quando o servidor da API Kubernetes pede Google Cloud a identidade associada à chave de acesso,
recebe o ID exclusivo da conta de serviço e não o email da conta de serviço.
Para fazer a autenticação com êxito, crie uma nova VM com o âmbito userinfo-email
ou crie uma nova associação de funções que use o ID exclusivo.
Para criar uma nova instância de VM com o âmbito userinfo-email
, execute o seguinte comando:
gcloud compute instances create INSTANCE_NAME \
--service-account SERVICE_ACCOUNT_EMAIL \
--scopes userinfo-email
Para criar uma nova associação de funções que use o ID exclusivo da conta de serviço para uma VM existente, siga estes passos:
Identifique o ID exclusivo da conta de serviço:
gcloud iam service-accounts describe SERVICE_ACCOUNT_EMAIL
Por exemplo, o seguinte resultado apresenta o
uniqueId
para a conta de serviçomy-iam-account@somedomain.com
:displayName: Some Domain IAM service account email: my-iam-account@somedomain.com etag: BwWWja0YfJA name: projects/project-name/serviceAccounts/my-iam-account@somedomain.com oauth2ClientId: '123456789012345678901' projectId: project-name uniqueId: '123456789012345678901'
Crie uma associação de funções com o
uniqueId
da conta de serviço:kubectl create clusterrolebinding CLUSTERROLEBINDING_NAME \ --clusterrole cluster-admin \ --user UNIQUE_ID
Autorização para criar ou atualizar funções e associações de funções
No Kubernetes, só pode criar ou atualizar uma função ou uma associação de funções com autorizações específicas se cumprir as seguintes condições:
- Criar ou atualizar uma função: já tem de ter as mesmas autorizações
que quer conceder à função. Em alternativa, tem de ter autorização para executar o verbo
escalate
na função. - Criar ou atualizar uma associação de funções: já tem de ter as mesmas autorizações concedidas na função que está a ser associada, com o mesmo âmbito que a associação de funções. Em alternativa, tem de ter autorização
para executar o verbo
bind
na função referenciada.
Se as autorizações que está a conceder na função lhe foram originalmente concedidas através de uma política de autorização do IAM em vez do RBAC, o seu pedido de função ou associação de funções pode falhar. Por exemplo, considere o seguinte pedido de criação de funções de um utilizador ao qual foram concedidas as autorizações de IAM container.pods.*
e container.roles.create
:
kubectl create role allowed-to-view-pods --resource pods --verb list,get
Se as autorizações tiverem sido concedidas ao utilizador apenas através do IAM, pode ocorrer o seguinte erro:
Error from server (Forbidden): clusterroles.rbac.authorization.k8s.io "allowed-to-view-pods" is forbidden:
user "caller@example.com" (groups=["system:authenticated"]) is attempting to grant RBAC permissions not currently held:
{APIGroups:[""], Resources:["pods"], Verbs:["list" "get"]}
Para mitigar esta limitação, conceda ao autor da chamada as autorizações na função através do RBAC em vez do IAM.
Em alternativa, pode usar RBAC ou IAM para conceder ao autor da chamada o verbo escalate
, o verbo bind
ou ambos. No entanto, o GKE não recomenda esta abordagem, porque o autor da chamada pode conceder qualquer autorização a qualquer função.
O que se segue?
- Saiba como criar políticas de IAM.
- Saiba como configurar os Grupos Google para o RBAC.