diff --git a/source/pages/guides/como-gerenciar-usuarios-no-kubernetes.md b/source/pages/guides/como-gerenciar-usuarios-no-kubernetes.md new file mode 100644 index 0000000000000000000000000000000000000000..39ec53cac61432e5c4355e7f18f7b42878d18dc6 --- /dev/null +++ b/source/pages/guides/como-gerenciar-usuarios-no-kubernetes.md @@ -0,0 +1,171 @@ +# Como gerenciar usuários no Kubernetes + +Nesse tutorial vai ser criado um certificado para o "usuário" devademir com as +permissões de criar recursos básicos na namespace `ademir` e visualizar o que +está no cluster. Adapte conforme o seu caso de uso. + +A gestão de controle de acesso ao Kubernetes pode ser resumida em duas partes: +1. Autenticação, com certificados. +2. Autorização, com RBAC. + +## Autenticação + +O Kubernetes pode autenticar usuários utilizando certificados x509. O processo +envolve: + +1. Gerar um par de chaves e um Certificate Signing Request (CSR). +2. Criar e submeter um CSR no Kubernetes. +3. Aprovar o CSR. +4. Obter o certificado assinado. +5. Configurar o kubeconfig. + +### 1.1 Gerando o certificado + +Cria uma chave privada e um CSR: + +```sh +openssl req \ + -nodes \ + -days 365 \ + -newkey rsa:2048 \ + -keyout devademir.key \ + -out devademir.csr \ + -subj '/CN=devademir/O=c3sl.ufpr.br' \ + -addext 'subjectAltName = DNS:devademir.c3sl.ufpr.br' +``` + +### 1.2 Criando o CSR no Kubernetes + +Converta o CSR para base64: + +```sh +cat devademir.csr | base64 -w 0 +``` + +Crie um arquivo `csr.yaml` com o seguinte conteúdo: + +```yaml +apiVersion: certificates.k8s.io/v1 +kind: CertificateSigningRequest +metadata: + name: devademir +spec: + request: <CSR em base64> + signerName: kubernetes.io/kube-apiserver-client + usages: + - client auth +``` + +Submeta o CSR ao Kubernetes: + +```sh +k apply -f csr.yaml +``` + +### 1.3 Aprovando o CSR + +Um administrador do cluster precisa aprovar manualmente o CSR: + +```sh +k certificate approve devademir +``` + +### 1.4 Obtenha o certificado assinado + +```sh +k get csr devademir -ojson | jq -r '.status.certificate' | base64 -d > devademir.cert +``` + +### 1.5 Configurando o kubeconfig + +```yaml +apiVersion: v1 +clusters: +- cluster: + certificate-authority-data: <certificado do cluster em base64> + server: <endpoint do cluster> + name: <nome do cluster> +contexts: +- context: + cluster: <nome do cluster> + user: devademir + namespace: ademir + name: devademir +current-context: devademir +kind: Config +preferences: {} +users: +- name: devademir + user: + client-certificate-data: <devademir.cert em base64> + client-key-data: <devademir.key em base64> +``` + +Preencha o `user.client-certificate-date` e `user.client-key-data` com o +conteúdo de `devademir.cert` e do `devademir.key` em base64. Não pode ter +quebra de linhas. + +O que está em `cluster` no kubeconfig - como o `certificate-authority-data` - +pode ser copiado de outro kubeconfig. + +Antes de prosseguir, tente dar um `k get nodes` para ver se a autenticação +funciona. É para aparecer que você não tem permissão para executar `k get +node`, porque você não tem a permissão pra isso mesmo, não foi feito a *Role* +ainda. + +## Autorização + +A autenticação permite ao usuário acessar o cluster, mas ele não terá permissão +para executar comandos até que seja associado a uma *Role* ou *ClusterRole* com +uma *RoleBinding ou *ClusterRoleBinding*. + +### Criando a Role (ou Cluster Role) e RoleBinding (ou ClusterRoleBinding) + +A *Role* define as permissões e o *RoleBinding* associa o usuário a uma *Role*. + +```yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: devademir + namespace: ademir +rules: + - apiGroups: + - "" + - "apps" + resources: + - "*" + verbs: + - "*" +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: devademir + namespace: ademir +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: devademir +subjects: + - kind: User + name: devademir + apiGroup: rbac.authorization.k8s.io +``` + +Essa *Role* permite fazer quase tudo dentro da namespace `ademir`. + +### ClusterRoles pré-definidas + +Se precisar de permissões a nÃvel de cluster, use uma ClusterRole. O Kubernetes +tem algumas ClusterRoles padrões, como: +- view: pode ver tudo no cluster. +- edit: pode editar recursos básicos do cluster. + +Use `k get clusterrole` para ver todas as *ClusterRoles*. + +## Referências + +- [Authentication in Kubernetes](https://kubernetes.io/docs/reference/access-authn-authz/authentication/#x509-client-certs) +- [Certificates e CSR](https://kubernetes.io/docs/reference/access-authn-authz/certificate-signing-requests/#kubernetes-signers) +- [Kubernetes TLS Certificates](https://kubernetes.io/docs/tasks/tls/managing-tls-in-a-cluster/#create-a-certificate-signing-request)