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 integradas em seus clusters do Serviço de Kubernetes do Azure (AKS) usando o Azure Policy. O Azure Policy ajuda a impor os 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. Consulte as definições internas da Política do Azure para AKS para obter uma lista completa de definições de políticas e iniciativas AKS.

Este artigo mostra como aplicar definições de política ao cluster e verificar se essas atribuições estão sendo impostas.

Pré-requisitos

Atribuir uma definição de política incorporada

Você pode aplicar uma definição de política ou iniciativa no portal do Azure usando as etapas a seguir:

  1. Navegue até o serviço de Azure Policy no portal do 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 novas implantações violando 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.

Criar e atribuir uma definição de política personalizada

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 custo
  • Regras específicas da organização (como nomeação ou localizações)

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

O Azure Policy agora utiliza uma nova propriedade conhecida como templateInfo que permite que você defina o tipo de fonte para o modelo de restrição. Quando você define templateInfo em definições de política, você não precisa definir constraintTemplate ou propriedades de restrição. Você ainda precisa definir apiGroups e tipos. Para obter mais informações, confira Noções básicas dos efeitos do Azure Policy.

Depois de criar sua definição de política personalizada, consulte Atribuir uma definição de política para obter um passo a passo de como atribuir a política ao seu cluster do Kubernetes.

Validar se uma Azure Policy está em execução

  • Confirme se as atribuições de política foram aplicadas ao seu cluster usando o seguinte comando 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

Primeiro, vamos testar 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 comando kubectl apply e especifique o nome do seu 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 do contêiner tentou usar root automaticamente para vincular o NGINX à porta 80. A iniciativa de política nega essa solicitação, portanto, o pod não consegue iniciar. Agora, vamos tentar executar o mesmo pod NGINX sem acesso privilegiado.

  1. Crie um arquivo chamado nginx-unprivileged.yaml e cole no manifesto YAML a seguir.

    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 comando kubectl apply e especifique o nome do seu manifesto YAML.

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

    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 sem privilégios NGINX usando o comando kubectl delete e especifique o nome do seu manifesto YAML.

    kubectl delete -f nginx-unprivileged.yaml
    

Desabilitar uma política ou iniciativa

Você pode remover a iniciativa de linha de base no portal do Azure ao usar as seguintes etapas:

  1. Navegue até o painel Política no portal do Azure.
  2. Selecione Atribuições.
  3. Selecione o botão ... ao lado da iniciativa de Padrões de linha de base de segurança do pod do cluster do Kubernetes para carga de trabalho baseada em Linux.
  4. Selecione Excluir atribuição.

Próximas etapas

Para obter mais informações sobre como o Azure Policy funciona, consulte os artigos a seguir: