Proteja seus clusters do Serviço de Kubernetes do Azure (AKS) com o Azure Policy

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

Você precisa dos seguintes recursos instalados e configurados antes de começar:

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:

  1. Vá para o serviço Azure Policy no portal de Azure chamado Política.
  2. No painel esquerdo da página do Azure Policy, selecione Definições.
  3. Em Categorias, selecione Kubernetes.
  4. 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.
  5. Selecione Atribuir.
  6. Defina o Escopo para o grupo de recursos do cluster do AKS com o complemento Azure Policy habilitado.
  7. Selecione a página Parâmetros e atualize o Efeito de audit para deny para 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.
  8. 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.

  1. Crie um arquivo chamado nginx-privileged.yaml e 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: true
    
  2. Crie o pod usando o kubectl apply comando e especifique o nome do manifesto YAML.

    kubectl apply -f nginx-privileged.yaml
    

    Como 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.

  1. Crie um arquivo nomeado nginx-unprivileged.yaml e 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-alpine
    
  2. Crie o pod usando o kubectl apply comando e especifique o nome do manifesto YAML.

    kubectl apply -f nginx-unprivileged.yaml
    
  3. Verifique o status do pod usando o kubectl get pods comando.

    kubectl get pods
    

    Sua 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          18s
    

    Este 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.

  4. Exclua o pod não privilegiado NGINX usando o comando kubectl delete e 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_name
  • aks_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:

  1. Vá para o painel Política no portal do Azure.
  2. Selecione Atribuições.
  3. 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.
  4. 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: