As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.
Segurança de rede
dica
Explore as
A segurança da rede tem várias facetas. A primeira envolve a aplicação de regras que restringem o fluxo de tráfego de rede entre os serviços. A segunda envolve a criptografia do tráfego enquanto ele está em trânsito. Os mecanismos para implementar essas medidas de segurança no EKS são variados, mas geralmente incluem os seguintes itens:
Controle de tráfego
-
Políticas de rede
-
Grupos de segurança
Criptografia de rede
-
Malha de serviços
-
Controladores de entrada e balanceadores de carga
-
Instâncias Nitro
-
CA privada do ACM com gerenciador de certificados
Política de rede
Em um cluster Kubernetes, toda comunicação de pod a pod é permitida por padrão. Embora essa flexibilidade possa ajudar a promover a experimentação, ela não é considerada segura. As políticas de rede do Kubernetes oferecem um mecanismo para restringir o tráfego de rede entre pods (geralmente chamado de East/West tráfego), bem como entre pods e serviços externos. As políticas de rede do Kubernetes operam nas camadas 3 e 4 do modelo OSI. As políticas de rede usam seletores de pod, namespace e rótulos para identificar os pods de origem e destino, mas também podem incluir endereços IP, números de porta, protocolos ou uma combinação deles. As políticas de rede podem ser aplicadas às conexões de entrada e saída do pod, geralmente chamadas de regras de entrada e saída.
Com o suporte nativo à política de rede do Amazon VPC CNI Plugin, você pode implementar políticas de rede para proteger o tráfego de rede em clusters kubernetes. Isso se integra à API upstream Kubernetes Network Policy, garantindo compatibilidade e aderência aos padrões do Kubernetes. Você pode definir políticas usando identificadores diferentes
Importante
Quando você provisiona um cluster EKS pela primeira vez, a funcionalidade de política de rede VPC CNI não é habilitada por padrão. Certifique-se de ter implantado a Add-on versão VPC CNI compatível e defina o ENABLE_NETWORK_POLICY sinalizador como true no complemento vpc-cni para habilitar isso. Consulte o guia do usuário do Amazon EKS para obter instruções detalhadas.
Recomendações
Introdução às políticas de rede - siga o princípio do menor privilégio
Crie uma política de negação padrão
Assim como acontece com as políticas do RBAC, é recomendável seguir os princípios de acesso menos privilegiado com as políticas de rede. Comece criando uma política de negação de tudo que restringe todo o tráfego de entrada e saída em um namespace.
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: default-deny namespace: default spec: podSelector: {} policyTypes: - Ingress - Egress
negação padrão
nota
A imagem acima foi criada pelo visualizador de políticas de rede da Tufin
Crie uma regra para permitir consultas de DNS
Depois de definir a regra padrão de negar tudo, você pode começar a criar camadas de regras adicionais, como uma regra que permite que os pods consultem o CoreDNS para resolução de nomes.
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-dns-access namespace: default spec: podSelector: matchLabels: {} policyTypes: - Egress egress: - to: - namespaceSelector: matchLabels: kubernetes.io/metadata.name: kube-system podSelector: matchLabels: k8s-app: kube-dns ports: - protocol: UDP port: 53
permitir acesso ao DNS
Adicione regras de forma incremental para permitir seletivamente o fluxo de tráfego entre namespaces/pods
Entenda os requisitos do aplicativo e crie regras de entrada e saída refinadas conforme necessário. O exemplo abaixo mostra como restringir o tráfego de entrada na porta 80 para app-one fromclient-one. Isso ajuda a minimizar a superfície de ataque e reduz o risco de acesso não autorizado.
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-ingress-app-one namespace: default spec: podSelector: matchLabels: k8s-app: app-one policyTypes: - Ingress ingress: - from: - podSelector: matchLabels: k8s-app: client-one ports: - protocol: TCP port: 80
allow-ingress-app-one
Monitorando a aplicação da política de rede
-
Use o editor de políticas de rede
-
O editor de políticas de rede
ajuda com visualizações, pontuação de segurança e gera automaticamente a partir de registros de fluxo de rede -
Crie políticas de rede de forma interativa
-
-
Registros de auditoria
-
Revise regularmente os registros de auditoria do seu cluster EKS
-
Os registros de auditoria fornecem muitas informações sobre quais ações foram executadas em seu cluster, incluindo mudanças nas políticas de rede.
-
Use essas informações para rastrear alterações em suas políticas de rede ao longo do tempo e detectar quaisquer alterações não autorizadas ou inesperadas
-
-
Teste automatizado
-
Implemente testes automatizados criando um ambiente de teste que espelhe seu ambiente de produção e implante periodicamente cargas de trabalho que tentem violar suas políticas de rede.
-
-
Métricas de monitoramento
-
Configure seus agentes de observabilidade para extrair as métricas do Prometheus dos agentes do node VPC CNI, que permitem monitorar a integridade do agente e os erros do SDK.
-
-
Audite as políticas de rede regularmente
-
Audite periodicamente suas políticas de rede para garantir que elas atendam aos requisitos atuais do seu aplicativo. À medida que seu aplicativo evolui, uma auditoria oferece a oportunidade de remover regras redundantes de entrada e saída e garantir que seus aplicativos não tenham permissões excessivas.
-
-
Certifique-se de que as políticas de rede existam usando o Open Policy Agent (OPA)
-
Use a Política de OPA conforme mostrado abaixo para garantir que a Política de Rede sempre exista antes de integrar os pods de aplicativos. Essa política nega a integração de pods k8s com um rótulo
k8s-app: sample-appse a política de rede correspondente não existir.
-
package kubernetes.admission import data.kubernetes.networkpolicies deny[msg] { input.request.kind.kind == "Pod" pod_label_value := {v["k8s-app"] | v := input.request.object.metadata.labels} contains_label(pod_label_value, "sample-app") np_label_value := {v["k8s-app"] | v := networkpolicies[_].spec.podSelector.matchLabels} not contains_label(np_label_value, "sample-app") msg:= sprintf("The Pod %v could not be created because it is missing an associated Network Policy.", [input.request.object.metadata.name]) } contains_label(arr, val) { arr[_] == val }
Solução de problemas
Monitore os registros do controlador de política de rede vpc-network-policy e do node-agent
Ative os registros do gerenciador do controlador do plano de controle EKS para diagnosticar a funcionalidade da política de rede. Você pode transmitir os registros do plano de controle para um grupo de CloudWatch registros e usar o CloudWatch Log Insights para realizar consultas avançadas. Nos registros, você pode ver quais objetos de endpoint do pod são resolvidos para uma política de rede, o status de reconciliação das políticas e depurar se a política está funcionando conforme o esperado.
Além disso, o Amazon VPC CNI permite que você habilite a coleta e exportação de registros de aplicação de políticas para o Amazon Cloudwatch a
O Amazon VPC CNI também fornece um SDK que fornece uma interface para interagir com programas eBPF no nó. O SDK é instalado quando o aws-node é implantado nos nós. Você pode encontrar o binário do SDK instalado no /opt/cni/bin diretório do nó. No lançamento, o SDK fornece suporte para funcionalidades fundamentais, como a inspeção de programas e mapas do eBPF.
sudo /opt/cni/bin/aws-eks-na-cli ebpf progs
Registrar metadados de tráfego de rede
O AWS VPC Flow Logs captura metadados sobre o tráfego que flui por meio de uma VPC, como endereço IP e porta de origem e destino junto com pacotes. accepted/dropped Essas informações podem ser analisadas para procurar atividades suspeitas ou incomuns entre recursos dentro da VPC, incluindo pods. No entanto, como os endereços IP dos pods mudam frequentemente à medida que são substituídos, os registros de fluxo podem não ser suficientes por si só. O Calico Enterprise estende os registros de fluxo com rótulos de pods e outros metadados, facilitando a decifração dos fluxos de tráfego entre os pods.
Grupos de segurança
O EKS usa grupos de segurança (SGs) do AWS VPC para controlar o tráfego entre o plano de controle do Kubernetes e os nós de trabalho do cluster. Os grupos de segurança também são usados para controlar o tráfego entre os nós de trabalho, outros recursos da VPC e endereços IP externos. Quando você provisiona um cluster EKS (com Kubernetes versão 1.14-eks.3 ou superior), um grupo de segurança de cluster é criado automaticamente para você. Esse grupo de segurança permite a comunicação irrestrita entre o plano de controle do EKS e os nós dos grupos de nós gerenciados. Para simplificar, é recomendável adicionar o cluster SG a todos os grupos de nós, incluindo grupos de nós não gerenciados.
Antes da versão 1.14 do Kubernetes e da versão eks.3 do EKS, havia grupos de segurança separados configurados para o plano de controle e grupos de nós do EKS. As regras mínimas e sugeridas para os grupos de segurança do plano de controle e do grupo de nós podem ser encontradas em https://docs.aws.amazon.com/eks/latest/userguide/sec-group-reqs.html. As regras mínimas para o grupo de segurança do plano de controle permitem a entrada da porta 443 do nó de trabalho SG. Essa regra é o que permite que os kubelets se comuniquem com o servidor da API Kubernetes. Também inclui a porta 10250 para tráfego de saída para o node de trabalho SG; 10250 é a porta na qual os kubelets escutam. Da mesma forma, as regras mínimas do grupo de nós permitem a entrada da porta 10250 do plano de controle SG e 443 de saída para o plano de controle SG. Finalmente, há uma regra que permite a comunicação irrestrita entre nós dentro de um grupo de nós.
Se você precisar controlar a comunicação entre os serviços que são executados dentro do cluster e os serviços executados fora do cluster, como um banco de dados RDS, considere grupos de segurança para pods. Com grupos de segurança para pods, você pode atribuir um grupo de segurança existente a uma coleção de pods.
Atenção
Se você fizer referência a um grupo de segurança que não existe antes da criação dos pods, eles não serão agendados.
Você pode controlar quais pods são atribuídos a um grupo de segurança criando um SecurityGroupPolicy objeto e especificando um PodSelector ou a. ServiceAccountSelector Definir os seletores para {} atribuirá os SGs referenciados em a todos os pods em um namespace ou SecurityGroupPolicy a todas as contas de serviço em um namespace. Certifique-se de se familiarizar com todas as considerações antes de implementar grupos de segurança para pods.
Importante
Se você usar SGs para pods, deverá criar SGs que permitam a saída da porta 53 para o grupo de segurança do cluster. Da mesma forma, você deve atualizar o grupo de segurança do cluster para aceitar o tráfego de entrada da porta 53 do grupo de segurança do pod.
Importante
Os limites para grupos de segurança ainda se aplicam ao usar grupos de segurança para pods, então use-os criteriosamente.
Importante
Você deve criar regras para o tráfego de entrada do grupo de segurança do cluster (kubelet) para todas as sondas configuradas para o pod.
Importante
Os grupos de segurança para pods dependem de um recurso conhecido como entroncamento ENI, que foi criado para aumentar a densidade ENI de uma instância do EC2. Quando um pod é atribuído a um SG, um controlador VPC associa uma ramificação ENI do grupo de nós ao pod. Se não houver ENIs de ramificação suficientes disponíveis em um grupo de nós no momento em que o pod for agendado, o pod permanecerá no estado pendente. O número de ENIs de filiais que uma instância pode suportar varia de acordo com a instância type/family. Consulte https://docs.aws.amazon.com/eks/latest/userguide/security-groups-for-pods.html #supported -instance-types para obter mais detalhes.
Embora os grupos de segurança para pods ofereçam uma AWS-native maneira de controlar o tráfego de rede dentro e fora do cluster sem a sobrecarga de um daemon de política, outras opções estão disponíveis. Por exemplo, o mecanismo de política Cilium permite que você faça referência a um nome DNS em uma política de rede. O Calico Enterprise inclui uma opção para mapear políticas de rede para grupos de segurança da AWS. Se você implementou uma malha de serviços como o Istio, pode usar um gateway de saída para restringir a saída da rede a domínios ou endereços IP específicos e totalmente qualificados. Para obter mais informações sobre essa opção, leia a série de três partes sobre controle de tráfego de saída no
Quando usar a Política de Rede versus o Grupo de Segurança para pods?
Quando usar a política de rede do Kubernetes
-
Controlando o tráfego de pod a pod
-
Adequado para controlar o tráfego de rede entre pods dentro de um cluster (tráfego leste-oeste)
-
-
Controle o tráfego no endereço IP ou no nível da porta (camada 3 ou 4 do OSI)
Quando usar grupos de segurança da AWS para pods (SGP)
-
Aproveite as configurações existentes da AWS
-
Se você já tem um conjunto complexo de grupos de segurança do EC2 que gerenciam o acesso aos serviços da AWS e está migrando aplicativos de instâncias do EC2 para o EKS, os SGPs podem ser uma ótima opção, permitindo que você reutilize os recursos do grupo de segurança e os aplique aos seus pods.
-
-
Controle o acesso aos serviços da AWS
-
Seus aplicativos executados em um cluster EKS desejam se comunicar com outros serviços da AWS (banco de dados RDS) e usar os SGPs como um mecanismo eficiente para controlar o tráfego dos pods para os serviços da AWS.
-
-
Isolamento do tráfego de pods e nós
-
Se você quiser separar completamente o tráfego do pod do resto do tráfego do nó, use o SGP no
POD_SECURITY_GROUP_ENFORCING_MODE=strictmodo.
-
Práticas recomendadas usando grupos de segurança para pods e política de rede
-
Segurança em camadas
-
Use uma combinação de política de rede SGP e kubernetes para uma abordagem de segurança em camadas
-
Use SGPs para limitar o acesso em nível de rede aos serviços da AWS que não fazem parte de um cluster, enquanto as políticas de rede do Kubernetes podem restringir o tráfego de rede entre os pods dentro do cluster
-
-
Princípio do privilégio mínimo
-
Permita somente o tráfego necessário entre pods ou namespaces
-
-
Segmente seus aplicativos
-
Sempre que possível, segmente os aplicativos pela política de rede para reduzir o raio de explosão se um aplicativo for comprometido
-
-
Mantenha as políticas simples e claras
-
As políticas de rede do Kubernetes podem ser bastante granulares e complexas. É melhor mantê-las o mais simples possível para reduzir o risco de configuração incorreta e facilitar a sobrecarga de gerenciamento.
-
-
Reduza a superfície de ataque
-
Minimize a superfície de ataque limitando a exposição de seus aplicativos
-
Importante
Os grupos de segurança para pods oferecem dois modos de imposição: e. strict standard Você deve usar o standard modo ao usar os recursos de Política de Rede e Grupos de Segurança para pods em um cluster EKS.
Quando se trata de segurança de rede, uma abordagem em camadas geralmente é a solução mais eficaz. Usar a política de rede kubernetes e o SGP em combinação pode fornecer uma estratégia robusta de defesa aprofundada para seus aplicativos executados no EKS.
Aplicação da política de Service Mesh ou política de rede Kubernetes
service meshA é uma camada de infraestrutura dedicada que você pode adicionar aos seus aplicativos. Ele permite que você adicione de forma transparente recursos como observabilidade, gerenciamento de tráfego e segurança, sem adicioná-los ao seu próprio código.
O service mesh impõe políticas na camada 7 (aplicação) do modelo OSI, enquanto as políticas de rede kubernetes operam na camada 3 (rede) e na camada 4 (transporte). Há muitas ofertas nesse espaço, como AWSAppMesh, Istio, Linkerd etc.,
Quando usar o Service Mesh para aplicação de políticas
-
Ter investimento existente em uma malha de serviços
-
Precisa de recursos mais avançados, como gerenciamento de tráfego, observabilidade e segurança
-
Controle de tráfego, balanceamento de carga, interrupção de circuito, limitação de taxa, tempos limite, etc.
-
Informações detalhadas sobre o desempenho de seus serviços (latência, taxas de erro, solicitações por segundo, volumes de solicitações etc.)
-
Você deseja implementar e aproveitar a malha de serviços para recursos de segurança como mTLS
-
Escolha a política de rede do Kubernetes para casos de uso mais simples
-
Limite quais pods podem se comunicar entre si
-
As políticas de rede exigem menos recursos do que uma malha de serviços, o que as torna adequadas para casos de uso mais simples ou para clusters menores, nos quais a sobrecarga de execução e gerenciamento de uma malha de serviços pode não ser justificada.
nota
As políticas de rede e o Service Mesh também podem ser usados juntos. Use políticas de rede para fornecer um nível básico de segurança e isolamento entre seus pods e, em seguida, use uma malha de serviços para adicionar recursos adicionais, como gerenciamento de tráfego, observabilidade e segurança.
ThirdParty Mecanismos de política de rede
Considere um mecanismo de política de rede de terceiros quando você tiver requisitos de política avançados, como políticas globais de rede, suporte para regras baseadas em nomes de host DNS, regras de camada 7, regras ServiceAccount baseadas e deny/log ações explícitas, etc., o Calico
Você pode encontrar uma lista de políticas de rede comuns do Kubernetes em https://github.com/ahmetb/kubernetes-network-policy-recipes. Um conjunto similar de regras para o Calico está disponível em https://docs.projectcalico.org/security/calico-network-policy.
Migração para o mecanismo de política de rede CNI da Amazon VPC
Para manter a consistência e evitar um comportamento inesperado de comunicação do pod, é recomendável implantar somente um mecanismo de política de rede em seu cluster. Se você quiser migrar do 3P para o VPC CNI Network Policy Engine, recomendamos converter seus NetworkPolicy CRDs 3P existentes nos recursos do NetworkPolicy Kubernetes antes de ativar o suporte à política de rede VPC CNI. Além disso, teste as políticas migradas em um cluster de teste separado antes de aplicá-las em seu ambiente de produção. Isso permite que você identifique e resolva possíveis problemas ou inconsistências no comportamento de comunicação do pod.
Ferramenta de migração
Para ajudar no processo de migração, desenvolvemos uma ferramenta chamada K8s Network Policy Migrator
Importante
A ferramenta de migração converterá apenas políticas 3P compatíveis com a API nativa de política de rede kubernetes. Se você estiver usando recursos avançados de política de rede oferecidos pelos plug-ins 3P, a ferramenta de migração os ignorará e os relatará.
Observe que a ferramenta de migração atualmente não é suportada pela equipe de engenharia de políticas de rede CNI da AWS VPC. Ela é disponibilizada aos clientes da melhor maneira possível. Recomendamos que você utilize essa ferramenta para facilitar seu processo de migração. Caso você encontre algum problema ou bug com a ferramenta, pedimos que você crie um GitHub problema
Recursos adicionais
-
Kubernetes e Tigera: políticas de rede, segurança e auditoria
-
NetworkPolicyEditor:
um editor de políticas interativo da Cilium -
Inspektor Gadget aconselha o gadget de política de rede
Sugere políticas de rede com base em uma análise do tráfego de rede
Criptografia em trânsito
Os aplicativos que precisam estar em conformidade com PCI, HIPAA ou outros regulamentos podem precisar criptografar dados enquanto eles estão em trânsito. Atualmente, o TLS é a escolha de fato para criptografar o tráfego na rede. O TLS, assim como seu antecessor, o SSL, fornece comunicações seguras em uma rede usando protocolos criptográficos. O TLS usa criptografia simétrica, na qual as chaves para criptografar os dados são geradas com base em um segredo compartilhado que é negociado no início da sessão. Veja a seguir algumas maneiras de criptografar dados em um ambiente Kubernetes.
Instâncias Nitro
O tráfego trocado entre os seguintes tipos de instância Nitro, por exemplo, C5n, G4, I3en, M5dn, M5n, P3dn, R5dn e R5n, é criptografado automaticamente por padrão. Quando há um salto intermediário, como um gateway de trânsito ou um balanceador de carga, o tráfego não é criptografado. Consulte Criptografia em trânsito para obter mais detalhes sobre criptografia em trânsito, bem como a lista completa dos tipos de instâncias que oferecem suporte à criptografia de rede por padrão.
Malha de serviços
A criptografia em trânsito também pode ser implementada com uma malha de serviços como App Mesh, Linkerd v2 e Istio. AppMesh suporta mTLS com X.509 certificados ou o Envoy's Secret Discovery Service (SDS). Tanto o Linkerd quanto o Istio têm suporte para mTLS.
O GitHub repositório
O App Mesh também oferece suporte à criptografia TLS com um certificado privado emitido pelo AWS Certificate Manager (ACM) ou um certificado armazenado no sistema de arquivos local do nó virtual.
O GitHub repositório
Controladores de entrada e balanceadores de carga
Os controladores de entrada são uma forma inteligente de rotear o HTTP/S tráfego que emana de fora do cluster para os serviços executados dentro do cluster. Muitas vezes, essas entradas são lideradas por um balanceador de carga de camada 4, como o Classic Load Balancer ou o Network Load Balancer (NLB). O tráfego criptografado pode ser encerrado em diferentes locais da rede, por exemplo, no balanceador de carga, no recurso de entrada ou no pod. Como e onde você encerra sua conexão SSL, em última análise, será determinado pela política de segurança de rede da sua organização. Por exemplo, se você tiver uma política que exija criptografia de ponta a ponta, precisará descriptografar o tráfego no pod. Isso sobrecarregará ainda mais seu Pod, pois ele precisará passar ciclos estabelecendo o aperto de mão inicial. O SSL/TLS processamento geral consome muito da CPU. Consequentemente, se você tiver flexibilidade, tente realizar o descarregamento SSL no Ingress ou no balanceador de carga.
Use criptografia com os balanceadores de carga do AWS Elastic
Tanto o AWS Application Load Balancer (ALB) quanto o Network Load Balancer (NLB) têm suporte para criptografia de transporte (SSL e TLS). A alb.ingress.kubernetes.io/certificate-arn anotação para o ALB permite que você especifique quais certificados adicionar ao ALB. Se você omitir a anotação, o controlador tentará adicionar certificados aos ouvintes que a exijam, combinando os certificados do AWS Certificate Manager (ACM) disponíveis usando o campo host. Começando com o EKS v1.15, você pode usar a service.beta.kubernetes.io/aws-load-balancer-ssl-cert anotação com o NLB, conforme mostrado no exemplo abaixo.
apiVersion: v1 kind: Service metadata: name: demo-app namespace: default labels: app: demo-app annotations: service.beta.kubernetes.io/aws-load-balancer-type: "nlb" service.beta.kubernetes.io/aws-load-balancer-ssl-cert: "<certificate ARN>" service.beta.kubernetes.io/aws-load-balancer-ssl-ports: "443" service.beta.kubernetes.io/aws-load-balancer-backend-protocol: "http" spec: type: LoadBalancer ports: - port: 443 targetPort: 80 protocol: TCP selector: app: demo-app //--- kind: Deployment apiVersion: apps/v1 metadata: name: nginx namespace: default labels: app: demo-app spec: replicas: 1 selector: matchLabels: app: demo-app template: metadata: labels: app: demo-app spec: containers: - name: nginx image: nginx ports: - containerPort: 443 protocol: TCP - containerPort: 80 protocol: TCP
Veja a seguir exemplos adicionais de SSL/TLS rescisão.
Importante
Algumas entradas, como o controlador AWS LB, implementam o SSL/TLS uso de anotações em vez de fazer parte da especificação de entrada.
CA privada do ACM com gerenciador de certificados
Você pode ativar o TLS e o mTLS para proteger suas cargas de trabalho do aplicativo EKS na entrada, no pod e entre os pods usando a ACM Private Certificate Authority (CA) e o cert-manager
Short-Lived Modo CA para TLS mútuo entre cargas de trabalho
Ao usar a CA privada do ACM para mTLS no EKS, é recomendável usar certificados de curta duração com o modo CA de curta duração. Embora seja possível emitir certificados de curta duração no modo CA de uso geral, usar o modo CA de curta duração é mais econômico (~ 75% mais barato do que o modo geral) para casos de uso em que novos certificados precisam ser emitidos com frequência. Além disso, você deve tentar alinhar o período de validade dos certificados privados com a vida útil dos pods em seu cluster EKS. Saiba mais sobre a CA privada do ACM e seus benefícios aqui.
Instruções de configuração do ACM
Comece criando uma CA privada seguindo os procedimentos fornecidos nos documentos técnicos da CA privada do ACM. Depois de ter uma CA privada, instale o cert-manager usando as instruções de instalação regulares.
Agora que você tem uma CA privada e um cluster EKS com o cert-manager e o plug-in instalados, é hora de definir as permissões e criar o emissor. Atualize as permissões do IAM da função do nó EKS para permitir o acesso à CA privada do ACM. <CA_ARN>Substitua o pelo valor da sua CA privada:
{ "Version":"2012-10-17", "Statement": [ { "Sid": "awspcaissuer", "Action": [ "acm-pca:DescribeCertificateAuthority", "acm-pca:GetCertificate", "acm-pca:IssueCertificate" ], "Effect": "Allow", "Resource": "arn:aws:acm-pca:us-west-2:123456789012:certificate-authority/12345678-1234-1234-1234-123456789012" } ] }
As funções de serviço para contas do IAM ou IRSA também podem ser usadas. Consulte a seção Recursos adicionais abaixo para obter exemplos completos.
Crie um emissor no Amazon EKS criando um arquivo de definição de recurso personalizado chamado cluster-issuer.yaml com o seguinte texto nele, substituindo as informações com sua CA privada. <CA_ARN> <Region>
apiVersion: awspca.cert-manager.io/v1beta1 kind: AWSPCAClusterIssuer metadata: name: demo-test-root-ca spec: arn: <CA_ARN> region: <Region>
Implante o emissor que você criou.
kubectl apply -f cluster-issuer.yaml
Seu cluster EKS está configurado para solicitar certificados da CA privada. Agora você pode usar o Certificate recurso do cert-manager para emitir certificados alterando os valores do issuerRef campo para o emissor de CA privado que você criou acima. Para obter mais detalhes sobre como especificar e solicitar recursos de certificados, consulte o guia de recursos de certificados do cert-manager.
CA privada do ACM com Istio e gerenciador de certificados
Se você estiver executando o Istio em seu cluster EKS, poderá desativar o plano de controle do Istio (especificamenteistiod) de funcionar como autoridade de certificação (CA) raiz e configurar a CA privada do ACM como a CA raiz para mTLS entre cargas de trabalho. Se você optar por essa abordagem, considere usar o modo CA de curta duração na CA privada do ACM. Consulte a seção anterior e esta postagem do blog
Como funciona a assinatura de certificados no Istio (padrão)
As cargas de trabalho no Kubernetes são identificadas usando contas de serviço. Se você não especificar uma conta de serviço, o Kubernetes atribuirá automaticamente uma à sua carga de trabalho. Além disso, as contas de serviço montam automaticamente um token associado. Esse token é usado pela conta de serviço para que as cargas de trabalho sejam autenticadas na API Kubernetes. A conta de serviço pode ser suficiente como identidade para o Kubernetes, mas o Istio tem seu próprio sistema de gerenciamento de identidade e CA. Quando uma carga de trabalho é iniciada com seu proxy auxiliar de envio, ela precisa de uma identidade atribuída pelo Istio para ser considerada confiável e ter permissão para se comunicar com outros serviços na malha.
Para obter essa identidade do Istio, istio-agent ele envia uma solicitação conhecida como solicitação de assinatura de certificado (ou CSR) para o plano de controle do Istio. Essa CSR contém o token da conta de serviço para que a identidade da carga de trabalho possa ser verificada antes de ser processada. Esse processo de verificação é realizado poristiod, que atua como Autoridade de Registro (ou RA) e CA. O RA serve como um guardião que garante que somente a CSR verificada chegue à CA. Depois que a CSR for verificada, ela será encaminhada para a CA, que emitirá um certificado contendo uma identidade
Fluxo padrão para solicitações de assinatura de certificados do Istio:
Como funciona a assinatura de certificados no Istio com a CA privada do ACM
Você pode usar um complemento do cert-manager chamado agente de solicitação de assinatura de certificado do Istio (istio-csr
Sempre que houver uma CSR de uma carga de trabalho, ela será encaminhada para istio-csr, que solicitará certificados da CA privada do ACM. Essa comunicação entre istio-csr e a CA privada do ACM é habilitada pelo plug-in emissor de CA privada da AWS.
Fluxo para solicitações de assinatura de certificados do Istio com istio-csr
image: :istio-csr-with-acm-private-ca.png [Fluxo para solicitações de assinatura de certificados Istio com istio-csr]
Instruções de configuração do Istio com CA privada
-
Comece seguindo as mesmas instruções de configuração nesta seção para concluir o seguinte:
-
Criar uma CA privada
-
Instalar cert-manager
-
Instale o plug-in do emissor
-
Defina as permissões e crie um emissor. O emissor representa a CA e é usado para assinar
istiode mesclar certificados de carga de trabalho. Ele se comunicará com a CA privada do ACM. -
Crie um
istio-systemnamespace. É aqui que oistiod certificatee outros recursos do Istio serão implantados. -
Instale o Istio CSR configurado com o plug-in AWS Private CA Issuer. Você pode preservar as solicitações de assinatura de certificados para cargas de trabalho para verificar se elas foram aprovadas e assinadas (
preserveCertificateRequests=true).helm install -n cert-manager cert-manager-istio-csr jetstack/cert-manager-istio-csr \ --set "app.certmanager.issuer.group=awspca.cert-manager.io" \ --set "app.certmanager.issuer.kind=AWSPCAClusterIssuer" \ --set "app.certmanager.issuer.name=<the-name-of-the-issuer-you-created>" \ --set "app.certmanager.preserveCertificateRequests=true" \ --set "app.server.maxCertificateDuration=48h" \ --set "app.tls.certificateDuration=24h" \ --set "app.tls.istiodCertificateDuration=24h" \ --set "app.tls.rootCAFile=/var/run/secrets/istio-csr/ca.pem" \ --set "volumeMounts[0].name=root-ca" \ --set "volumeMounts[0].mountPath=/var/run/secrets/istio-csr" \ --set "volumes[0].name=root-ca" \ --set "volumes[0].secret.secretName=istio-root-ca" -
Instale o Istio com configurações personalizadas para substituí-lo
istiodcert-manager istio-csrcomo provedor de certificados para a malha. Esse processo pode ser realizado usando o Istio Operator. apiVersion: install.istio.io/v1alpha1 kind: IstioOperator metadata: name: istio namespace: istio-system spec: profile: "demo" hub: gcr.io/istio-release values: global: # Change certificate provider to cert-manager istio agent for istio agent caAddress: cert-manager-istio-csr.cert-manager.svc:443 components: pilot: k8s: env: # Disable istiod CA Sever functionality - name: ENABLE_CA_SERVER value: "false" overlays: - apiVersion: apps/v1 kind: Deployment name: istiod patches: # Mount istiod serving and webhook certificate from Secret mount - path: spec.template.spec.containers.[name:discovery].args[7] value: "--tlsCertFile=/etc/cert-manager/tls/tls.crt" - path: spec.template.spec.containers.[name:discovery].args[8] value: "--tlsKeyFile=/etc/cert-manager/tls/tls.key" - path: spec.template.spec.containers.[name:discovery].args[9] value: "--caCertFile=/etc/cert-manager/ca/root-cert.pem" - path: spec.template.spec.containers.[name:discovery].volumeMounts[6] value: name: cert-manager mountPath: "/etc/cert-manager/tls" readOnly: true - path: spec.template.spec.containers.[name:discovery].volumeMounts[7] value: name: ca-root-cert mountPath: "/etc/cert-manager/ca" readOnly: true - path: spec.template.spec.volumes[6] value: name: cert-manager secret: secretName: istiod-tls - path: spec.template.spec.volumes[7] value: name: ca-root-cert configMap: defaultMode: 420 name: istio-ca-root-cert -
Implante o recurso personalizado acima que você criou.
istioctl operator init kubectl apply -f istio-custom-config.yaml -
Agora você pode implantar uma carga de trabalho na malha em seu cluster EKS e aplicar o mTLS.
Solicitações de assinatura de certificados Istio
image: :istio-csr-requests.png [Solicitações de assinatura do certificado Istio]
Ferramentas e recursos
-
Workshop de imersão em segurança do Amazon EKS — Segurança de rede
-
Como implementar o cert-manager e o plug-in ACM Private CA para habilitar o TLS no EKS.
-
Plugin privado do gerenciador de certificados CA Kubernetes ativado. GitHub
-
Guia do usuário do plugin privado do CA Kubernetes cert-manager.
-
Como usar o modo de certificado de curta duração da AWS Private Certificate Authority
-
egress-operator
Um operador e um plug-in de DNS para controlar o tráfego de saída do seu cluster sem inspeção de protocolo -
NeuVector da SUSE, plataforma de segurança de contêineres de código
aberto e de confiança zero, fornece regras de rede de políticas, prevenção de perda de dados (DLP), firewall de aplicativos web (WAF) e assinaturas de ameaças à rede.