Compartilhar via


Mitigações adicionais

O Credential Guard oferece mitigações contra ataques a credenciais derivadas, impedindo a utilização de credenciais roubadas noutro local. No entanto, os dispositivos podem continuar vulneráveis a determinados ataques, mesmo que as credenciais derivadas estejam protegidas pelo Credential Guard. Estes ataques podem incluir o abuso de privilégios e a utilização de credenciais derivadas diretamente de um dispositivo comprometido, reutilizar credenciais roubadas antes da ativação do Credential Guard e abuso de ferramentas de gestão e configurações de aplicações fracas. Por este motivo, também tem de ser implementada uma mitigação adicional para tornar o ambiente de domínio mais robusto.

Qualificações de segurança adicionais

Todos os dispositivos que cumprem as proteções de linha de base para hardware, firmware e software podem utilizar o Credential Guard.
Os dispositivos que cumpram mais qualificações podem fornecer proteções adicionais para reduzir ainda mais a superfície de ataque.

A tabela seguinte lista as qualificações para uma segurança melhorada. Recomendamos que cumpra as qualificações adicionais para reforçar o nível de segurança que o Credential Guard pode fornecer.

Proteção Requisitos Benefícios à segurança:
Gestão e configuração de Arranque Seguro - A palavra-passe do BIOS ou a autenticação mais forte têm de ser suportadas
- Na configuração do BIOS, a autenticação BIOS tem de ser definida
– tem de existir suporte para a opção bios protegida para configurar a lista de dispositivos de arranque permitidos (por exemplo, Arranque apenas a partir do disco rígido interno) e ordem do dispositivo de arranque, substituindo a BOOTORDER modificação efetuada pelo sistema operativo
- Impedir o início de outros sistemas operativos
-Impedir alterações às definições do BIOS
Arranque Seguro da Plataforma de Confiança Rooting de Hardware - A Integridade de Arranque (Arranque Seguro da Plataforma) tem de ser suportada. Consulte Os requisitos do Programa de Compatibilidade de Hardware do Windows em System.Fundamentals.Firmware.CS.UEFISecureBoot.ConnectedStandby
– Interface de Teste de Segurança de Hardware (HSTI) têm de ser implementados. Veja Especificação de Capacidade de Teste de Segurança de Hardware
- A integridade da inicialização (inicialização segura da plataforma) desde o início oferece proteções contra invasores fisicamente presentes e defesa mais completa contra malware.
- O HSTI fornece garantia de segurança para silício e plataforma corretamente protegidos
Atualização de Firmware através do Windows Update - O firmware tem de suportar atualizações de campo através do Windows Update e da atualização de encapsulamento UEFI Ajuda a garantir que as atualizações de firmware sejam rápidas, seguras e confiáveis.
Proteger a Configuração e Gestão de Arranque - Capacidades do BIOS necessárias: capacidade do OEM para adicionar ISV, OEM ou Certificado Enterprise na BD de Arranque Seguro no momento
de fabrico – Configurações necessárias: A AC ueFI da Microsoft tem de ser removida da BD de Arranque Seguro. O suporte para módulos UEFI de terceiros é permitido, mas deve utilizar certificados fornecidos pelo ISV ou certificado OEM para o software UEFI específico
- As empresas podem optar por permitir a execução
de controladores/aplicações EFI proprietários – Remover a AC UEFI da Microsoft da BD de Arranque Seguro fornece controlo total às empresas sobre o software que é executado antes do arranque do sistema operativo
Ativação VBS da proteção No-Execute (NX) para serviços de runtime UEFI - O VBS permite a proteção NX em regiões de memória de dados e código de serviço de runtime UEFI. O código de serviço de tempo de execução UEFI deve dar suporte a proteções de página somente leitura, e os dados do serviço de tempo de execução UEFI não devem ser executáveis. O serviço de runtime ueFI tem de cumprir os seguintes requisitos:
– Implementar o UEFI 2.6 EFI_MEMORY_ATTRIBUTES_TABLE. Toda a memória do serviço de runtime ueFI (código e dados) tem de ser descrita por esta tabela
– as secções PE têm de estar alinhadas com a página na memória (não é necessária para armazenamento não volátil).
- A Tabela de Atributos de Memória tem de marcar corretamente código e dados como RO/NX para configuração pelo SO
– todas as entradas têm de incluir atributos EFI_MEMORY_RO, EFI_MEMORY_XPou ambos.
- Não podem ser deixadas entradas com nenhum dos atributos acima, o que indica a memória executável e gravável. A memória tem de ser legível e executável ou gravável e não executável
(CONSULTE INFORMAÇÕES IMPORTANTES APÓS ESTA TABELA)
- As vulnerabilidades no runtime UEFI, se existirem, são impedidas de comprometer o VBS (como em funções como UpdateCapsule e SetVariable)
– reduz a superfície de ataque para vBS a partir do firmware do sistema.
Suporte de firmware para proteção do SMM - A especificação da Tabela de Mitigações de Segurança (WSMT) do Windows SMM contém detalhes de uma tabela ACPI criada para utilização com sistemas operativos Windows que suportam funcionalidades baseadas em virtualização do Windows. - Protege contra potenciais vulnerabilidades em serviços de runtime UEFI, se existirem, serão impedidos de comprometer o VBS (como em funções como UpdateCapsule e SetVariable)
- Reduz a superfície de ataque para vBS a partir do firmware do sistema
- Bloqueia ataques de segurança adicionais contra o SMM

Importante

Relativamente à ativação do VBS da proteção NX para serviços de runtime UEFI:

  • Aplica-se apenas à memória do serviço de runtime ueFI e não à memória do serviço de arranque UEFI
  • A proteção é aplicada pelo VBS nas tabelas de páginas do SO
  • Não utilize secções graváveis e executáveis
  • Não tente modificar diretamente a memória do sistema executável
  • Não utilizar código dinâmico

Restringir os utilizadores de domínio a dispositivos específicos associados a um domínio

Os ataques de roubo de credenciais permitem que um invasor roube segredos de um dispositivo e use-os em outro dispositivo. Se um usuário conseguir fazer logon em vários dispositivos, qualquer dispositivo poderá ser usado para roubar credenciais. Como pode garantir que os utilizadores apenas iniciam sessão com dispositivos com o Credential Guard ativado? Ao implementar políticas de autenticação que as restringem a dispositivos específicos associados a um domínio que tenham sido configurados com o Credential Guard. Para o controlador de domínio saber de qual dispositivo o usuário está fazendo logon, é necessário usar a proteção Kerberos.

Proteção Kerberos

A proteção Kerberos faz parte do RFC 6113. Quando um dispositivo dá suporte à proteção Kerberos, seu TGT é usado para proteger a prova de posse do usuário que pode atenuar ataques de dicionário offline. A proteção Kerberos também oferece a vantagem adicional de erros KDC assinados que reduz a falsificação que pode resultar em coisas como ataques de downgrade.

Para ativar a proteção Kerberos para restringir os utilizadores de domínio a dispositivos específicos associados a um domínio:

  • Os usuários precisam estar em domínios que estejam executando o Windows Server 2012 R2 ou superior
  • Todos os controladores de domínio nesses domínios devem ser configurados para dar suporte à proteção Kerberos. Defina o suporte KDC para afirmações, autenticação composta e definição da Política de Grupo de Proteção Kerberos como Suportado ou Fornecer sempre afirmações
  • Todos os dispositivos com o Credential Guard aos quais os utilizadores serão restringidos têm de ser configurados para suportar a proteção Kerberos. Ative o suporte do cliente Kerberos para afirmações, autenticação composta e definições de Política de Grupo de Proteção Kerberos em Configuração> do ComputadorModelos Administrativos>Sistema>Kerberos.

Proteger segredos de dispositivos associados a um domínio

Como os dispositivos que ingressaram no domínio também usam segredos compartilhados para autenticação, os invasores também podem roubar esses segredos. Quando certificados de dispositivo são implantados com o Credential Guard, é possível proteger a chave privada. Em seguida, as políticas de autenticação podem exigir que os utilizadores iniciem sessão em dispositivos que se autenticam com esses certificados. Isso impede que os segredos compartilhados em dispositivos roubados sejam usados com credenciais roubadas para fazer logon como o usuário.

A autenticação de certificado de dispositivos que ingressaram no domínio tem os seguintes requisitos:

  • As contas dos dispositivos devem estar no nível funcional de domínio do Windows Server 2012 ou superior.
  • Todos os controladores de domínio nesses domínios têm certificados KDC que satisfazem requisitos de certificados de validação KDC rigorosos:
    • EKU KDC presente
    • O nome de domínio DNS deve corresponder ao campo DNSName da extensão SAN (SubjectAltName)
  • Os dispositivos Windows têm a AC que emite os certificados do controlador de domínio no arquivo empresarial.
  • Um processo deve ser estabelecido para garantir a identidade e a confiabilidade do dispositivo de uma forma semelhante, como você estabeleceria a identidade e a confiabilidade de um usuário antes de emitir um cartão inteligente para ele.

Implementar certificados de dispositivo associados a um domínio

Para garantir que os certificados com a política de emissão necessária estejam instalados apenas nos dispositivos que esses usuários devem usar, eles deverão ser implantados manualmente em cada dispositivo. Os mesmos procedimentos de segurança usados para a emissão de cartões inteligentes para usuários devem ser aplicados a certificados do dispositivo.

Por exemplo, digamos que você queira usar a política Alta Garantia apenas nesses dispositivos. Usando uma autoridade de certificação do Windows Server Enterprise, você criaria um novo modelo.

Criar um novo modelo de certificado

  1. Na consola do Gestor de Certificados, clique com o botão direito do rato em Gestão de Modelos > de Certificado
  2. Clique com o botão direito do rato em Modelo Duplicado de Autenticação > de Estação de Trabalho
  3. Clique com o botão direito do rato no novo modelo e, em seguida, selecione Propriedades
  4. No separador Extensões , selecione Editar Políticas > de Aplicação
  5. Selecione Autenticação de Cliente e, em seguida, selecione Remover
  6. Adicione o EKU ID-PKInit-KPClientAuth. Selecione Adicionar > Novo e, em seguida, especifique os seguintes valores:
    • Nome: Autenticação de cliente Kerberos
    • Identificador de objeto: 1.3.6.1.5.2.3.4
  7. No separador Extensões , selecione Editar Políticas > de Emissão
  8. Em Políticas de Emissão, selecione Alta Garantia
  9. No separador Nome do requerente, desmarque a caixa de verificação Nome DNS e, em seguida, selecione a caixa de verificação Nome Principal de Utilizador (UPN)

Em seguida, nos dispositivos que executam o Credential Guard, inscreva os dispositivos com o certificado que criou.

Inscrever dispositivos num certificado

Execute o seguinte comando:

CertReq -EnrollCredGuardCert MachineAuthentication

Observação

Você deve reiniciar o dispositivo depois de registrar o certificado de autenticação do computador.

Como uma política de emissão de certificado pode ser usada para o controle de acesso

A partir do nível funcional de domínio do Windows Server 2008 R2, o suporte de controladores de domínio para garantia do mecanismo de autenticação oferece uma maneira de mapear OIDs de política de emissão de certificados para grupos de segurança universal. Controladores de domínio do Windows Server 2012 com suporte a solicitações podem mapeá-las para declarações. Para saber mais sobre a garantia do mecanismo de autenticação, consulte Guia passo a passo da garantia do mecanismo de autenticação para AD DS no Windows Server 2008 R2 no TechNet.

Para ver as políticas de emissão disponíveis

  • O get-IssuancePolicy.ps1 mostra todas as políticas de emissão que estão disponíveis na autoridade de certificação.
    Em um prompt de comando do Windows PowerShell, execute o seguinte comando:
.\get-IssuancePolicy.ps1 -LinkedToGroup:All

Para vincular uma política de emissão a um grupo de segurança universal

  • O set-IssuancePolicyToGroupLink.ps1 cria um grupo de segurança Universal, cria uma unidade organizacional e vincula a política de emissão a esse grupo de segurança Universal.
    Em um prompt de comando do Windows PowerShell, execute o seguinte comando:
.\set-IssuancePolicyToGroupLink.ps1 -IssuancePolicyName:"<name of issuance policy>" -groupOU:"<Name of OU to create>" -groupName:"<name of Universal security group to create>"

Restringir o início de sessão do utilizador

Agora concluímos o seguinte:

  • Uma política de emissão de certificado especial foi criado para identificar dispositivos que atendem aos critérios de implantação necessários para que o usuário possa fazer logon
  • Essa política foi mapeada para um grupo de segurança universal ou solicitação
  • Foi fornecida uma forma de os controladores de domínio obterem os dados de autorização do dispositivo durante o início de sessão do utilizador através da proteção Kerberos. Agora o que resta a fazer é configurar a verificação de acesso nos controladores de domínio. Isto é feito através de políticas de autenticação

Políticas de autenticação têm os seguintes requisitos:

  • As contas de utilizador estão num domínio funcional do Windows Server 2012 ou superior

Criar uma política de autenticação que restringe os utilizadores ao grupo de segurança universal específico

  1. Abrir o Centro de Administração do Active Directory
  2. Selecione Autenticação > Nova > Política de Autenticação
  3. Na caixa Nome a apresentar, introduza um nome para esta política de autenticação
  4. No cabeçalho Contas , selecione Adicionar
  5. Na caixa de diálogo Selecionar Utilizadores, Computadores ou Contas de Serviço , escreva o nome da conta de utilizador que pretende restringir e, em seguida, selecione OK
  6. No cabeçalho Início de Sessão do Utilizador, selecione o botão Editar
  7. Selecione Adicionar uma condição
  8. Na caixa Editar Condições do Controlo de Acesso, certifique-se de que lê Membro do Grupo > de Utilizadores > de cada > Valor e, em seguida, selecione Adicionar itens
  9. Na caixa de diálogo Selecionar Utilizadores, Computadores ou Contas de Serviço , escreva o nome do grupo de segurança universal que criou com o script set-IssuancePolicyToGroupLink e, em seguida, selecione OK
  10. Selecione OK para fechar a caixa Editar Condições de Controlo de Acesso
  11. Selecione OK para criar a política de autenticação
  12. Selecione Centro de Administração do Active Directory

Observação

Quando a política de autenticação impõe restrições de política, os usuários não poderão fazer logon usando dispositivos que não tenham um certificado com a política de emissão apropriada implantada. Isso se aplica aos cenários de entrada local e remota. Portanto, é altamente recomendável primeiro só auditar as restrições de política para garantir que você não tenha falhas inesperadas.

Detetar falhas de autenticação devido a políticas de autenticação

Para facilitar o acompanhamento de falhas de autenticação devido a políticas de autenticação, há um log operacional com apenas esses eventos. Para ativar os registos nos controladores de domínio, no Visualizador de Eventos, navegue para Registos de Aplicações e Serviços\Microsoft\Windows\Authentication, clique com o botão direito do rato em AuthenticationPolicyFailures-DomainController e, em seguida, selecione Ativar Registo.

Para saber mais sobre eventos de política de autenticação, consulte Políticas de autenticação e silos de política de autenticação.

Apêndice: scripts

Eis uma lista de scripts mencionados neste artigo.

Obter as políticas de emissão disponíveis na autoridade de certificação

Salve este arquivo de script como get-IssuancePolicy.ps1.

#######################################
##     Parameters to be defined      ##
##     by the user                   ##
#######################################
Param (
$Identity,
$LinkedToGroup
)
#######################################
##     Strings definitions           ##
#######################################
Data getIP_strings {
# culture="en-US"
ConvertFrom-StringData -stringdata @'
help1 = This command can be used to retrieve all available Issuance Policies in a forest. The forest of the currently logged on user is targeted.
help2 = Usage:
help3 = The following parameter is mandatory:
help4 = -LinkedToGroup:<yes|no|all>
help5 = "yes" will return only Issuance Policies that are linked to groups. Checks that the linked Issuance Policies are linked to valid groups.
help6 = "no" will return only Issuance Policies that are not currently linked to any group.
help7 = "all" will return all Issuance Policies defined in the forest. Checks that the linked Issuance policies are linked to valid groups.
help8 = The following parameter is optional:
help9 = -Identity:<Name, Distinguished Name or Display Name of the Issuance Policy that you want to retrieve>. If you specify an identity, the option specified in the "-LinkedToGroup" parameter is ignored.
help10 = Output: This script returns the Issuance Policy objects meeting the criteria defined by the above parameters.
help11 = Examples:
errorIPNotFound = Error: no Issuance Policy could be found with Identity "{0}"
ErrorNotSecurity = Error: Issuance Policy "{0}" is linked to group "{1}" which is not of type "Security".
ErrorNotUniversal = Error: Issuance Policy "{0}" is linked to group "{1}" whose scope is not "Universal".
ErrorHasMembers = Error: Issuance Policy "{0}" is linked to group "{1}" which has a non-empty membership. The group has the following members:
LinkedIPs = The following Issuance Policies are linked to groups:
displayName = displayName : {0}
Name = Name : {0}
dn = distinguishedName : {0}
        InfoName = Linked Group Name: {0}
        InfoDN = Linked Group DN: {0}
NonLinkedIPs = The following Issuance Policies are NOT linked to groups:
'@
}
##Import-LocalizedData getIP_strings
import-module ActiveDirectory
#######################################
##           Help                    ##
#######################################
function Display-Help {
    ""
    $getIP_strings.help1
    ""
$getIP_strings.help2
""
$getIP_strings.help3
"     " + $getIP_strings.help4
"             " + $getIP_strings.help5
    "             " + $getIP_strings.help6
    "             " + $getIP_strings.help7
""
$getIP_strings.help8
    "     " + $getIP_strings.help9
    ""
    $getIP_strings.help10
""
""
$getIP_strings.help11
    "     " + '$' + "myIPs = .\get-IssuancePolicy.ps1 -LinkedToGroup:All"
    "     " + '$' + "myLinkedIPs = .\get-IssuancePolicy.ps1 -LinkedToGroup:yes"
    "     " + '$' + "myIP = .\get-IssuancePolicy.ps1 -Identity:""Medium Assurance"""
""
}
$root = get-adrootdse
$domain = get-addomain -current loggedonuser
$configNCDN = [String]$root.configurationNamingContext
if ( !($Identity) -and !($LinkedToGroup) ) {
display-Help
break
}
if ($Identity) {
    $OIDs = get-adobject -Filter {(objectclass -eq "msPKI-Enterprise-Oid") -and ((name -eq $Identity) -or (displayname -eq $Identity) -or (distinguishedName -like $Identity)) } -searchBase $configNCDN -properties *
    if ($OIDs -eq $null) {
$errormsg = $getIP_strings.ErrorIPNotFound -f $Identity
write-host $errormsg -ForegroundColor Red
    }
    foreach ($OID in $OIDs) {
        if ($OID."msDS-OIDToGroupLink") {
# In case the Issuance Policy is linked to a group, it is good to check whether there is any problem with the mapping.
            $groupDN = $OID."msDS-OIDToGroupLink"
            $group = get-adgroup -Identity $groupDN
    $groupName = $group.Name
# Analyze the group
            if ($group.groupCategory -ne "Security") {
$errormsg = $getIP_strings.ErrorNotSecurity -f $Identity, $groupName
                write-host $errormsg -ForegroundColor Red
            }
            if ($group.groupScope -ne "Universal") {
                $errormsg = $getIP_strings.ErrorNotUniversal -f $Identity, $groupName
write-host $errormsg -ForegroundColor Red
            }
            $members = Get-ADGroupMember -Identity $group
            if ($members) {
                $errormsg = $getIP_strings.ErrorHasMembers -f $Identity, $groupName
write-host $errormsg -ForegroundColor Red
                foreach ($member in $members) {
                    write-host "          "  $member -ForeGroundColor Red
                }
            }
        }
    }
    return $OIDs
    break
}
if (($LinkedToGroup -eq "yes") -or ($LinkedToGroup -eq "all")) {
    $LDAPFilter = "(&(objectClass=msPKI-Enterprise-Oid)(msDS-OIDToGroupLink=*)(flags=2))"
    $LinkedOIDs = get-adobject -searchBase $configNCDN -LDAPFilter $LDAPFilter -properties *
    write-host ""
    write-host "*****************************************************"
    write-host $getIP_strings.LinkedIPs
    write-host "*****************************************************"
    write-host ""
    if ($LinkedOIDs -ne $null){
      foreach ($OID in $LinkedOIDs) {
# Display basic information about the Issuance Policies
          ""
  $getIP_strings.displayName -f $OID.displayName
  $getIP_strings.Name -f $OID.Name
  $getIP_strings.dn -f $OID.distinguishedName
# Get the linked group.
          $groupDN = $OID."msDS-OIDToGroupLink"
          $group = get-adgroup -Identity $groupDN
          $getIP_strings.InfoName -f $group.Name
          $getIP_strings.InfoDN -f $groupDN
# Analyze the group
          $OIDName = $OID.displayName
    $groupName = $group.Name
          if ($group.groupCategory -ne "Security") {
          $errormsg = $getIP_strings.ErrorNotSecurity -f $OIDName, $groupName
          write-host $errormsg -ForegroundColor Red
          }
          if ($group.groupScope -ne "Universal") {
          $errormsg = $getIP_strings.ErrorNotUniversal -f $OIDName, $groupName
          write-host $errormsg -ForegroundColor Red
          }
          $members = Get-ADGroupMember -Identity $group
          if ($members) {
          $errormsg = $getIP_strings.ErrorHasMembers -f $OIDName, $groupName
          write-host $errormsg -ForegroundColor Red
              foreach ($member in $members) {
                  write-host "          "  $member -ForeGroundColor Red
              }
          }
          write-host ""
      }
    }else{
write-host "There are no issuance policies that are mapped to a group"
    }
    if ($LinkedToGroup -eq "yes") {
        return $LinkedOIDs
        break
    }
}
if (($LinkedToGroup -eq "no") -or ($LinkedToGroup -eq "all")) {
    $LDAPFilter = "(&(objectClass=msPKI-Enterprise-Oid)(!(msDS-OIDToGroupLink=*))(flags=2))"
    $NonLinkedOIDs = get-adobject -searchBase $configNCDN -LDAPFilter $LDAPFilter -properties *
    write-host ""
    write-host "*********************************************************"
    write-host $getIP_strings.NonLinkedIPs
    write-host "*********************************************************"
    write-host ""
    if ($NonLinkedOIDs -ne $null) {
      foreach ($OID in $NonLinkedOIDs) {
# Display basic information about the Issuance Policies
write-host ""
$getIP_strings.displayName -f $OID.displayName
$getIP_strings.Name -f $OID.Name
$getIP_strings.dn -f $OID.distinguishedName
write-host ""
      }
    }else{
write-host "There are no issuance policies which are not mapped to groups"
    }
    if ($LinkedToGroup -eq "no") {
        return $NonLinkedOIDs
        break
    }
}

Observação

Se você estiver com dificuldade para executar esse script, tente substituir a aspa simples após o parâmetro ConvertFrom-StringData.

Salve o arquivo de script como set-IssuancePolicyToGroupLink.ps1.

#######################################
##     Parameters to be defined      ##
##     by the user                   ##
#######################################
Param (
$IssuancePolicyName,
$groupOU,
$groupName
)
#######################################
##     Strings definitions           ##
#######################################
Data ErrorMsg {
# culture="en-US"
ConvertFrom-StringData -stringdata @'
help1 = This command can be used to set the link between a certificate issuance policy and a universal security group.
help2 = Usage:
help3 = The following parameters are required:
help4 = -IssuancePolicyName:<name or display name of the issuance policy that you want to link to a group>
help5 = -groupName:<name of the group you want to link the issuance policy to>. If no name is specified, any existing link to a group is removed from the Issuance Policy.
help6 = The following parameter is optional:
help7 = -groupOU:<Name of the Organizational Unit dedicated to the groups which are linked to issuance policies>. If this parameter is not specified, the group is looked for or created in the Users container.
help8 = Examples:
help9 = This command will link the issuance policy whose display name is "High Assurance" to the group "HighAssuranceGroup" in the Organizational Unit "OU_FOR_IPol_linked_groups". If the group or the Organizational Unit do not exist, you will be prompted to create them.
help10 = This command will unlink the issuance policy whose name is "402.164959C40F4A5C12C6302E31D5476062" from any group.
MultipleIPs = Error: Multiple Issuance Policies with name or display name "{0}" were found in the subtree of "{1}"
NoIP = Error: no issuance policy with name or display name "{0}" could be found in the subtree of "{1}".
IPFound = An Issuance Policy with name or display name "{0}" was successfully found: {1}
MultipleOUs = Error: more than 1 Organizational Unit with name "{0}" could be found in the subtree of "{1}".
confirmOUcreation = Warning: The Organizational Unit that you specified does not exist. Do you want to create it?
OUCreationSuccess = Organizational Unit "{0}" successfully created.
OUcreationError = Error: Organizational Unit "{0}" could not be created.
OUFoundSuccess = Organizational Unit "{0}" was successfully found.
multipleGroups = Error: More than one group with name "{0}" was found in Organizational Unit "{1}".
confirmGroupCreation = Warning: The group that you specified does not exist. Do you want to create it?
groupCreationSuccess = Univeral Security group "{0}" successfully created.
groupCreationError = Error: Univeral Security group "{0}" could not be created.
GroupFound = Group "{0}" was successfully found.
confirmLinkDeletion = Warning: The Issuance Policy "{0}" is currently linked to group "{1}". Do you really want to remove the link?
UnlinkSuccess = Certificate issuance policy successfully unlinked from any group.
UnlinkError = Removing the link failed.
UnlinkExit = Exiting without removing the link from the issuance policy to the group.
IPNotLinked = The Certificate issuance policy is not currently linked to any group. If you want to link it to a group, you should specify the -groupName option when starting this script.
ErrorNotSecurity = Error: You cannot link issuance Policy "{0}" to group "{1}" because this group is not of type "Security".
ErrorNotUniversal = Error: You cannot link issuance Policy "{0}" to group "{1}" because the scope of this group is not "Universal".
ErrorHasMembers = Error: You cannot link issuance Policy "{0}" to group "{1}" because it has a non-empty membership. The group has the following members:
ConfirmLinkReplacement = Warning: The Issuance Policy "{0}" is currently linked to group "{1}". Do you really want to update the link to point to group "{2}"?
LinkSuccess = The certificate issuance policy was successfully linked to the specified group.
LinkError = The certificate issuance policy could not be linked to the specified group.
ExitNoLinkReplacement = Exiting without setting the new link.
'@
}
# import-localizeddata ErrorMsg
function Display-Help {
""
write-host $ErrorMsg.help1
""
write-host $ErrorMsg.help2
""
write-host $ErrorMsg.help3
write-host "`t" $ErrorMsg.help4
write-host "`t" $ErrorMsg.help5
""
write-host $ErrorMsg.help6
write-host "`t" $ErrorMsg.help7
""
""
write-host $ErrorMsg.help8
""
write-host $ErrorMsg.help9
".\Set-IssuancePolicyToGroupMapping.ps1 -IssuancePolicyName ""High Assurance"" -groupOU ""OU_FOR_IPol_linked_groups"" -groupName ""HighAssuranceGroup"" "
""
write-host $ErrorMsg.help10
'.\Set-IssuancePolicyToGroupMapping.ps1 -IssuancePolicyName "402.164959C40F4A5C12C6302E31D5476062" -groupName $null '
""
}
# Assumption:  The group to which the Issuance Policy is going
#              to be linked is (or is going to be created) in
#              the domain the user running this script is a member of.
import-module ActiveDirectory
$root = get-adrootdse
$domain = get-addomain -current loggedonuser
if ( !($IssuancePolicyName) ) {
display-Help
break
}
#######################################
##     Find the OID object           ##
##     (aka Issuance Policy)         ##
#######################################
$searchBase = [String]$root.configurationnamingcontext
$OID = get-adobject -searchBase $searchBase -Filter { ((displayname -eq $IssuancePolicyName) -or (name -eq $IssuancePolicyName)) -and (objectClass -eq "msPKI-Enterprise-Oid")} -properties *
if ($OID -eq $null) {
$tmp = $ErrorMsg.NoIP -f $IssuancePolicyName, $searchBase
write-host $tmp -ForeGroundColor Red
break;
}
elseif ($OID.GetType().IsArray) {
$tmp = $ErrorMsg.MultipleIPs -f $IssuancePolicyName, $searchBase
write-host $tmp -ForeGroundColor Red
break;
}
else {
$tmp = $ErrorMsg.IPFound -f $IssuancePolicyName, $OID.distinguishedName
write-host $tmp -ForeGroundColor Green
}
#######################################
##  Find the container of the group  ##
#######################################
if ($groupOU -eq $null) {
# default to the Users container
$groupContainer = $domain.UsersContainer
}
else {
$searchBase = [string]$domain.DistinguishedName
$groupContainer = get-adobject -searchBase $searchBase -Filter { (Name -eq $groupOU) -and (objectClass -eq "organizationalUnit")}
if ($groupContainer.count -gt 1) {
$tmp = $ErrorMsg.MultipleOUs -f $groupOU, $searchBase
write-host $tmp -ForegroundColor Red
break;
}
elseif ($groupContainer -eq $null) {
$tmp = $ErrorMsg.confirmOUcreation
write-host $tmp " ( (y)es / (n)o )" -ForegroundColor Yellow -nonewline
$userChoice = read-host
if ( ($userChoice -eq "y") -or ($userChoice -eq "yes") ) {
new-adobject -Name $groupOU -displayName $groupOU -Type "organizationalUnit" -ProtectedFromAccidentalDeletion $true -path $domain.distinguishedName
if ($?){
$tmp = $ErrorMsg.OUCreationSuccess -f $groupOU
write-host $tmp -ForegroundColor Green
}
else{
$tmp = $ErrorMsg.OUCreationError -f $groupOU
write-host $tmp -ForeGroundColor Red
break;
}
$groupContainer = get-adobject -searchBase $searchBase -Filter { (Name -eq $groupOU) -and (objectClass -eq "organizationalUnit")}
}
else {
break;
}
}
else {
$tmp = $ErrorMsg.OUFoundSuccess -f $groupContainer.name
write-host $tmp -ForegroundColor Green
}
}
#######################################
##  Find the group               ##
#######################################
if (($groupName -ne $null) -and ($groupName -ne "")){
##$searchBase = [String]$groupContainer.DistinguishedName
$searchBase = $groupContainer
$group = get-adgroup -Filter { (Name -eq $groupName) -and (objectClass -eq "group") } -searchBase $searchBase
if ($group -ne $null -and $group.gettype().isarray) {
$tmp = $ErrorMsg.multipleGroups -f $groupName, $searchBase
write-host $tmp -ForeGroundColor Red
break;
}
elseif ($group -eq $null) {
$tmp = $ErrorMsg.confirmGroupCreation
write-host $tmp " ( (y)es / (n)o )" -ForegroundColor Yellow -nonewline
$userChoice = read-host
if ( ($userChoice -eq "y") -or ($userChoice -eq "yes") ) {
new-adgroup -samAccountName $groupName -path $groupContainer.distinguishedName -GroupScope "Universal" -GroupCategory "Security"
if ($?){
$tmp = $ErrorMsg.GroupCreationSuccess -f $groupName
write-host $tmp -ForegroundColor Green
}else{
$tmp = $ErrorMsg.groupCreationError -f $groupName
write-host $tmp -ForeGroundColor Red
break
}
$group = get-adgroup -Filter { (Name -eq $groupName) -and (objectClass -eq "group") } -searchBase $searchBase
}
else {
break;
}
}
else {
$tmp = $ErrorMsg.GroupFound -f $group.Name
write-host $tmp -ForegroundColor Green
}
}
else {
#####
## If the group is not specified, we should remove the link if any exists
#####
if ($OID."msDS-OIDToGroupLink" -ne $null) {
$tmp = $ErrorMsg.confirmLinkDeletion -f $IssuancePolicyName, $OID."msDS-OIDToGroupLink"
write-host $tmp " ( (y)es / (n)o )" -ForegroundColor Yellow -nonewline
$userChoice = read-host
if ( ($userChoice -eq "y") -or ($userChoice -eq "yes") ) {
set-adobject -Identity $OID -Clear "msDS-OIDToGroupLink"
if ($?) {
$tmp = $ErrorMsg.UnlinkSuccess
write-host $tmp -ForeGroundColor Green
}else{
$tmp = $ErrorMsg.UnlinkError
write-host $tmp -ForeGroundColor Red
}
}
else {
$tmp = $ErrorMsg.UnlinkExit
write-host $tmp
break
}
}
else {
$tmp = $ErrorMsg.IPNotLinked
write-host $tmp -ForeGroundColor Yellow
}
break;
}
#######################################
##  Verify that the group is         ##
##  Universal, Security, and         ##
##  has no members                   ##
#######################################
if ($group.GroupScope -ne "Universal") {
$tmp = $ErrorMsg.ErrorNotUniversal -f $IssuancePolicyName, $groupName
write-host $tmp -ForeGroundColor Red
break;
}
if ($group.GroupCategory -ne "Security") {
$tmp = $ErrorMsg.ErrorNotSecurity -f $IssuancePolicyName, $groupName
write-host $tmp -ForeGroundColor Red
break;
}
$members = Get-ADGroupMember -Identity $group
if ($members -ne $null) {
$tmp = $ErrorMsg.ErrorHasMembers -f $IssuancePolicyName, $groupName
write-host $tmp -ForeGroundColor Red
foreach ($member in $members) {write-host "   $member.name" -ForeGroundColor Red}
break;
}
#######################################
##  We have verified everything. We  ##
##  can create the link from the     ##
##  Issuance Policy to the group.    ##
#######################################
if ($OID."msDS-OIDToGroupLink" -ne $null) {
$tmp = $ErrorMsg.ConfirmLinkReplacement -f $IssuancePolicyName, $OID."msDS-OIDToGroupLink", $group.distinguishedName
write-host $tmp  "( (y)es / (n)o )" -ForegroundColor Yellow -nonewline
$userChoice = read-host
if ( ($userChoice -eq "y") -or ($userChoice -eq "yes") ) {
$tmp = @{'msDS-OIDToGroupLink'= $group.DistinguishedName}
set-adobject -Identity $OID -Replace $tmp
if ($?) {
$tmp = $Errormsg.LinkSuccess
write-host $tmp -Foreground Green
}else{
$tmp = $ErrorMsg.LinkError
write-host $tmp -Foreground Red
}
} else {
$tmp = $Errormsg.ExitNoLinkReplacement
write-host $tmp
break
}
}
else {
$tmp = @{'msDS-OIDToGroupLink'= $group.DistinguishedName}
set-adobject -Identity $OID -Add $tmp
if ($?) {
$tmp = $Errormsg.LinkSuccess
write-host $tmp -Foreground Green
}else{
$tmp = $ErrorMsg.LinkError
write-host $tmp -Foreground Red
}
}

Observação

Se você estiver com dificuldade para executar esse script, tente substituir a aspa simples após o parâmetro ConvertFrom-StringData.