Quando as ClusterRoles predefinidas no console do Container Service for Kubernetes (ACK) não atendem aos seus requisitos, crie Roles e ClusterRoles personalizadas para implementar um controle de acesso baseado em função (RBAC) granular.
Políticas de RBAC personalizadas
Crie manifestos YAML personalizados para Roles e ClusterRoles a fim de implementar controle de acesso granular sobre os recursos no seu cluster ACK. Utilize os exemplos a seguir como referência.
Mecanismo de RBAC do Kubernetes
Role (escopo de namespace)
Uma Role define um conjunto de permissões restritas a um único namespace. Em seguida, uma RoleBinding vincula essa Role a sujeitos, garantindo que as permissões tenham efeito apenas naquele namespace. O exemplo YAML abaixo define uma Role chamada my-role, que concede acesso de leitura aos recursos de Pod no namespace padrão.
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: my-role
rules: # A list of permission rules.
- apiGroups: [""] # The API group of the resource. An empty string "" indicates the core API group.
resources: ["pods"] # The resource type that the rule applies to.
verbs: ["get", "list"] # The actions that are allowed on the resource.
ClusterRole (escopo de cluster)
Uma ClusterRole estabelece um conjunto de permissões válidas para todo o cluster. Posteriormente, uma ClusterRoleBinding associa a ClusterRole aos sujeitos, permitindo que as permissões se apliquem em todo o ambiente. O exemplo YAML a seguir cria uma ClusterRole denominada my-clusterrole, liberando a leitura de recursos de Pod e Service no cluster.
A ClusterRole é um recurso com escopo de cluster. Especificar um namespace no YAML não produz nenhum efeito.
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
# namespace: default # A namespace is not required for a ClusterRole.
name: my-clusterrole
rules: # A list of permission rules.
- apiGroups: [""] # The API group of the resource.
resources: ["pods"] # The resource type.
verbs: ["get", "list"] # The allowed actions.
- apiGroups: [""]
resources: ["services"]
verbs: ["get", "list"]
Políticas comuns de recursos
-
Permissões de leitura
get: Lê os detalhes de um recurso específico.list: Lista uma coleção de recursos.watch: Monitora alterações nos recursos e recebe atualizações em tempo real.
-
Permissões de escrita
create: Cria uma nova instância de recurso.update: Modifica um recurso existente.patch: Aplica uma modificação parcial a um recurso existente.delete: Exclui um recurso especificado.
|
Nome do recurso |
Tipo de recurso (resources) |
Grupo de API (apiGroups) |
Permissões (verbs) |
|
Pod |
resources: ["pods"] |
|
|
|
Service |
resources: ["services"] |
apiGroups: [""] |
|
|
ConfigMap |
resources: ["configmaps"] |
apiGroups: [""] |
|
|
Secret |
resources: ["secrets"] |
apiGroups: [""] |
|
|
PersistentVolume |
resources: ["persistentvolumes"] |
apiGroups: [""] |
|
|
PersistentVolumeClaim |
resources: ["persistentvolumeclaims"] |
apiGroups: [""] |
|
|
Namespace |
resources: ["namespaces"] |
apiGroups: [""] |
|
|
Deployment |
resources: ["deployments"] |
apiGroups: ["apps"] |
|
|
DaemonSet |
resources: ["daemonsets"] |
apiGroups: ["apps"] |
|
|
StatefulSet |
resources: ["statefulsets"] |
apiGroups: ["apps"] |
|
|
Ingress |
resources: ["ingresses"] |
apiGroups: ["networking.k8s.io"] |
|
|
NetworkPolicy |
resources: ["networkpolicies"] |
apiGroups: ["networking.k8s.io"] |
|
|
Job |
resources: ["jobs"] |
apiGroups: ["batch"] |
|
|
CronJob |
resources: ["cronjobs"] |
apiGroups: ["batch"] |
|
|
StorageClass |
resources: ["storageclasses"] |
apiGroups: ["storage.k8s.io"] |
|
|
HorizontalPodAutoscaler |
resources: ["horizontalpodautoscalers"] |
apiGroups: ["autoscaling"] |
|
Procedimento
Aplique permissões de RBAC personalizadas pelo console do ACK ou via kubectl.
O console do Container Service for Kubernetes (ACK) permite vincular apenas ClusterRoles personalizadas. Para vincular uma Role personalizada, utilize a ferramenta de linha de comando kubectl.
Console
Etapa 1: Criar uma ClusterRole personalizada
Faça login no console do ACK. No painel de navegação à esquerda, clique em Clusters.
Na página Clusters, clique no nome do seu cluster. No painel de navegação à esquerda, clique em .
Na página Role, clique na aba Cluster Role. Em seguida, clique em Create.
-
No painel Create YAML, insira o manifesto YAML da sua política personalizada e clique em OK para criar a ClusterRole.
Esta etapa utiliza o YAML de uma ClusterRole (cluster-scoped) como exemplo. Após a criação, visualize a ClusterRole personalizada my-clusterrole na aba Cluster Role.
Etapa 2: Atribuir a ClusterRole personalizada
Faça login no console do ACK. No painel de navegação à esquerda, clique em Authorizations.
-
Na página Authorizations, configure as permissões de gerenciamento.
Para autorizar um usuário RAM: Clique na aba RAM Users, localize o usuário RAM desejado e clique em Modify Permissions na coluna Actions para acessar a página Permissions.
Para autorizar uma função RAM: Clique na aba RAM Role, selecione a função RAM alvo e clique em Modify Permissions para ir à página Permissions.
Clique em +Add Permissions. Na caixa de diálogo, selecione o Cluster onde você criou a ClusterRole e o Namespace que deseja autorizar. Na seção Permissions, escolha Custom. Na lista suspensa exibida, selecione my-clusterrole e clique em Submit.
kubectl
Etapa 1: Criar uma ClusterRole personalizada
-
Crie um arquivo chamado my-clusterrole.yaml contendo o seguinte manifesto YAML.
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: my-clusterrole rules: - apiGroups: [""] resources: ["pods"] verbs: ["get", "list", "watch"] - apiGroups: [""] resources: ["services"] verbs: ["get", "list", "watch"] -
Execute o comando abaixo para implantar a ClusterRole:
kubectl apply -f my-clusterrole.yaml
Etapa 2: Obter o ID do sujeito
Para conceder permissões a um usuário RAM, obtenha o ID desse usuário. Para mais informações, consulte View the details of a RAM user.
Para conceder permissões a uma função RAM, obtenha o ID dessa função. Para mais detalhes, veja View information about a RAM role.
Etapa 3: Atribuir a ClusterRole personalizada
-
Crie um arquivo denominado my-clusterrole-binding.yaml com o manifesto YAML a seguir.
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: my-clusterrole-binding subjects: - kind: User name: "20811XXXXXXXXX2288" # The user ID or role ID of the subject obtained in Step 2. apiGroup: rbac.authorization.k8s.io roleRef: kind: ClusterRole name: my-clusterrole apiGroup: rbac.authorization.k8s.io -
Execute o comando abaixo para implantar a ClusterRoleBinding:
kubectl apply -f my-clusterrole-binding.yaml
Após conceder as permissões personalizadas ao usuário RAM ou função RAM desejada, obtain the kubeconfig file for the cluster and use kubectl to connect to the cluster para validar as permissões.
Perguntas frequentes
Como conceder acesso ao terminal do console?
Por padrão, um usuário RAM ou função RAM não consegue acessar o terminal de um container pelo console do ACK, mesmo possuindo permissões de somente leitura get e list para pods. Essa ação exige permissões get e create no sub-recurso de Pod pods/exec.
Portanto, conceda as permissões get e create sobre o recurso pods/exec nas rules de uma Role ou ClusterRole e vincule essa função ao usuário ou grupo de usuários alvo. Veja um exemplo abaixo.
Para acessar o terminal: Faça login no console do ACK . Na página Clusters , clique no nome do cluster desejado. No painel de navegação à esquerda, escolha . Na coluna Actions , clique em Terminal .
Role
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: ns-role
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list"]
# Grant permissions on pods/exec in the namespace.
- apiGroups: [""]
resources: ["pods/exec"]
verbs: ["get", "create"]
ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
# namespace: default
name: my-clusterrole
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list"]
- apiGroups: [""]
resources: ["services"]
verbs: ["get", "list"]
# Grant permissions on pods/exec in the cluster.
- apiGroups: [""]
resources: ["pods/exec"]
verbs: ["get", "create"]