Operar serviços de dados habilitados para Azure Arc com privilégios mínimos

Operar serviços de dados habilitados para Arc com privilégios mínimos é uma prática recomendada de segurança. Conceda apenas aos usuários e contas de serviço as permissões específicas necessárias para executar as tarefas necessárias. O Azure e o Kubernetes fornecem um modelo de controle de acesso baseado em função que pode ser usado para conceder essas permissões específicas. Este artigo descreve certos cenários comuns em que a segurança de menor privilégio deve ser aplicada.

Nota

Neste artigo, um nome de namespace de arc será usado. Se você optar por usar um nome diferente, use o mesmo nome em todo o texto. Neste artigo, o kubectl utilitário CLI é usado como exemplo. Qualquer ferramenta ou sistema que use a API do Kubernetes pode ser usado.

Implantar o controlador de dados do Azure Arc

A implantação do controlador de dados do Azure Arc requer algumas permissões que podem ser consideradas de alto privilégio, como a criação de um namespace Kubernetes ou a criação de uma função de cluster. As etapas a seguir podem ser seguidas para separar a implantação do controlador de dados em várias etapas, cada uma das quais pode ser executada por um usuário ou uma conta de serviço que tenha as permissões necessárias. Essa separação de tarefas garante que cada usuário ou conta de serviço no processo tenha apenas as permissões necessárias e nada mais.

Implantar um namespace no qual o controlador de dados será criado

Esta etapa criará um novo namespace Kubernetes dedicado no qual o controlador de dados Arc será implantado. É essencial executar essa etapa primeiro, porque as etapas a seguir usarão esse novo namespace como um escopo para as permissões que estão sendo concedidas.

Permissões necessárias para executar esta ação:

  • Espaço de nomes
    • Criar
    • Editar (se necessário para clusters OpenShift)

Execute um comando semelhante ao seguinte para criar um novo namespace dedicado no qual o controlador de dados será criado.

kubectl create namespace arc

Se você estiver usando o OpenShift, precisará editar as openshift.io/sa.scc.supplemental-groups e openshift.io/sa.scc.uid-range anotações no namespace usando kubectl edit namespace <name of namespace>. Altere essas anotações existentes para corresponder a esses IDs/intervalos específicos de UID e fsGroup.

openshift.io/sa.scc.supplemental-groups: 1000700001/10000
openshift.io/sa.scc.uid-range: 1000700001/10000

Atribuir permissões à conta de serviço de implantação e usuários/grupos

Esta etapa criará uma conta de serviço e atribuirá funções e funções de cluster à conta de serviço para que a conta de serviço possa ser usada em um trabalho para implantar o controlador de dados Arc com o mínimo de privilégios necessários.

Permissões necessárias para executar esta ação:

  • Conta de serviço
    • Criar
  • Funções
    • Criar
  • Vinculação de funções
    • Criar
  • Função de cluster
    • Criar
  • Vinculação de função de cluster
    • Criar
  • Todas as permissões que estão sendo concedidas à conta de serviço (consulte o arcdata-deployer.yaml abaixo para obter detalhes)

Salve uma cópia de arcdata-deployer.yaml e substitua o espaço reservado {{NAMESPACE}} no arquivo pelo namespace criado na etapa anterior, por exemplo: arc. Execute o seguinte comando para criar a conta de serviço do deployer com o arquivo editado.

kubectl apply --namespace arc -f arcdata-deployer.yaml

Conceder permissões aos usuários para criar o trabalho de bootstrapper e o controlador de dados

Permissões necessárias para executar esta ação:

  • Funções
    • Criar
  • Vinculação de funções
    • Criar

Salve uma cópia de arcdata-installer.yaml e substitua o espaço reservado {{INSTALLER_USERNAME}} no arquivo pelo nome do usuário ao qual conceder as permissões, por exemplo: john@contoso.com. Adicione assuntos adicionais de vinculação de função, como outros usuários ou grupos, conforme necessário. Execute o seguinte comando para criar as permissões do instalador com o arquivo editado.

kubectl apply --namespace arc -f arcdata-installer.yaml

Implantar o trabalho de bootstrapper

Permissões necessárias para executar esta ação:

  • Usuário atribuído à função arcdata-installer-role na etapa anterior

Execute o seguinte comando para criar o trabalho de bootstrapper que executará etapas preparatórias para implantar o controlador de dados.

kubectl apply --namespace arc -f https://raw.githubusercontent.com/microsoft/azure_arc/main/arc_data_services/deploy/yaml/bootstrapper.yaml

Criar o controlador de dados Arc

Agora você está pronto para criar o próprio controlador de dados.

Primeiro, crie uma cópia do arquivo de modelo localmente no seu computador para que você possa modificar algumas das configurações.

Crie as métricas e logs de painéis, nomes de usuário e senhas

Na parte superior do arquivo, você pode especificar um nome de usuário e senha que são usados para autenticar nos painéis de métricas e logs como administrador. Escolha uma senha segura e compartilhe-a apenas com aqueles que precisam ter esses privilégios.

Um segredo do Kubernetes é armazenado como uma string codificada em base64 - uma para o nome de usuário e outra para a senha.

echo -n '<your string to encode here>' | base64
# echo -n 'example' | base64

Opcionalmente, você pode criar certificados SSL/TLS para os logs e painéis de métricas. Siga as instruções em Especificar certificados SSL/TLS durante a implantação das ferramentas nativas do Kubernetes.

Editar a configuração do controlador de dados

Edite a configuração do controlador de dados conforme necessário:

NECESSÁRIO

  • location: altere este para ser o local do Azure onde os metadados sobre o controlador de dados serão armazenados. Reveja a lista de regiões disponíveis.
  • logsui-certificate-secret: O nome do segredo criado no cluster do Kubernetes para o certificado da interface do usuário de logs.
  • metricsui-certificate-secret: O nome do segredo criado no cluster do Kubernetes para o certificado da interface do usuário de métricas.

Analise esses valores e atualize para sua implantação:

  • storage..className: a classe de armazenamento a ser usada para os dados e arquivos de log do controlador de dados. Se você não tiver certeza das classes de armazenamento disponíveis em seu cluster Kubernetes, poderá executar o seguinte comando: kubectl get storageclass. O padrão é default, que pressupõe que há uma classe de armazenamento que existe e é nomeada padrão, não que há uma classe de armazenamento que é o padrão. Nota: Há duas configurações className a serem definidas para a classe de armazenamento desejada - uma para dados e outra para logs.

  • serviceType: Altere o tipo de serviço para NodePort se você não estiver usando um LoadBalancer.

  • Segurança Para o Azure Red Hat OpenShift ou Red Hat OpenShift Container Platform, substitua as configurações security: pelos seguintes valores no arquivo yaml do controlador de dados.

    security:
      allowDumps: false
      allowNodeMetricsCollection: false
      allowPodMetricsCollection: false
    

Opcional

As configurações a seguir são opcionais.

  • name: O nome padrão do controlador de dados é arc, mas você pode alterá-lo se desejar.
  • displayName: Defina isso com o mesmo valor que o atributo name na parte superior do arquivo.
  • registry: O Microsoft Container Registry é o padrão. Se você estiver extraindo as imagens do Microsoft Container Registry e enviando-as para um registro de contêiner privado, digite o endereço IP ou o nome DNS do seu registro aqui.
  • dockerRegistry: O segredo a ser usado para extrair as imagens de um registro de contêiner privado, se necessário.
  • repository: O repositório padrão no Microsoft Container Registry é arcdata. Se você estiver usando um registro de contêiner privado, insira o caminho da pasta/repositório que contém as imagens de contêiner de serviços de dados habilitados para Azure Arc.
  • imageTag: A tag da versão mais recente atual é padrão no modelo, mas você pode alterá-la se quiser usar uma versão mais antiga.
  • logsui-certificate-secret: O nome do segredo criado no cluster do Kubernetes para o certificado da interface do usuário de logs.
  • metricsui-certificate-secret: O nome do segredo criado no cluster do Kubernetes para o certificado da interface do usuário de métricas.

O exemplo a seguir mostra um yaml de controlador de dados concluído.

apiVersion: v1
data:
  password: <your base64 encoded password>
  username: <your base64 encoded username>
kind: Secret
metadata:
  name: metricsui-admin-secret
type: Opaque

---

apiVersion: v1
data:
  password: <your base64 encoded password>
  username: <your base64 encoded username>
kind: Secret
metadata:
  name: logsui-admin-secret
type: Opaque

---

apiVersion: arcdata.microsoft.com/v5
kind: DataController
metadata:
  name: arc-dc
spec:
  credentials:
    dockerRegistry: arc-private-registry # Create a registry secret named 'arc-private-registry' if you are going to pull from a private registry instead of MCR.
    serviceAccount: sa-arc-controller
  docker:
    imagePullPolicy: Always
    imageTag: v1.29.0_2024-04-09
    registry: mcr.microsoft.com
    repository: arcdata
  infrastructure: other # Must be a value in the array [alibaba, aws, azure, gcp, onpremises, other]
  security:
    allowDumps: true # Set this to false if deploying on OpenShift
    allowNodeMetricsCollection: true # Set this to false if deploying on OpenShift
    allowPodMetricsCollection: true # Set this to false if deploying on OpenShift
  services:
  - name: controller
    port: 30080
    serviceType: LoadBalancer # Modify serviceType based on your Kubernetes environment
  settings:
    ElasticSearch:
      vm.max_map_count: "-1"
    azure:
      connectionMode: indirect # Only indirect is supported for Kubernetes-native deployment for now.
      location: eastus # Choose a different Azure location if you want
      resourceGroup: <your resource group>
      subscription: <your subscription GUID>
    controller:
      displayName: arc-dc
      enableBilling: true
      logs.rotation.days: "7"
      logs.rotation.size: "5000"
  storage:
    data:
      accessMode: ReadWriteOnce
      className: default # Use default configured storage class or modify storage class based on your Kubernetes environment
      size: 15Gi
    logs:
      accessMode: ReadWriteOnce
      className: default # Use default configured storage class or modify storage class based on your Kubernetes environment
      size: 10Gi

Salve o arquivo editado em seu computador local e execute o seguinte comando para criar o controlador de dados:

kubectl create --namespace arc -f <path to your data controller file>

#Example
kubectl create --namespace arc -f data-controller.yaml

Monitorando o status de criação

A criação do controlador levará alguns minutos para ser concluída. Você pode monitorar o progresso em outra janela do terminal com os seguintes comandos:

kubectl get datacontroller --namespace arc
kubectl get pods --namespace arc

Você também pode verificar o status de criação ou logs de qualquer pod específico executando um comando como abaixo. Isso é especialmente útil para solucionar problemas.

kubectl describe pod/<pod name> --namespace arc
kubectl logs <pod name> --namespace arc

#Example:
#kubectl describe pod/control-2g7bl --namespace arc
#kubectl logs control-2g7b1 --namespace arc

Você tem várias opções adicionais para criar o controlador de dados do Azure Arc:

Só quer experimentar as coisas? Comece rapidamente com o Azure Arc Jumpstart no AKS, Amazon EKS ou GKE, ou em uma VM do Azure.