Habilitar configurações seguras no Operações do Azure IoT

As configurações seguras para Operações do Azure IoT incluem a configuração do gerenciamento de segredos e uma identidade gerenciada atribuída pelo usuário para conexões de nuvem; por exemplo, um servidor OPC UA ou pontos de extremidade de fluxo de dados.

Este artigo traz instruções para habilitar configurações seguras se você não fez isso durante a implantação inicial.

Pré-requisitos

  • O CLI do Azure instalado em seu computador de desenvolvimento. Verifique as extensões disponíveis do CLI do Azure para a versão mínima exigida para usar a extensão azure-iot-ops. Use az --version para verificar sua versão e az upgrade para atualizar, se necessário. Para obter mais informações, consulte Instale o CLI do Azure.

  • A extensão de Operações do Azure IoT da CLI do Azure. Use o seguinte comando para adicionar a extensão ou atualizá-la à versão mais recente:

    az extension add --upgrade --name azure-iot-ops
    
  • A versão mais recente da extensão connectedk8s para CLI do Azure. Use o seguinte comando para adicionar a extensão ou atualizá-la à versão mais recente:

    az extension add --upgrade --name connectedk8s
    

Os CLI do Azure exemplos deste artigo usam variáveis de ambiente para que você possa definir cada valor uma vez e então copiar e colar os comandos as-is. Se você está usando o ambiente Operações do Azure IoT Codespaces do quickstart, essas variáveis já estão definidas para você e você pode pular essa etapa. Caso contrário, defina as seguintes variáveis de ambiente no seu shell antes de executar os comandos.

Os seguintes scripts definem as variáveis de ambiente mais comumente usadas:

Variável de ambiente Descrição
SUBSCRIPTION_ID O ID da assinatura que contém sua instância do Operações do Azure IoT.
RESOURCE_GROUP O nome do grupo de recursos que contém sua instância do Operações do Azure IoT.
AIO_INSTANCE_NAME O nome da sua instância do Operações do Azure IoT. Para listar suas instâncias, execute az iot ops list -o table.
CLUSTER_NAME O nome do cluster Kubernetes habilitado para Azure Arc que hospeda sua instância.
LOCATION A região do Azure a ser usada para novos recursos, por exemplo, eastus.
SUBSCRIPTION_ID=<subscription-id>
RESOURCE_GROUP=<resource-group-name>
AIO_INSTANCE_NAME=<instance-name>
CLUSTER_NAME=<cluster-name>
LOCATION=<region>

Você só precisa definir as variáveis que este artigo utiliza. Este artigo pode usar variáveis adicionais de ambiente para nomes de recursos que você escolher. O artigo explica como posicioná-los onde são apresentados.

Habilitar o cluster para configurações seguras

Para habilitar a sincronização de segredos para sua instância de Operações de IoT do Azure, os recursos de emissor OIDC e federação de identidade de carga de trabalho devem estar habilitados em seu cluster. Essa configuração é necessária para a extensão Azure Key Vault Secret Store para sincronizar os segredos de um Azure Key Vault e armazená-los na borda como segredos do Kubernetes.

Para clusters do AKS (Serviço de Kubernetes do Azure), você pode ativar os recursos de emissor OIDC e de identidade de carga de trabalho durante a criação do cluster ou em um cluster existente. Para mais informações, veja Implantar e configurar o ID de carga de trabalho do Microsoft Entra em um cluster AKS. Para clusters no AKS Edge Essentials, o script automatizado habilita esses recursos por padrão. Para clusters do AKS no Azure Local, siga as etapas para Deploy e configurar a identidade de carga de trabalho em um AKS habilitado por Azure Arc cluster para criar um novo cluster se você não tiver um com os recursos necessários.

Para clusters k3s no Kubernetes, você pode atualizar um cluster existente. Para habilitar e configurar esses recursos, use as seguintes etapas:

  1. Atualize o cluster para habilitar a identidade do emissor e da carga de trabalho do OIDC.

    az connectedk8s update -n $CLUSTER_NAME -g $RESOURCE_GROUP --enable-oidc-issuer --enable-workload-identity
    

    Se você habilitou os recursos de identidade do emissor e da carga de trabalho do OIDC quando criou o cluster, não precisará executar o comando anterior novamente. Use o seguinte comando para verificar o status dos recursos de identidade da carga de trabalho e emissor do OIDC para o cluster:

    az connectedk8s show -g $RESOURCE_GROUP -n $CLUSTER_NAME --query "{ClusterName:name, OIDCIssuerEnabled:oidcIssuerProfile.enabled, WorkloadIdentityEnabled:securityProfile.workloadIdentity.enabled}"
    
  2. Obtenha a URL do emissor do cluster.

    az connectedk8s show -g $RESOURCE_GROUP -n $CLUSTER_NAME --query oidcIssuerProfile.issuerUrl --output tsv
    

    Anote a saída desse comando a ser usada nas próximas etapas.

  3. Crie o arquivo de configuração k3s no computador em que você implantou o cluster do Kubernetes:

    sudo nano /etc/rancher/k3s/config.yaml
    
  4. Adicione o seguinte conteúdo ao arquivo config.yaml, substituindo o espaço reservado <SERVICE_ACCOUNT_ISSUER> pela URL do emissor do cluster da qual você anotou anteriormente:

    kube-apiserver-arg:
    - service-account-issuer=<SERVICE_ACCOUNT_ISSUER>
    - service-account-max-token-expiration=24h
    

    Salve o arquivo e saia do editor nano.

  5. Reinicie o serviço do k3s:

    sudo systemctl restart k3s
    

Configurar o gerenciamento de segredos

O gerenciamento de segredos para operações de IoT do Azure usa a extensão do Repositório de Segredos para sincronizar os segredos de um Azure Key Vault e armazená-los na borda como segredos do Kubernetes. A extensão do Repositório de Segredos requer uma identidade gerenciada atribuída pelo usuário com acesso ao Azure Key Vault em que os segredos são armazenados. Para saber mais, confira O que são identidades gerenciadas para recursos do Azure?

Para configurar o gerenciamento de segredos:

  1. Crie um Azure Key Vault para armazenar segredos e dê permissões para sua conta de usuário gerenciar segredos atribuindo a funçãoKey Vault Secrets Officer. Verifique se o cofre de chaves utiliza controle de acesso baseado em função do Azure como seu modelo de permissão. Para verificar essa configuração no portal do Azure, selecione seu cofre de chaves e depois selecioneConfiguração de Acesso>.

  2. Crie uma identidade gerenciada atribuída pelo usuário para a extensão do Repositório de Segredos a ser usada para acessar o cofre de chaves.

  3. Use o comando az iot ops secretsync enable para configurar a instância Operações do Azure IoT para sincronização secreta. Este comando:

    • Cria uma credencial da identidade federada usando a identidade gerenciada atribuída pelo usuário.
    • Adiciona uma atribuição de função à identidade gerenciada atribuída pelo usuário para acesso ao Azure Key Vault.
    • Adiciona uma classe de provedor de segredo mínima associada à instância de Operações do Azure IoT.
    # Variable block
    AIO_INSTANCE_NAME="<AIO_INSTANCE_NAME>"
    RESOURCE_GROUP="<RESOURCE_GROUP>"
    USER_ASSIGNED_MI_NAME="<USER_ASSIGNED_MI_NAME>"
    KEYVAULT_NAME="<KEYVAULT_NAME>"
    
    #Get the resource ID of the user-assigned managed identity
    USER_ASSIGNED_MI_RESOURCE_ID=$(az identity show --name $USER_ASSIGNED_MI_NAME --resource-group $RESOURCE_GROUP --query id --output tsv)
    
    #Get the resource ID of the key vault
    KEYVAULT_RESOURCE_ID=$(az keyvault show --name $KEYVAULT_NAME --resource-group $RESOURCE_GROUP --query id --output tsv)
    
    #Enable secret synchronization
    az iot ops secretsync enable --instance $AIO_INSTANCE_NAME \
                                 --resource-group $RESOURCE_GROUP \
                                 --mi-user-assigned $USER_ASSIGNED_MI_RESOURCE_ID \
                                 --kv-resource-id $KEYVAULT_RESOURCE_ID
    

Agora que a configuração de sincronização de segredos está concluída, você pode consultar Gerenciar segredos para sua implantação do Operações do Azure IoT para saber como usar segredos com o Operações do Azure IoT.

Configurar uma identidade gerenciada atribuída pelo usuário para conexões de nuvem

Alguns componentes das Operações do Azure IoT, como terminais de fluxo de dados, usam uma identidade gerenciada atribuída ao usuário para conexões de nuvem. Recomendamos usar uma identidade separada daquela usada para configurar o gerenciamento de segredos.

  1. Crie uma identidade gerenciada atribuída pelo usuário que seja usada para conexões de nuvem.

    Note

    Você precisará conceder a permissão de identidade para qualquer recurso de nuvem para o qual usará a identidade gerenciada.

  2. Use o comando az iot ops identity assign para atribuir a identidade à instância Operações do Azure IoT. Esse comando também cria uma credencial de identidade federada usando o emissor OIDC do cluster conectado indicado e a conta de serviço Operações do Azure IoT.

    Importante

    A versão padrão desse comando atribui uma identidade para fluxos de dados. Se você planeja usar grafos de fluxo de dados, inclua o --usage parâmetro com o valor wasm-graph.

    # Variable block
    AIO_INSTANCE_NAME="<AIO_INSTANCE_NAME>"
    RESOURCE_GROUP="<RESOURCE_GROUP>"
    USER_ASSIGNED_MI_NAME="<USER_ASSIGNED_MI_NAME FOR CLOUD CONNECTIONS>"
    
    #Get the resource ID of the user-assigned managed identity
    USER_ASSIGNED_MI_RESOURCE_ID=$(az identity show --name $USER_ASSIGNED_MI_NAME --resource-group $RESOURCE_GROUP --query id --output tsv)
    
    #Assign the identity to the Azure IoT Operations instance
    az iot ops identity assign --name $AIO_INSTANCE_NAME \
                               --resource-group $RESOURCE_GROUP \
                               --mi-user-assigned $USER_ASSIGNED_MI_RESOURCE_ID
    
  3. Reinicie os pods do registro de esquema para aplicar a nova identidade.

    kubectl rollout restart statefulset adr-schema-registry -n azure-iot-operations
    

Agora, você poderá usar essa identidade gerenciada em pontos de extremidade do fluxo de dados para conexões de nuvem.

Bloquear o acesso do pod ao Serviço de Metadados de Instância do Azure

Quando você implanta as Operações do Azure IoT com configurações seguras no AKS, a Microsoft recomenda bloquear o acesso do pod ao ponto de extremidade do Serviço de Metadados de Instância do Azure. Para saber como habilitar esse recurso, consulte Bloqueie o acesso do pod ao ponto de extremidade do Serviço de Metadados de Instância (IMDS) da Azure.