Algoritmos e exemplos de validação de acesso à rede para Windows
Este artigo explica como a validação de conta do Windows funciona durante o acesso à rede usando o protocolo NTLM.
Número original do KB: 103390
Resumo
Veja a seguir um algoritmo simplificado que explica como a validação de conta do Windows funciona durante o acesso à rede usando o protocolo NTLM. Ele está usando o acesso por meio do protocolo SMB (bloco de mensagens do servidor) como exemplo, mas se aplica a todos os outros aplicativos de servidor que dão suporte à autenticação NTLM. Esta discussão não cobre o funcionamento interno deste processo. Com essas informações, você pode prever o comportamento de logon de rede do Windows em condições determinísticas.
Quando o Kerberos é usado para autenticar o usuário e obter acesso aos recursos do servidor, o processo é diferente do que o NTLM faz.
Lembre-se de que o banco de dados local é o banco de dados de domínio e o único banco de dados nos controladores de domínio. Mas em outros servidores e em todos os computadores, o banco de dados local difere do controlador de domínio.
Informações básicas
Quando dois computadores baseados no Windows se comunicam por uma rede, eles usam um protocolo de alto nível chamado SMB (bloco de mensagens do servidor). Os comandos SMB são incorporados nos protocolos de transporte, como TCP/IP ou QUIC (Quick UDP Internet Connections). Por exemplo, quando um computador cliente executa um NET USE
comando, um quadro "Configuração de Sessão SMB e X" é enviado.
No Windows, ao usar o NTLM, o SMB "Configuração de Sessão" inclui a conta de usuário, uma função de hash da senha criptografada e do domínio de logon. Um controlador de domínio examinará todas essas informações para determinar se o cliente tem permissões para concluir o comando NET USE.
Algoritmos
Um computador cliente Windows envia o seguinte comando para um servidor:
NET USE x: \\server\share
O computador cliente Windows envia um SMB de "Configuração de Sessão" que contém seu domínio de logon, conta de usuário e senha.
O servidor examina o nome de domínio ou o nome do computador especificado pelo SMB. Se o nome for o próprio nome do servidor, o seguinte algoritmo será executado:
It checks its own domain database or computer database for
a matching account.
If it finds a matching account then
The SMB password is compared to the domain database password or the computer database password.
If the password matches then
The command completed successfully.
If the password does NOT match then
The user is prompted for a password.
The password is retested as above.
System error 1326 has occurred. Logon failure: unknown
user name or bad password.
End
If it does NOT find the account in the domain Security Accounts Manager (SAM) database or computer SAM database then
Guest permissions are tested.
If the guest account is enabled
The command completed successfully.
If the guest account is disabled
(* See Note a).
The user is prompted for a password.
System error 1326 has occurred. Logon failure:
unknown user name or bad password.
End
Se o domínio especificado no SMB for aquele em que o servidor confia, o seguinte algoritmo será executado:
The server will do pass-through authentication. The
network logon request will be sent to a server that has a domain controller role in the
specified trusted domain.
Se um canal seguro não estiver configurado, o seguinte algoritmo será executado:
The trusted domain controller checks its own domain database
for a matching account.
If the trusted domain controller finds a matching account, then
NOT for Windows 2000 and later versions:
It determines whether the account is a local or global account.
If the account is local, then
Guest permissions on the original server are tested.
If the guest account is enabled
The command completed successfully.
If the guest account is disabled
(* See Note 1) The user is prompted for a password.
System error 1326 has occurred. Logon failure:
unknown user name or bad password.
End
If the account is global (the only option for Active Directory)
The SMB password is compared to the domain database
password.
If the password matches, then
The command completed successfully.
(* See Note 2)
If the password does NOT match, then
The user is prompted for a password.
The password is retested as above.
System error 1326 has occurred. Logon failure:
unknown user name or bad password.
End
If the trusted domain controller does NOT find the account in the trusted domain controller
database, then
Guest permissions are tested on the original server, not the trusted domain. (* See Note 3)
If the guest account is enabled
The user will have original server guest access.
The command completed successfully.
If the guest account is disabled
(* See Note 1) The user is prompted for a password.
System error 1326 has occurred. Logon failure:
unknown user name or bad password.
End
Importante
Os casos a seguir discutem cenários em que o cliente usa um domínio de usuário diferente daquele que o servidor tem ou conhece. Há um problema com essa incompatibilidade quando o protocolo de autenticação NTLMv2 é negociado. O NTLM na v2 usa um sal de senha e o domínio do usuário é usado nesse sal pelo cliente.
Quando o servidor obtém as informações e encontra o usuário no banco de dados local, o servidor usa o nome do banco de dados LOCAL para calcular o salt e o hash. Portanto, se o "domínio de origem" enviado pelo cliente estiver vazio ou for um domínio desconhecido, o salt e, portanto, o hash de senha não corresponderão. Nesses casos, a tentativa de autenticação falhará com um erro "nome de usuário desconhecido ou senha incorreta" (STATUS_LOGON_FAILURE). O evento de auditoria para a tentativa relatará "senha incorreta", símbolo STATUS_WRONG_PASSWORD.
Um exemplo de evento:
Nome do log: Segurança
Fonte: Microsoft-Windows-Security-Auditing
ID do evento: 4625
Categoria da tarefa: Logon
Nível: Informações
Palavras-chave: Falha de auditoria
Computador: servidor-computador1
Descrição:
Falha no logon em uma conta.Assunto:
ID de segurança: SID NULL
Nome da conta: -
Domínio da conta: -
ID de logon: 0x0Tipo de logon: 3
Conta para a qual o logon falhou:
ID de segurança: SID NULL
Nome da conta: ntadmin
Domínio da conta: cliente-computador1Informações sobre falhas:
Motivo da falha: nome de usuário desconhecido ou senha incorreta.
Status: 0xc000006d
Sub-status: 0xc000006a
...Informações detalhadas de autenticação:
Processo de logon: NtLmSsp
Pacote de autenticação: NTLM
Serviços transitados: -
Nome do pacote (somente NTLM): -
Comprimento da chave: 0
Para evitar esse problema, você precisa incluir o nome de domínio correto explicitamente no cliente. Para um mapeamento de unidade em um cenário de grupo de trabalho, isso seria o seguinte:
Net use x: \\server-computer1\data /u:server-computer1\ntadmin *
Se o domínio especificado no SMB for desconhecido pelo servidor, por exemplo, se um domínio foi especificado, mas não foi reconhecido pelo servidor como um domínio confiável ou seu controlador de domínio, o seguinte algoritmo será executado:
It will check its own account database for
a matching account
If the server finds a matching account, then
The SMB password is compared to the domain database password or the computer database password.
If the password matches, then
The command completed successfully.
If the password does NOT match, then
The user is prompted for a password.
The password is retested as above.
System error 1326 has occurred. Logon failure: unknown
user name or bad password.
End
If it does NOT find the account in the domain database then
guest permissions are tested.
If the guest account is enabled
The command completed successfully.
If the guest account is disabled
System error 1326 has occurred. Logon failure:
unknown user name or bad password.
End
Se o domínio especificado no SMB for NULL, ou seja, nenhum domínio for especificado, o seguinte algoritmo será executado:
The server will treat this as a local network logon. The server
will test for a matching account in its own database.
If it finds a matching account, then
The SMB password is compared to the SAM database password.
If the password matches, then
The command completed successfully.
If the password does NOT match, then
The user is prompted for a password.
The password is retested as above.
System error 1326 has occurred. Logon failure: unknown
user name or bad password.
End
If it does NOT find the account in the local SAM database AND
LsaLookupRestrictIsolatedNameLevel=0 AND NeverPing=0, then (* See Note 4)
The server will simultaneously ask each domain that it trusts whether it has account that
matches the SMB account.
The first trusted domain to reply is sent a request to
perform pass-through authentication of the client
information.
The trusted domain will look in its own database.
If an account that matches the SMB account is found, then
The trusted domain determines whether the account is a local or global
account.
If no trusted domains respond to the request to identify the
account, then
Guest permissions are tested on the original server,
not the trusted server.
If the guest account is enabled
The command completed successfully.
If the guest account is disabled
System error 1326 has occurred. Logon failure:
unknown user name or bad password.
End
Observações
Se a conta de convidado estiver desativada e o usuário não tiver uma conta, o servidor ainda solicitará uma senha. Embora nenhuma senha atenda aos seus requisitos, o servidor ainda solicitará uma senha como medida de segurança. Essa medida de segurança garante que um usuário não autorizado não possa dizer a diferença entre um caso em que uma conta existe e quando a conta não existe. O usuário sempre será solicitado a fornecer uma senha, independentemente de a conta existir ou não.
Neste ponto, as seguintes informações são retornadas do domínio confiável na resposta: SID do domínio, ID do usuário, associações de grupos globais, hora de logon, hora de logoff, KickOffTime, nome completo, senha LastSet, sinalizador de senha pode ser alterado, sinalizador de senha deve ser alterado, script de usuário, caminho do perfil, diretório inicial e contagem de senhas incorretas.
Se nenhuma conta for encontrada no domínio confiável, o sistema operacional deverá usar a conta de convidado local para garantir um comportamento consistente de autenticação no servidor.
Para obter mais informações sobre como restringir a pesquisa e o logon de nomes isolados em domínios confiáveis usando as entradas do Registro LsaLookupRestrictIsolatedNameLevel e NeverPing, consulte O processo Lsass.exe pode parar de responder se você tiver muitas relações de confiança externas em um controlador de domínio do Active Directory. Além disso, está disponível um hotfix que amplia o log para identificar solicitações de pesquisa de nome isoladas no Windows Server 2008 SP2.
- As contas de convidado em domínios confiáveis nunca estarão disponíveis.
- O processo interno real é mais complexo do que os algoritmos descritos aqui.
- Esses algoritmos não discutem a mecânica real da autenticação de passagem. Para obter mais informações, consulte Autenticação de usuário NTLM no Windows.
- Esses algoritmos não discutem o processo de criptografia de senha usado no Windows. Um objeto binário grande (BLOB) derivado de um hash de senha unidirecional é enviado como parte da solicitação de autenticação. O conteúdo desse BLOB dependerá do protocolo de autenticação escolhido para o logon.
- Este artigo não discute o funcionamento interno do Módulo de Autenticação da Microsoft.
- Esses algoritmos pressupõem que a conta de convidado, quando habilitada, não tem senha. Por padrão, a conta de convidado não tem uma senha no Windows. Se uma senha de conta de convidado for especificada, a senha de usuário enviada no SMB deverá corresponder a essa senha de conta de convidado.
Exemplos
A seguir estão exemplos desses algoritmos em ação.
Exemplo 1
Você está conectado ao computador usando o mesmo nome de conta e senha que estão no banco de dados de conta de domínio CONTOSO-DOMAIN. Quando você executa o NET USE \\CONTOSO
comando para o controlador de domínio para o domínio CONTOSO-DOMAIN, o comando é concluído com êxito. Ao executar o NET USE \\NET
comando para o controlador de domínio que confia no domínio CONTOSO-DOMAIN, você recebe a seguinte mensagem de erro:
Ocorreu o erro de sistema 1326. Falha de logon: nome de usuário desconhecido ou senha incorreta.
A conta \CONTOSO-DOMAIN\USER1 tem permissões em \\NET.
Observação
Este exemplo pressupõe as configurações a seguir.
Configurações do
Computador que tem uma autoridade de segurança local:
- Conta de login: USER1
- Senha: PSW1
- Domínio de login: LOCAL1
Controlador de domínio do Active Directory:
-Nome do Servidor: NET
-Domínio: NET-DOMAIN
-Trust: NET-DOMAIN Trust CONTOSO-DOMAIN (portanto,
contas em CONTOSO-DOMAIN podem receber permissões
no domínio NET).
O domínio NET-DOMAIN:
- O banco de dados de conta de domínio para o domínio NET-DOMAIN não contém uma conta para USER1.
- A conta de convidado está desativada.
O domínio CONTOSO-DOMAIN:
- Nome do Servidor: CONTOSO
- Domínio: CONTOSO-DOMAIN
- O banco de dados de domínio contém a conta: USER1
- O banco de dados de domínio contém a senha: PSW1
Neste exemplo, o computador está conectado ao seu domínio local, não ao domínio CONTOSO-DOMAIN em que reside a conta de domínio do computador.
Exemplo 2
Quando você executa o NET USE x: \\NET\share
comando, as seguintes etapas ocorrem:
O computador envia o seguinte no SMB "Configuração da sessão":
- conta = "USUÁRIO1"
- senha = "PSW1"
- domínio = "LOCAL1"
O servidor \\NET recebe o SMB e examina o nome da conta.
O servidor examina seu banco de dados de conta de domínio local e não encontra uma correspondência.
Em seguida, o servidor examina o nome de domínio SMB.
O servidor não confia em "LOCAL1", portanto, o servidor não verifica seus domínios confiáveis.
O servidor então verifica sua conta de convidado.
A conta de convidado está desabilitada, então o erro "Ocorreu o erro de sistema 1326. Falha de logon: nome de usuário desconhecido ou senha incorreta." mensagem de erro é gerada.
Exemplo 3
Quando você executa o NET USE x: \\CONTOSO\share
comando, as seguintes etapas ocorrem:
O computador envia o seguinte no SMB "Configuração da sessão":
- conta = "USUÁRIO1"
- senha = "PSW1"
- domínio = "LOCAL1"
O servidor \\CONTOSO recebe o SMB e examina o nome da conta.
O servidor examina seu banco de dados de conta de domínio local e encontra uma correspondência.
Em seguida, o servidor compara a senha SMB com a senha da conta de domínio.
As senhas correspondem.
Portanto, a mensagem "Comando concluído com êxito" é gerada. No Exemplo 2 e no Exemplo 3, a relação de confiança não está disponível. Se o computador tivesse sido conectado ao domínio CONTOSO-DOMAIN, o NET USE x: \\NET\share
comando teria sido bem-sucedido.
A solução ideal é fazer com que todos os computadores façam logon em um domínio. Para fazer logon, o usuário deve especificar o domínio, a conta e a senha. Depois de fazer isso, todos os comandos do tipo NET USE passarão as informações corretas de domínio, conta e senha. Os administradores devem tentar evitar contas duplicadas em computadores e vários domínios. O Windows ajuda a evitar essa configuração usando relações de confiança entre domínios e usando membros que podem usar bancos de dados de domínio.
Solução alternativa
Há uma solução alternativa que pode ser usada nesses casos. No computador, você pode executar o seguinte comando:
NET USE X: \\NET\SHARE /USER:CONTOSO-DOMAIN\USER1 PSW1
Neste comando, o seguinte é verdadeiro:
- \\NET = O nome do computador do controlador de domínio que está sendo acessado.
- \SHARE = O nome do compartilhamento.
- /USER: parâmetro de linha de comando que permite especificar o domínio, a conta e a senha que devem ser especificados no SMB "Configuração da sessão".
- CONTOSO-DOMAIN = Nome de domínio do domínio em que a conta de usuário reside.
- \USER1 = conta a ser validada.
- PSW1 = senha que corresponde à conta no domínio.
Para obter mais informações sobre esse comando, digite o seguinte no prompt de comando:
NET USE /?
Nomes de domínio NULL
O cliente SMB da Microsoft incluído no Windows envia nomes de domínio NULL no SMB "SMB de Configuração de Sessão [x73]". O cliente SMB da Microsoft manipula o nome de domínio especificando o nome de domínio de logon e enviando um caractere NULL se o nome de domínio não for especificado no comando NET USE. O cliente SMB da Microsoft também exibirá o comportamento descrito no Exemplo 1.
Observação
Normalmente, há duas representações para "NULL" no SMB: um nome de domínio de comprimento zero e um nome de domínio de um byte que consiste no caractere de ponto de interrogação (?). O servidor SMB captura o ponto de interrogação e o converte em NULL antes de passá-lo para a LSA (autoridade de segurança local).
Solução de problemas
Uma boa dica para solucionar problemas de acesso à rede é habilitar a auditoria fazendo o seguinte.
Controladores de domínio do Windows
- Nas Ferramentas Administrativas em um controlador de domínio, inicie Usuários e Computadores do Active Directory.
- Clique com o botão direito do mouse em UO de Controladores de Domínio e clique em Propriedades.
- Na guia Política de Grupo, clique duas vezes em Política de Controlador de Domínio Padrão.
- No Editor de Diretivas, clique em Configurações do Computador, em Configurações do Windows, em Configurações de Segurança, em Configuração Avançada de Diretiva de Auditoria e em Logon da Conta.
- Selecione a opção Validação de Credencial de Auditoria e a opção Falha .
Configurações de domínio para Windows 2000
- Nas Ferramentas Administrativas em um controlador de domínio, inicie Usuários e Computadores do Active Directory.
- Clique com o botão direito do mouse no nome de domínio e clique em Propriedades.
- Na guia Política de Grupo, clique duas vezes em Política de Domínio Padrão.
- No Editor de Diretivas, clique em Configurações do Computador, em Configurações do Windows, em Configurações de Segurança, em Configuração Avançada de Diretiva de Auditoria e em Logon da Conta.
- Selecione a opção Validação de Credencial de Auditoria e a opção Falha .
Configurações locais para servidores e membros do Windows 2000
- Nas Ferramentas Administrativas, inicie a Política de Segurança Local.
- Abra Configuração Avançada de Política de Auditoria – Objeto de Política de Grupo Local.
- Selecione Logon da Conta e, em seguida, a opção Validação de Credencial de Auditoria e a opção Falha .
- Agora, sempre que um usuário da rede acessar esse servidor remotamente, uma trilha de auditoria será registrada no Visualizador de Eventos. Para ver esses eventos no Visualizador de Eventos, clique em Segurança no menu Log .
Para obter mais informações sobre relações de confiança, autenticação de passagem, permissões de usuário e logons de domínio, consulte a "Visão geral técnica dos Serviços de Segurança do Windows Server 2003".