Proteja seus clusters do Serviço Kubernetes do Azure (AKS) com a Política do Azure

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:

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

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

    kubectl apply -f nginx-privileged.yaml
    

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

  1. Crie um ficheiro com o nome 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. Cria o pod usando o kubectl apply comando e especifica o nome do teu manifesto YAML.

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

    kubectl get pods
    

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

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

  4. Elimina o NGINX pod sem privilégios usando o kubectl delete comando 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_name
  • aks_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:

  1. Vá ao painel de Políticas no portal Azure.
  2. Selecione Tarefas.
  3. 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 .
  4. 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: