Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Pode aplicar e aplicar políticas de segurança incorporadas nos seus clusters Azure Kubernetes Service (AKS) utilizando o Azure Policy. A Política do Azure ajuda-o a aplicar padrões organizacionais e a avaliar a conformidade em escala. Depois de instalar o complemento de Política do Azure para AKS, você pode aplicar definições de política individuais ou grupos de definições de política chamadas iniciativas (às vezes chamadas de conjuntos de políticas) ao seu cluster. Para uma lista completa de definições de políticas e iniciativas do AKS, consulte as definições incorporadas do Azure Policy para o AKS.
Este artigo mostra-lhe como aplicar definições de políticas ao seu cluster e verificar se as atribuições são aplicadas.
Pré-requisitos
- Este artigo pressupõe que você tenha um cluster AKS existente. Se precisar de um cluster AKS, você pode criar um usando a CLI do Azure, o Azure PowerShell ou o portal do Azure.
- Você precisa do complemento de política do Azure para o AKS instalado no seu cluster AKS.
Precisa de instalar e configurar os seguintes recursos antes de começar:
- Este artigo pressupõe que você tenha um cluster AKS existente. Se precisar de um cluster AKS, você pode criar um usando a CLI do Azure, o Azure PowerShell ou o portal do Azure.
- Você precisa do complemento de política do Azure para o AKS instalado no seu cluster AKS.
- Terraform versão 1.6.0 ou posterior.
- CLI do Azure versão 2.47.0 ou posterior. Para instalar ou atualizar o CLI do Azure, consulte Instalar CLI do Azure.
- Kubectl instalado e configurado.
Atribuir uma definição ou iniciativa de política interna
Pode aplicar uma definição ou iniciativa de política no portal do Azure utilizando os seguintes passos:
- Vai ao serviço Azure Policy no portal Azure chamado Policy.
- No painel esquerdo da página Política do Azure, selecione Definições.
- Em Categorias, selecione
Kubernetes. - Escolha a definição de política ou a iniciativa a que pretende candidatar-se. Para este exemplo, selecione a iniciativa de padrões base de segurança de pods do Kubernetes para cargas de trabalho baseadas em Linux.
- Selecione Atribuir.
- Defina o Escopo para o grupo de recursos do cluster AKS com o complemento Azure Policy habilitado.
- Selecione a página Parâmetros e atualize o Efeito de
auditparadenypara bloquear novas implementações que violem a iniciativa de linha de base. Você também pode adicionar namespaces extras para excluir da avaliação. Para este exemplo, mantenha os valores padrão. - Selecione Rever + criar>Criar para submeter a atribuição de política.
Crie um diretório para a configuração do Terraform.
mkdir aks-use-azure-policy
cd aks-use-azure-policy
Criar a configuração do Terraform
Crie um ficheiro com o nome main.tf.
touch main.tf
Abra o main.tf ficheiro e adicione a seguinte configuração.
Configurar o fornecedor Terraform
A seguinte configuração:
- Define a versão Terraform.
- Configura o fornecedor AzureRM.
- Ativa as funcionalidades do fornecedor Azure necessárias para a gestão de recursos.
terraform {
required_version = ">= 1.6.0"
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "~> 4.0"
}
}
}
provider "azurerm" {
features {}
}
Definir variáveis de entrada
Use as seguintes variáveis para fornecer o nome do grupo de recursos existente e do cluster AKS durante a implementação.
variable "resource_group_name" {
description = "Name of the resource group that contains the existing AKS cluster."
type = string
}
variable "aks_cluster_name" {
description = "Name of the existing AKS cluster."
type = string
}
Referência ao cluster AKS existente
As seguintes fontes de dados recuperam informações sobre o grupo de recursos existente e o cluster AKS. O Terraform usa estes dados para referenciar infraestruturas que já existem no Azure em vez de criar novos recursos.
data "azurerm_resource_group" "aks" {
name = var.resource_group_name
}
data "azurerm_kubernetes_cluster" "aks" {
name = var.aks_cluster_name
resource_group_name = data.azurerm_resource_group.aks.name
}
Opcional: Criar e atribuir uma definição de política personalizada
A secção de definição de política personalizada é informativa e está fora do âmbito deste artigo. As políticas personalizadas permitem definir regras para usar o Azure. Por exemplo, você pode impor os seguintes tipos de regras:
- Práticas de segurança.
- Gestão de custos.
- Regras específicas da organização, como convenções de nomes ou locais.
Antes de criar uma política personalizada, verifique a lista de padrões e exemplos comuns para ver se o seu caso já está coberto.
As definições de política personalizadas são escritas em JSON. Para saber mais sobre como criar uma política personalizada, consulte Estrutura de definição de política do Azure e Criar uma definição de política personalizada.
Nota
O Azure Policy usa uma propriedade chamada templateInfo que podes usar para definir o tipo de origem do template de restrição. Quando defines templateInfo nas definições de políticas, não podes usar restritionTemplate ou propriedades de restrições . Você ainda precisa definir apiGroups e tipos. Para mais informações, consulte Compreender os efeitos do Azure Policy.
Depois de criar a sua definição de política personalizada, consulte Atribuir uma definição de política para um guia passo a passo para atribuir a política ao seu cluster.
Validar se uma Política do Azure está em execução
Confirme que as atribuições de políticas são aplicadas ao seu cluster usando o seguinte kubectl get comando.
kubectl get constrainttemplates
Nota
As atribuições de política podem levar até 20 minutos para serem sincronizadas em cada cluster.
Sua saída deve ser semelhante à saída de exemplo a seguir:
NAME AGE
k8sazureallowedcapabilities 23m
k8sazureallowedusersgroups 23m
k8sazureblockhostnamespace 23m
k8sazurecontainerallowedimages 23m
k8sazurecontainerallowedports 23m
k8sazurecontainerlimits 23m
k8sazurecontainernoprivilege 23m
k8sazurecontainernoprivilegeescalation 23m
k8sazureenforceapparmor 23m
k8sazurehostfilesystem 23m
k8sazurehostnetworkingports 23m
k8sazurereadonlyrootfilesystem 23m
k8sazureserviceallowedports 23m
Validar a rejeição de um pod privilegiado
Teste o que acontece quando programa um pod com o contexto de segurança de privileged: true. Esse contexto de segurança aumenta os privilégios do pod. A iniciativa desautoriza pods privilegiados, por isso o pedido é negado, o que resulta na rejeição da implantação.
Crie um arquivo nomeado
nginx-privileged.yamle cole no seguinte manifesto YAML.apiVersion: v1 kind: Pod metadata: name: nginx-privileged spec: containers: - name: nginx-privileged image: mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine securityContext: privileged: trueCria o pod usando o
kubectl applycomando e especifica o nome do teu manifesto YAML.kubectl apply -f nginx-privileged.yamlComo esperado, o pod não consegue ser agendado, conforme mostrado na saída de exemplo a seguir:
Error from server ([denied by azurepolicy-container-no-privilege-00edd87bf80f443fa51d10910255adbc4013d590bec3d290b4f48725d4dfbdf9] Privileged container is not allowed: nginx-privileged, securityContext: {"privileged": true}): error when creating "privileged.yaml": admission webhook "validation.gatekeeper.sh" denied the request: [denied by azurepolicy-container-no-privilege-00edd87bf80f443fa51d10910255adbc4013d590bec3d290b4f48725d4dfbdf9] Privileged container is not allowed: nginx-privileged, securityContext: {"privileged": true}O pod não atinge o estágio de agendamento, portanto, não há recursos para remover antes de prosseguir.
Testar a criação de um pod sem privilégios
No exemplo anterior, a imagem do contentor tentou automaticamente utilizar o utilizador root para associar NGINX à porta 80. A iniciativa política nega este pedido, pelo que o pod não arranca. Agora, tenta executar esse mesmo NGINX pod sem acesso privilegiado.
Crie um ficheiro com o nome
nginx-unprivileged.yamle cole o seguinte manifesto YAML nele.apiVersion: v1 kind: Pod metadata: name: nginx-unprivileged spec: containers: - name: nginx-unprivileged image: mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpineCria o pod usando o
kubectl applycomando e especifica o nome do teu manifesto YAML.kubectl apply -f nginx-unprivileged.yamlVerifica o estado do pod usando o
kubectl get podscomando.kubectl get podsO seu output deve ser semelhante ao exemplo abaixo, que mostra que o pod foi agendado com êxito e encontra-se com o status de Em execução.
NAME READY STATUS RESTARTS AGE nginx-unprivileged 1/1 Running 0 18sEste exemplo mostra a iniciativa de base que afeta apenas as implantações que violam as políticas da coleção. As implantações permitidas continuam funcionando.
Elimina o
NGINXpod sem privilégios usando okubectl deletecomando e especifica o nome do teu manifesto YAML.kubectl delete -f nginx-unprivileged.yaml
Use os passos seguintes para atribuir uma iniciativa Azure Policy integrada ao seu cluster AKS usando o Terraform.
Recuperar a iniciativa incorporada do Azure Policy
A seguinte fonte de dados recupera a iniciativa incorporada do Azure Policy para os padrões de segurança dos pods Kubernetes.
data "azurerm_policy_set_definition" "aks_pod_security_baseline" {
display_name = "Kubernetes cluster pod security baseline standards for Linux-based workloads"
}
Atribuir a iniciativa Azure Policy
O recurso seguinte atribui a iniciativa Azure Policy incorporada ao grupo de recursos que contém o cluster AKS.
Defina o efeito da política para Deny bloquear cargas de trabalho que violem as regras de política definidas.
resource "azurerm_resource_group_policy_assignment" "aks_pod_security_baseline" {
name = "aks-pod-security-baseline"
display_name = "Kubernetes cluster pod security baseline standards for Linux-based workloads"
resource_group_id = data.azurerm_resource_group.aks.id
policy_definition_id = data.azurerm_policy_set_definition.aks_pod_security_baseline.id
parameters = jsonencode({
effect = {
value = "Deny"
}
})
}
Inicializar a configuração do Terraform
Execute terraform init para inicializar o diretório de trabalho do Terraform e descarregue os plugins do fornecedor necessários.
terraform init
Formatar e validar a configuração
Executa terraform fmt para formatar a configuração do Terraform.
terraform fmt
Execute terraform validate para validar a sintaxe de configuração do Terraform.
terraform validate
Aplicar a configuração Terraform
Antes de implementar a configuração, forneça valores para as seguintes variáveis:
resource_group_nameaks_cluster_name
Execute terraform apply para implementar a atribuição do Azure Policy.
terraform apply
Quando solicitado, introduza yes para confirmar a implantação.
Verifique a instalação do Azure Policy
Após a implementação concluída, verifique se os componentes do Azure Policy estão a correr no cluster AKS.
kubectl get pods -n kube-system
Verifique se os templates de restrições do Gatekeeper foram instalados com sucesso.
kubectl get constrainttemplates
Testar a atribuição do Azure Policy
Crie um ficheiro com o nome privileged-pod.yaml.
apiVersion: v1
kind: Pod
metadata:
name: privileged-pod
spec:
containers:
- name: nginx
image: nginx
securityContext:
privileged: true
Aplique o manifesto ao cluster.
kubectl apply -f privileged-pod.yaml
A implementação falha porque a atribuição de Política do Azure impede a utilização de contentores privilegiados que violam as normas de referência de segurança de pods configuradas.
Desativar uma política ou iniciativa
Remova a iniciativa base no portal do Azure utilizando os seguintes passos:
- Vá ao painel de Políticas no portal Azure.
- Selecione Tarefas.
- Selecione a reticência (
...) no final da linha para os padrões de referência de segurança dos clusters Kubernetes para a iniciativa de carga de trabalho baseada em Linux . - Selecione Excluir atribuição.
Para remover o add-on Azure Policy do seu cluster AKS, veja Remover o add-on.
Próximos passos
Para obter mais informações sobre como funciona a Política do Azure, consulte os seguintes artigos: