Como criar definições de políticas de configuração de computador personalizadas

Antes de começar, é uma boa ideia ler a página de visão geral da configuração de máquina e os detalhes sobre as opções de correção da configuração de máquina.

Importante

A extensão de configuração de convidado é necessária para as máquinas virtuais do Azure. Para implantar a extensão em escala em todos os computadores, atribua a seguinte iniciativa de política: Deploy prerequisites to enable machine configuration policies on virtual machines

Para usar pacotes de configuração de máquina que aplicam configurações, é necessária a extensão de configuração de convidado da VM do Azure versão 1.26.24 ou posterior, ou Arc agent 1.10.0 ou posterior.

As definições personalizadas da política de configuração de máquina usando AuditIfNotExists ou DeployIfNotExists estão no status do suporte Disponibilidade Geral (GA).

Use as etapas a seguir para criar as suas próprias políticas que auditam a conformidade ou gerenciam o estado das máquinas habilitadas para Azure ou Arc.

Instale o PowerShell 7 e os módulos necessários do PowerShell

Primeiro, configure um ambiente de criação de configuração de máquina para instalar a versão necessária do PowerShell para o sistema operacional e o módulo GuestConfiguration.

Criar e publicar um artefato de pacote de configuração de computador

Se você ainda não o fez, crie e publique um pacote personalizado de configurações de máquina seguindo as etapas em Como criar artefatos no pacote personalizado de configurações de máquina. Em seguida, valide o pacote no seu ambiente de desenvolvimento seguindo as etapas em Como testar os artefatos do pacote de configurações de máquina.

Observação

O código de exemplo neste artigo faz referência à variável $contentUri. Se você estiver usando a mesma sessão do PowerShell dos tutoriais anteriores para criar e testar seus artefatos de pacote, talvez essa variável já tenha o URI do pacote.

Se você não tiver a variável $contentUri definida como o URI do pacote em sua sessão do PowerShell, precisará defini-la. Este exemplo usa a cadeia de conexão de uma conta de armazenamento e o cmdlet New-AzStorageContext para criar um contexto de armazenamento. Em seguida, ele obtém o blob de armazenamento para o pacote publicado e usa as propriedades desse objeto para obter o URI do conteúdo.

$connectionString = '<storage-account-connection-string>'
$context = New-AzStorageContext -ConnectionString $connectionString
$getParams = @{
    Context   = $context
    Container = '<container-name>'
    Blob      = '<published-package-file-name>'
}
$blob = Get-AzStorageBlob @getParams
$contentUri = $blob.ICloudBlob.Uri.AbsoluteUri

Requisitos de política para configuração de computador

A seção metadata de definição da política deve incluir duas propriedades para que o serviço de configuração de máquina automatize o provisionamento e a emissão de relatórios de atribuições de configuração de convidados. A propriedade category deve ser definida como Guest Configuration e uma seção chamada guestConfiguration deve conter informações sobre a atribuição de configuração de máquina. O cmdlet New-GuestConfigurationPolicy cria esse texto automaticamente.

O exemplo a seguir demonstra a seção metadados criada automaticamente por New-GuestConfigurationPolicy.

"metadata": {
    "category": "Guest Configuration",
    "guestConfiguration": {
        "name": "test",
        "version": "1.0.0",
        "contentType": "Custom",
        "contentUri": "CUSTOM-URI-HERE",
        "contentHash": "CUSTOM-HASH-VALUE-HERE",
        "configurationParameter": {}
    }
}

Se o efeito da definição for definido como DeployIfNotExists, a seção e depois deverá conter os detalhes da implantação sobre uma atribuição de configuração de máquina. O cmdlet New-GuestConfigurationPolicy cria esse texto automaticamente.

Criar uma definição do Azure Policy

Depois que um pacote de política personalizada de configuração de computador tiver sido criado e carregado, crie a definição de política de configuração de computador. O cmdlet New-GuestConfigurationPolicy usa um pacote de política personalizado e cria uma definição de política.

O parâmetro PolicyId da New-GuestConfigurationPolicy exige uma única cadeia de caracteres. É obrigatório um GUID (Identificador Global Exclusivo). Para novas definições, gere um novo GUID utilizando o cmdlet New-GUID. Ao fazer atualizações na definição, use a mesma cadeia de caracteres exclusiva para PolicyId para garantir que a definição correta seja atualizada.

Parâmetros do cmdlet New-GuestConfigurationPolicy:

  • PolicyId: um GUID.
  • ContentUri: URI de HTTP(s) público do pacote de conteúdo da configuração de computador.
  • DisplayName: nome de exibição da política.
  • Descrição: descrição da política.
  • Parâmetro: os parâmetros da política fornecidos em uma tabela de hash.
  • PolicyVersion: versão da política.
  • Caminho: caminho de destino no qual as definições de política são criadas. Não especifique esse parâmetro como o caminho para uma cópia local do pacote.
  • Platform: a plataforma de destino (Windows/Linux) da política de configuração de computador e do pacote de conteúdo.
  • Modo: (diferencia maiúsculas de minúsculas: ApplyAndMonitor, ApplyAndAutoCorrect, Audit) escolha se a política deve auditar ou implantar a configuração. O padrão é Audit.
  • Tag: adiciona um ou mais filtros de marca à definição de política.
  • Category: define o campo de metadados da categoria na definição de política.
  • LocalContentPath: o caminho para a cópia local do arquivo de pacote .zip Machine Configuration. Esse parâmetro será necessário se você estiver usando uma Identidade Gerenciada Atribuída pelo Usuário para fornecer acesso a um blob do Armazenamento do Microsoft Azure.
  • ManagedIdentityResourceId: o resourceId da Identidade Gerenciada Atribuída pelo Usuário que tem acesso de leitura ao blob de Armazenamento do Azure que contém o arquivo de pacote .zip Machine Configuration. Esse parâmetro será necessário se você estiver usando uma Identidade Gerenciada Atribuída pelo Usuário para fornecer acesso a um blob do Armazenamento do Microsoft Azure.
  • ExcludeArcMachines: especifica que a definição de política deve excluir computadores Arc. Esse parâmetro será necessário se você estiver usando uma Identidade Gerenciada Atribuída pelo Usuário para fornecer acesso a um blob do Armazenamento do Microsoft Azure.

Importante

Ao contrário das VMs do Azure, as máquinas conectadas ao Arc não aceitam identidades gerenciadas atribuídas pelo usuário no momento. Como resultado, o sinalizador -ExcludeArcMachines é necessário para garantir a exclusão desses computadores da definição de política. Para que a VM do Azure baixe o pacote atribuído e aplique a política, o Agente de Configuração de Convidado deve ter a versão 1.29.82.0 ou superior para Windows e a versão 1.26.76.0ou superior para Linux.

Para obter mais informações sobre o parâmetro Modo, consulte a página Como configurar as opções de correção para a configuração de máquina.

Crie uma definição de política que audite usando um pacote de configuração personalizado, em um caminho especificado:

$PolicyConfig      = @{
  PolicyId      = '_My GUID_'
  ContentUri    = $contentUri
  DisplayName   = 'My audit policy'
  Description   = 'My audit policy'
  Path          = './policies/auditIfNotExists.json'
  Platform      = 'Windows'
  PolicyVersion = 1.0.0
}

New-GuestConfigurationPolicy @PolicyConfig

Crie uma definição de política que imponha um pacote de configuração personalizado, em um caminho especificado:

$PolicyConfig2      = @{
  PolicyId      = '_My GUID_'
  ContentUri    = $contentUri
  DisplayName   = 'My deployment policy'
  Description   = 'My deployment policy'
  Path          = './policies/deployIfNotExists.json'
  Platform      = 'Windows'
  PolicyVersion = 1.0.0
  Mode          = 'ApplyAndAutoCorrect'
}

New-GuestConfigurationPolicy @PolicyConfig2

Crie uma definição de política que imponha um pacote de configuração personalizado usando uma Identidade Gerenciada Atribuída pelo Usuário:

$PolicyConfig3      = @{
  PolicyId                  = '_My GUID_'
  ContentUri                = $contentUri
  DisplayName               = 'My deployment policy'
  Description               = 'My deployment policy'
  Path                      = './policies/deployIfNotExists.json'
  Platform                  = 'Windows'
  PolicyVersion             = 1.0.0
  Mode                      = 'ApplyAndAutoCorrect'
  LocalContentPath          = "C:\Local\Path\To\Package"      # Required parameter for managed identity
  ManagedIdentityResourceId = "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{identityName}" # Required parameter for managed identity
}

New-GuestConfigurationPolicy @PolicyConfig3 -ExcludeArcMachines

Observação

Você pode recuperar a resourceId de uma identidade gerenciada usando o cmdlet Get-AzUserAssignedIdentity do PowerShell.

A saída do cmdlet retorna um objeto que contém o nome para exibição da definição e o caminho dos arquivos de políticas. Arquivos JSON de definição que criam definições de política de auditoria têm o nome auditIfNotExists.json e os arquivos que criam definições de política para aplicar as configurações têm o nome deployIfNotExists.json.

Filtrar políticas de configuração de computador usando marcas

As definições de política criadas por cmdlets no módulo GuestConfiguration podem incluir opcionalmente um filtro para marcas. O parâmetro Marca de New-GuestConfigurationPolicy suporta uma matriz de tabelas de hash contendo entradas de marcas individuais. As marcas são adicionadas à seção if da definição de política e não podem ser modificadas por uma atribuição de política.

Segue um exemplo de uma definição de política que filtra por marcas.

"if": {
  "allOf" : [
    {
      "allOf": [
        {
          "field": "tags.Owner",
          "equals": "BusinessUnit"
        },
        {
          "field": "tags.Role",
          "equals": "Web"
        }
      ]
    },
    {
      // Original machine configuration content
    }
  ]
}

Usar parâmetros em definições de políticas de configuração de computador personalizadas

A configuração de máquina suporta as propriedades de substituição de uma Configuração DSC em tempo de execução. Com esse recurso, os valores no arquivo MOF no pacote não precisam ser considerados estáticos. Os valores da substituição são fornecidos por meio da Azure Policy e não alteram a forma como as Configurações do DSC são criadas ou compiladas.

A configuração do computador dá suporte aos seguintes tipos de valor para os parâmetros:

  • String
  • Boolean
  • Double
  • Flutuante

Os cmdlets New-GuestConfigurationPolicy e Get-GuestConfigurationPackageComplianceStatus incluem um parâmetro denominado Parameter. Esse parâmetro usa uma definição de tabela de hash, incluindo todos os detalhes sobre cada parâmetro e cria as seções necessárias de cada arquivo usado para a definição da Azure Policy.

O exemplo a seguir cria uma definição de política para auditar um serviço, no qual o usuário seleciona a partir de uma lista no momento da atribuição da política.

# This DSC resource definition...
Service 'UserSelectedNameExample' {
    Name   = 'ParameterValue'
    Ensure = 'Present'
    State  = 'Running'
}

# ...can be converted to a hash table:
$PolicyParameterInfo     = @(
  @{
    # Policy parameter name (mandatory)
    Name                 = 'ServiceName'
    # Policy parameter display name (mandatory)
    DisplayName          = 'windows service name.'
    # Policy parameter description (optional)
    Description          = 'Name of the windows service to be audited.'
    # DSC configuration resource type (mandatory)
    ResourceType         = 'Service'
    # DSC configuration resource id (mandatory)
    ResourceId           = 'UserSelectedNameExample'
    # DSC configuration resource property name (mandatory)
    ResourcePropertyName = 'Name'
    # Policy parameter default value (optional)
    DefaultValue         = 'winrm'
    # Policy parameter allowed values (optional)
    AllowedValues        = @('BDESVC','TermService','wuauserv','winrm')
  })

# ...and then passed into the `New-GuestConfigurationPolicy` cmdlet
$PolicyParam = @{
  PolicyId      = 'My GUID'
  ContentUri    = $contentUri
  DisplayName   = 'Audit Windows Service.'
  Description   = "Audit if a Windows Service isn't enabled on Windows machine."
  Path          = '.\policies\auditIfNotExists.json'
  Parameter     = $PolicyParameterInfo
  PolicyVersion = 1.0.0
}

New-GuestConfigurationPolicy @PolicyParam

Publicar a definição do Azure Policy

Por fim, é possível publicar as definições de política usando o cmdlet New-AzPolicyDefinition. Os comandos abaixo publicam sua política de configuração de máquina no centro de políticas.

Para executar o comando New-AzPolicyDefinition, você precisa de acesso para criar as definições de política no Azure. Os requisitos de autorização específicos estão documentados na página Visão geral do Azure Policy. A função interna recomendada é Resource Policy Contributor.

New-AzPolicyDefinition -Name 'mypolicydefinition' -Policy '.\policies\auditIfNotExists.json'

Ou, se a política for uma política de implantação, se não existir política (DINE), use este comando:

New-AzPolicyDefinition -Name 'mypolicydefinition' -Policy '.\policies\deployIfNotExists.json'

Com a definição de política criada no Azure, a última etapa é atribuir a definição. Veja como atribuir a definição com Portal, CLI do Azure e Azure PowerShell.

Ciclo de vida da política

Se você quiser liberar uma atualização para a definição da política, faça a alteração tanto para o pacote de configuração do convidado quanto para os detalhes da definição do Azure Policy.

Observação

A propriedade version da atribuição de configuração de computador afeta apenas os pacotes que são hospedados pela Microsoft. A melhor prática para o controle de versão de conteúdo personalizado é incluir a versão no nome do arquivo.

Primeiro, ao executar New-GuestConfigurationPackage, especifique um nome para o pacote que o torne exclusivo das versões anteriores. Você pode incluir um número de versão no nome, como PackageName_1.0.0. O número neste exemplo é usado apenas para tornar o pacote exclusivo, não para especificar que o pacote deve ser considerado mais recente ou mais antigo que outros pacotes.

Em segundo lugar, atualize os parâmetros usados com o cmdlet New-GuestConfigurationPolicy seguindo cada uma das explicações a seguir.

  • Versão: ao executar o cmdlet New-GuestConfigurationPolicy, você deve especificar um número de versão maior do que o que está publicado atualmente.
  • contentUri: ao executar o cmdlet New-GuestConfigurationPolicy, você deve especificar um URI para o local do pacote. A inclusão de uma versão de pacote no nome do arquivo garante que o valor dessa propriedade seja alterado em cada versão.
  • contentHash: O cmdlet New-GuestConfigurationPolicy atualiza essa propriedade automaticamente. Trata-se de um valor de hash do pacote criado por New-GuestConfigurationPackage. A propriedade deve estar correta para o arquivo .zip que você publicar. Se apenas a propriedade contentUri for atualizada, a Extensão rejeitará o pacote de conteúdos.

A maneira mais fácil de lançar um pacote atualizado é repetir o processo descrito neste artigo e especificar um número de versão atualizado. Esse processo garante que todas as propriedades tenham sido atualizadas corretamente.

Próximas etapas