Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Você pode aplicar e impor políticas de segurança internas em seus clusters AKS (Serviço de Kubernetes do Azure) usando Azure Policy. O Azure Policy ajuda você a impor padrões organizacionais e a avaliar a conformidade em escala. Após você instalar o complemento Azure Policy 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 policysets) ao seu cluster. Para obter uma lista completa de definições de política e de iniciativa do AKS, consulte definições internas do Azure Policy para AKS.
Este artigo mostra como aplicar definições de política ao cluster e verificar se as atribuições são impostas.
Pré-requisitos
- Este artigo pressupõe que você tenha um cluster AKS existente. Se você precisar de um cluster do AKS, poderá criá-lo usando a CLI do Azure, o Azure PowerShell ou o portal do Azure.
- Você precisa ter o complemento Azure Policy para AKS instalado em seu cluster AKS.
Você precisa dos seguintes recursos instalados e configurados antes de começar:
- Este artigo pressupõe que você tenha um cluster AKS existente. Se você precisar de um cluster do AKS, poderá criá-lo usando a CLI do Azure, o Azure PowerShell ou o portal do Azure.
- Você precisa ter o complemento Azure Policy para AKS instalado em 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 a CLI do Azure, consulte Instalar a CLI do Azure.
- Kubectl instalado e configurado.
Atribuir uma definição de política interna ou iniciativa
Você pode aplicar uma definição de política ou iniciativa no portal Azure usando as seguintes etapas:
- Vá para o serviço Azure Policy no portal de Azure chamado Política.
- No painel esquerdo da página do Azure Policy, selecione Definições.
- Em Categorias, selecione
Kubernetes. - Escolha a definição de política ou a iniciativa que você deseja aplicar. Para este exemplo, selecione a iniciativa Padrões de linha de base de segurança do pod do cluster do Kubernetes para cargas de trabalho baseadas em Linux.
- Selecione Atribuir.
- Defina o Escopo para o grupo de recursos do cluster do AKS com o complemento Azure Policy habilitado.
- Selecione a página Parâmetros e atualize o Efeito de
auditparadenypara bloquear as novas implantações que violam 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 Examinar + criar>Criar para enviar 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 arquivo chamado main.tf.
touch main.tf
Abra o main.tf arquivo e adicione a configuração a seguir.
Configurar o provedor Terraform
A seguinte configuração:
- Define qual versão do Terraform será usada.
- Configura o provedor do AzureRM.
- Habilita os recursos do provedor do Azure necessários para o gerenciamento 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 variáveis a seguir para fornecer o nome do grupo de recursos existente e do cluster do AKS durante a implantaçã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
}
Fazer referência ao cluster do AKS existente
As fontes de dados a seguir recuperam informações sobre o grupo de recursos existente e o cluster do AKS. O Terraform usa esses dados para fazer referência à infraestrutura que já existe 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 seção de definição de política personalizada é informativa e está fora do escopo 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.
- Gerenciamento de custos.
- Regras específicas da organização, como convenções de nomenclatura 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 programadas em JSON. Para saber mais sobre como criar uma política personalizada, confira Estrutura de definição do Azure Policy e Criar uma definição de política personalizada.
Observação
Azure Policy usa uma propriedade chamada templateInfo que você pode usar para definir o tipo de origem para o modelo de restrição. Quando você define templateInfo em definições de política, não é possível usar as propriedades constraintTemplate ou constraint. Você ainda precisa definir apiGroups e tipos. Para obter mais informações, consulte Noções básicas sobre Azure Policy efeitos.
Depois de criar sua definição de política personalizada, consulte Atribuir uma definição de política para um passo a passo para atribuir a política ao cluster.
Validar se uma Azure Policy está em execução
Confirme se as atribuições de política são aplicadas ao cluster usando o comando a seguir kubectl get .
kubectl get constrainttemplates
Observação
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 do 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 você agenda um pod com o contexto de segurança de privileged: true. Esse contexto de segurança aumenta os privilégios do pod. A iniciativa não permite pods privilegiados, portanto a solicitação é negada, o que resulta na rejeição da implantação.
Crie um arquivo chamado
nginx-privileged.yamle cole no manifesto YAML a seguir.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: trueCrie o pod usando o
kubectl applycomando e especifique o nome do manifesto YAML.kubectl apply -f nginx-privileged.yamlComo esperado, o pod não consegue ser agendado, conforme mostrado na saída do 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 chega ao estágio de programação, portanto, não há recursos para excluir antes de você prosseguir.
Teste a criação de um pod sem privilégios
No exemplo anterior, a imagem de contêiner tentou usar automaticamente a raiz para associar NGINX à porta 80. A iniciativa de política nega essa solicitação, portanto, o pod não consegue iniciar. Agora, tente executar o mesmo NGINX pod sem acesso privilegiado.
Crie um arquivo nomeado
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-alpineCrie o pod usando o
kubectl applycomando e especifique o nome do manifesto YAML.kubectl apply -f nginx-unprivileged.yamlVerifique o status do pod usando o
kubectl get podscomando.kubectl get podsSua saída deve ser semelhante à saída do exemplo a seguir, que mostra que o pod foi agendado com sucesso e tem um status de Será executado:
NAME READY STATUS RESTARTS AGE nginx-unprivileged 1/1 Running 0 18sEste exemplo mostra a iniciativa de linha de base que afeta apenas as implantações que violam as políticas da coleção. As implantações permitidas continuam a funcionar.
Exclua o pod não privilegiado
NGINXusando o comandokubectl deletee especifique o nome do arquivo de manifesto YAML.kubectl delete -f nginx-unprivileged.yaml
Use as etapas a seguir para atribuir uma iniciativa de Azure Policy interna ao cluster do AKS usando o Terraform.
Recuperar a iniciativa de Azure Policy interna
A fonte de dados a seguir obtém a iniciativa do Azure Policy interna para padrões de referência de segurança de pods do 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 a seguir atribui a iniciativa Azure Policy interna ao grupo de recursos que contém o cluster do AKS.
Defina o efeito da política para Deny bloquear cargas de trabalho que violam 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 baixar os plug-ins de provedor necessários.
terraform init
Formatar e validar a configuração
Execute 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 do Terraform
Antes de implantar a configuração, forneça valores para as seguintes variáveis:
resource_group_nameaks_cluster_name
Execute terraform apply para implantar a atribuição de Azure Policy.
terraform apply
Quando solicitado, insira yes para confirmar a implantação.
Verificar a instalação do Azure Policy
Após a conclusão da implantação, verifique se os componentes de Azure Policy estão em execução no cluster do AKS.
kubectl get pods -n kube-system
Verifique se os modelos de restrição do Gatekeeper foram instalados com êxito.
kubectl get constrainttemplates
Testar a atribuição do Azure Policy
Crie um arquivo chamado 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 implantação falha porque a atribuição do Azure Policy nega contêineres privilegiados que violam os padrões de linha de base de segurança do pod configurados.
Desabilitar uma política ou iniciativa
Remova a iniciativa de linha de base no portal do Azure, usando as seguintes etapas:
- Vá para o painel Política no portal do Azure.
- Selecione Atribuições.
- Selecione as reticências (
...) no final da linha para os padrões de linha de base de segurança do pod de cluster do Kubernetes para a iniciativa de carga de trabalho baseada em Linux. - Selecione Excluir atribuição.
Para remover o complemento Azure Policy do cluster do AKS, consulte Remover o complemento.
Próximas etapas
Para obter mais informações sobre como o Azure Policy funciona, consulte os artigos a seguir: