O Active Directory - O mistério UnicodePwd do AD LDS
Serviços LDS do Active Directory utiliza o procedimento sofisticado para converter e autenticar as senhas.
Por Frank C. Rettig
Recentemente, um dos meus clientes necessária expõem determinadas informações pela Internet usando o Active Directory. A intenção era oferecer autenticação (para fins de logon) para um aplicativo externo sem expor esses atributos. Você deve estar se perguntando o que é o ponto de autenticação fora do aplicativo. Ele coloca a obrigação em que os usuários do aplicativo, ao contrário de provedor, reduzindo assim a responsabilidade do proprietário.
Expondo um controlador de domínio com a Internet é normalmente uma prática ruim, se essa exposição vem diretamente do ambiente de produção ou por meio de uma rede de perímetro. A alternativa natural é colocar um servidor Windows Server 2008 com a função do Active Directory Lightweight Directory Services (AD LDS) em execução na rede de perímetro.
AD LDS originalmente era conhecido como ADAM (Active Directory Application Mode). Ele tornou-se de um complemento do Windows 2003, incluído no Windows 2003 R2 e agora está disponível como uma função de servidor para o Windows 2008 ou o Windows 7. Em muitos aspectos, é quase como AD. Como alguns disse, é uma toned versão que não tem a capacidade total da empresa. Implementar o AD LDS é praticamente a mesma em qualquer versão do Windows, embora o Windows Server 2008 R2 é a melhor opção porque ele inclui o Windows PowerShell v2. Esta nova versão do Windows PowerShell oferece maior capacidade de gerenciamento de atributos do AD/AD LDS que simplesmente não estão disponíveis nas versões de sistema operacional.
Vá Lightly
Se o seu foco for AD ou AD LDS, ambos podem ter o atributo unicodePwd. Esse atributo é armazenado na partição de diretório/aplicativo. Isso pressupõe que o servidor foi promovido para um controlador de domínio do AD, ou o modelo LDIF adequado que tenha o atributo para um servidor foi aplicada do AD LDS.
Com o AD ou AD LDS, os aplicativos usam o LDAP (Lightweight Directory Access Protocol) versão 3. 0 para consultar o diretório. Para isso, o aplicativo (que pode ser LDP.EXE, CSVDE.EXE, LDIFDE.EXE, ADSIEdit.exe ou alguns aplicativos internos) deve fornecer a conta e a senha. Parece simples o suficiente, então, por isso que, em seguida, é nada? Fornecer a senha é a parte fácil. Ao obter a senha armazenada no atributo unicodePwd é o desafio. Eis o porquê: Com pastas ou aplicativos mais interativo, nós geralmente serão solicitados a digitar a senha em seu formato nativo. Se a senha era “ carro ”, que é o que podemos inserir. Como é o caso quando estiver acessando um domínio ou floresta para AD ou ao acessar uma instância AD LDS usando ADSIedit ou o LDP para atribuir ou redefinir uma senha de uma determinada conta.
Quando você precisar fazer adições em massa ou alterações ao mesmo tempo, o programa LDIFDE.EXE é a ferramenta preferida. Para adicionar ou atualizar o atributo unicodePwd, a Microsoft requer que o valor do atributo unicodePwd ser no formato unicode base64.
Lógica de Base64 Unicode
Então, como o valor unicode base64 é calculado? Isso é onde a diversão começa. Felizmente, temos vai difundir o mistério da unicodePwd (e outros atributos que se seguem a mesma codificação) uma vez por todas.
Primeiro, observe que as seguintes frases são anotadas. Consulte as etapas 1 – 12 do Figura 1. A Microsoft exige que a senha ser colocado entre aspas duplas e, em seguida, cada caractere (incluindo as aspas) deve ser convertido para o unicode equivalente. Isso significa que ele deve primeiro localizar o ASCII equivalentes para cada caractere, derive o valor hexadecimal de cada valor ASCII e então preencher cada valor hexadecimal com dois zeros (porque o Windows está em conformidade com UTF16) para que os 16 bits são representadas.
Uma vez convertido, esses conjuntos hexadecimais acolchoados todos são combinados em uma seqüência de caracteres de comprimento. Como base64 é baseada em 6 bits, essa seqüência de caracteres é analisada a cada seis caracteres à esquerda. Se um sextet hex incompleta permanecer, ele é preenchido para a direita com zeros até seis caracteres sejam representados. Em seguida, cada sextet hexadecimal é convertido em binário. Assim como acontece com o binário, analisando ocorre a partir da direita e de todas as seis caracteres.
Apesar de ser desnecessário, uma sextet binário incompleto, preencher à esquerda com zeros até seis caracteres sejam representados (Lembre-se que o líder de zeros zero ainda igual, mas isso torna mais fácil de ler, já que os outros conjuntos de também tem seis caracteres). Agora, converta cada valor de binário analisado em seu de 11 numérico equivalente. Use esse número como um índice para procurar em relação uma tabela de base64 (Figura 2 do ) e obtém seu caractere. Quando um sextet completa somente é composto de zeros acolchoados, esses itens são representados por um sinal de igual.
A Figura 1 mostra que, nas etapas 1 – 12, como o de carro de palavra é convertido em **IgBjAGEAcgAiAA = =.**Enchimento direito é necessário ao preparar o unicode para base64, que pode ser visto pelo texto em azul de realce. Como o enchimento esquerdo representado por vermelho realce o texto, essa é apenas para torná-lo consistente e mais legível quando comparado as outros sextets binários.
A Figura 1Etapas para criar uma senha de base64 unicode.
A Figura 2Mapeamento de Base64.
Caso você esteja se perguntando se essa lógica funky estiver correta, obtenha uma cópia do programa Stringconverter.exe de gbordier.com/gbtools/stringconverter.htm de e execute a seguinte seqüência de caracteres de prompt de comando do DOS:
stringconverter \"car\" /encode /unicode
IgBjAGEAcgAiAA==
Como você pode ver os resultados são os mesmos.
Criar senha de Base64 Unicode
Para o teste inicial simples, usar as seguintes funções do Excel (Figura 1 de foi criado no Excel) permitirá que você gerar rapidamente a base64 unicode correto de qualquer texto inserido:
- CODE() – retorna o valor numérico de um caractere
- DEC2HEX() – converte um número decimal em hexadecimal
- Concatenate() – relações várias cadeias de caracteres em uma seqüência de caracteres
- BIN2DEC() – converte um número binário em decimal
- MID() – retorna os caracteres do meio de uma seqüência de caracteres
A melhor maneira de lidar com a gerar muitos valores unicodePwd é escrever um script. Ao fazer isso, no Excel usando o VBA permite que você consulte todos os valores gerados e mantê-los dentro da planilha para referência futura. Usando outro script VBA, fui capaz de gerar instantaneamente um arquivo LDIF para importar para a instância AD LDS.
Carregando o valor de UnicodePwd Base64 Unicode
Porque o unicodePwd é manipulado usando o programa LDIFDE.exe, carregando a unicodePwd deve seguir o formato de arquivo LDIF. Porque o compromisso envolvido a função do Windows Server 2008 R2 AD LDS, esse formato de arquivo LDIF é o que eu seguidas para que as informações básicas foi carregadas. Observe que a conta de usuário do João da Silva é o primeiro que possui o valor unicodePwd de carro de como IgBjAGEAcgAiAA = =.
dn: CN=JohnDoe,OU=Accounts,DC=CONTOSO,DC=COM
Changetype: add
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: user
cn: John Doe
givenName: John
sn: Doe
userPrincipalName: johnd@Contoso.COM
mail: johnd@Contoso.COM
unicodePwd::IgBjAGEAcgAiAA==\
msDS-UserAccountDisabled: FALSE
dn: CN=Jess Wanders,OU=Accounts,DC=CONTOSO,DC=COM
Changetype: add
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: user
cn: Jess Wanders
givenName: Jess
sn: Wanders
userPrincipalName: JessW@Contoso.COM
mail: JessW@Contoso.COM
unicodePwd::IgA3ACQANQBNAHMAIwA0AEQAaQBHACIA
msDS-UserAccountDisabled: FALSE
Portanto, para importar esse arquivo, assumindo que seu nome de arquivo é Accounts.ldf, digite a seguinte sintaxe no console do prompt de comando do Windows Server 2008 R2:
C:\Windows\system32\LDIFDE –i –f Accounts.ldf.
Vinculação e a senha da conta de teste
Após carregar uma ou mais contas recém-criadas a partição de aplicativo e conectar-se ou ligando para o serviço LDAP com userPrincipalName da conta e a unicodePwd, ele ‘ importante ter certeza de que o formato unicode base64 o unicodePwd é correto. A ferramenta funciona melhor e é fácil de usar é o Ldp. exe. Você pode pensar que IgBjAGEAcgAiAA = = é a senha correta para inserir ao usar essa, mas não é. É o que originalmente começamos com: carro.
Depois que você se conectar à instância AD LDS, usando o LDP, vincular com o UPN da conta transferido e digite a senha. Se você seguiu o lógica para criar o valor de base64 unicode unicodePwd corretamente, você verá uma confirmação positiva exibida na janela do LDP que na verdade estão vinculados a essa instância AD LDS com essa conta.
Usando o Windows PowerShell para atualizar o atributo UnicodePwd
Agora, ele não seria justo se eu disse que LDIFDE.exe fosse a única ferramenta ao redor capazes de realizar alterações em massa para o atributo unicodePwd. Em seguida, você não tiver aprendeu gerar o valor unicode base64.
No Windows Server 2008 R2, Windows PowerShell v2 trouxe um pouco maior granularidade em sua capacidade de manipular atributos em AD e AD LDS. Trabalhando com o AD LDS, eu surgiu com a sintaxe de Figura 3 (note that for the sake of readability, I placed each command option on its own line) para atingir os mesmos resultados que o meu script VBA faz dentro da planilha do Excel.
É óbvio que com apenas algumas linhas de código do Windows PowerShell, você pode rapidamente fazer as alterações necessárias sem ter que ir a hoops ao criar o valor unicode base64 para cada senha. Esta é uma declaração eficiente dos recursos do Windows PowerShell, mas que diz respeito à custa de tempo de processamento, considerando tudo o que ele faz no plano de fundo. Isso é especialmente evidente se processando centenas ou milhares, de contas.
Portanto, se você ocasionalmente precisa criar ou atualizar algumas contas de vez em seguida, use o Windows PowerShell. Se você criar ou atualizar centenas ou milhares regularmente sempre, usar LDIFDE.exe é muito mais rápida a longo prazo.
A Figura 3Script do Windows PowerShell v2 para atualizar a senha da conta.
Import-Csv c:\scripts\accounts.csv |
New-ADUser
–Name $_.commonName
–GivenName $_.givenName
–Surname $_.sn
-EmailAddress $_.email
-Type user
-UserPrincipalName $_.userPrincipalName
–Server LDS01:389 |
Set-ADAccountPassword
-Identity $_.distinguishedName
-NewPassword (ConvertTo-SecureString -AsPlainText $_.Password -Force)
-Reset
-Server LDS01:389 |
Enable-ADAccount
-Identity $_.distinguishedName
-Server LDS01:389
Se trabalhar com o AD ou AD LDS (ou até mesmo o ADAM no caso), existem várias maneiras de atualizar o atributo unicodePwd. Se você tiver apenas uma conta a ser alterada, use o Ldp. exe ou ADSIedit para obtê-lo feito. Se houver apenas uns poucos vez em seguida, usando o Windows PowerShell v2 contra Windows AD do Server 2008 R2/AD LDS funciona muito bem.
No entanto, se você ainda estiver trabalhando com o Windows Server 2003 ou posterior e ter centenas ou milhares de contas que precisam de atualização constante, fazer seu trabalho de preparação antecipadamente para gerar o valor unicode base64 para o atributo unicodePwd. Em seguida, use LDIFDE.exe para carregar as alterações ao mesmo tempo.
Frederico Rettig é consultor nos EUA. Prática do setor público, localizada em Washington, D.C., área, com 26 anos de experiência no trabalho domestically e internacionalmente. Ele é especializado na integração de diretórios, gerenciamento de identidades, soluções de mobilidade e padrões de computação do governo. Frederico pode ser contatado pelo frank.rettig@microsoft.com.
Confirmações:
Eu gostaria de agradecer a membros da equipe ACE de segurança da Microsoft Information Services (principal arquiteto de segurança) de Roger Grimes e Shawn Rabourn (consultor de segurança sênior) para validar este artigo e USPS Federal Services Anthony de Lagarde (consultor sênior) para a análise do conteúdo.