Como habilitar Two-Factor Authentication (2FA) no Windows com o MultiOTP

Neste artigo, vamos implementar a autenticação de dois fatores para autenticação de usuários no domínio usando o MultiOTP, que é Open-Source.

1. Introdução

A medida que novas ameaças surgem, novos métodos de evasão de defesas aparecem, os métodos tradicionais de autenticação - como o uso de senhas, ainda que complexas - muitas vezes já não são mais suficientes para mitigar riscos de segurança, soluções que visam aumentar essa segurança, como multi-fator de autenticação, já se tornaram extremamente importantes.

O próprio NIST, em suas revisões mais recentes, já removeu requisitos de complexidade como caracteres especiais em senhas. Essa alteração foi feita, em parte, porque os usuários encontram maneiras de contornar requisitos de complexidade rigorosos. Em vez de se esforçar para lembrar senhas complexas e correr o risco de serem bloqueados, eles podem escrever suas senhas e deixá-las perto de computadores físicos ou servidores. Ou simplesmente reciclam senhas antigas com base em palavras do dicionário, fazendo alterações mínimas durante a criação da senha, como incrementar um número no final.1

Com isso, o próprio NIST2 sugere implementar um multi-fator de autenticação e, neste artigo venho trazer exatamente uma solução de 2FA para suprir essa necessidade, o MultiOTP.

2. O que é o MultiOTP?

O MultiOTP é uma solução de 2FA de código aberto que implementa o conceito de one-time password (OTP), que reforça a segurança de login no domínio.

Desenvolvido em PHP e distribuído sob a licença LGPL, o MultiOTP oferece uma abordagem flexível e multiplataforma para adicionar uma camada extra de proteção em autenticações, sendo aplicável tanto em ambientes web quanto em integrações com servidores RADIUS, autenticação de redes e logins em estações de trabalho.

MultiOTP é, basicamente, uma biblioteca PHP, um utilitário de linha de comando e uma interface web que, juntos, fornecem uma solução completa para autenticação forte baseada em senhas descartáveis – ou OTPs. Essa abordagem minimiza o risco de que um invasor reutilize uma senha interceptada, já que cada código gerado é válido apenas por um curto período ou para uma única sessão de autenticação.

A solução é certificada pelo OATH (Initiative for Open Authentication) desde a versão 4.1.0 e suporta padrões amplamente utilizados, como HOTP (HMAC-Based One-Time Password) e TOTP (Time-Based One-Time Password).

3. Funcionalidades e Protocolos Suportados

Entre as principais funcionalidades do MultiOTP, destacam-se:

  • Geração de OTPs: Pode gerar códigos baseados tanto em eventos (HOTP) quanto em tempo (TOTP), garantindo que o código expire rapidamente.
  • Compatibilidade com Hardware e Software: Suporta tokens físicos (como chaves certificadas OATH) e aplicativos de autenticação (como o Google Authenticator).
  • Integração com SMS: Possui a opção de enviar códigos por SMS, ampliando as possibilidades de autenticação forte.
  • Envio por E-mail: Possui a opção de enviar códigos por e-mail, ampliando as possibilidades de autenticação forte.
  • Suporte a Protocolos de Autenticação: Além de HOTP e TOTP, o MultiOTP oferece suporte aos protocolos CHAP, MS-CHAP e MS-CHAPv2, além de integrar-se a serviços como SMTP, LDAP e RADIUS para aplicações diversas.

Outras opções de uso para o MultiOTP, é a configuração de 2FA para autenticação SSH e para Windows RDWeb server.

O MultiOTP oferece operação offline (não precisa de acesso à Internet), então você pode usá-lo para configurar autenticação multifator em ambientes desconectados. A maioria dos aplicativos similares são comerciais ou exigem acesso direto à Internet.

4. Configurando o MultiOTP no domínio

4.1. Ambiente de laboratório

No meu ambiente, vou utilizar um AD Windows Server 2019 e Windows 11 Pro. Uma imagem OVA (baixada pronta para uso no site do MultiOTP) para uma máquina virtual VMware.

Você também pode implantar o multiOTP usando uma imagem OVA para uma máquina virtual VMware/Hyper-V ou um contêiner Docker. Ver site.

4.2. Configurando um Grupo de Segurança no AD

Vamos começar com a configuração necessária de usuário de serviço e grupos no AD.

  • Crie um grupo no AD dedicado para os usuários que precisarão se autenticar com 2FA. No meu caso, eu criei um grupo chamado 2FAUsers e adicionei os usuários que irão usar o OTP.
  • Crie um grupo no AD dedicado para os usuários que NÃO precisarão se autenticar com 2FA. No meu caso, eu criei um grupo chamado without2FA e adicionei os usuários que NÃO irão usar o OTP.
  • Crie um usuário no AD dedicado para configuração e sincronização do AD e o serviço de 2FA. No meu caso, eu criei o usuário multiotp_srv dentro da OU ServiceAccounts.

4.3. Configurando o servidor OTP

Vamos começar com a configuração de um servidor multiOTP que obterá usuários do AD, gerará códigos QR exclusivos para usuários e validará o segundo fator.

Realize a seguinte configuração no terminal para configurar o servidor OTP:

 1multiotp -config default-request-prefix-pin=1
 2multiotp -config default-request-ldap-pwd=0
 3multiotp -config ldap-server-type=1
 4multiotp -config ldap-cn-identifier="sAMAccountName"
 5multiotp -config ldap-group-cn-identifier="sAMAccountName"
 6multiotp -config ldap-group-attribute="memberOf"
 7multiotp -config ldap-ssl=0
 8multiotp -config ldap-port=389
 9multiotp -config ldap-domain-controllers=kingslanding.sevenkingdoms.local,ldap://192.168.56.10:389 #kingslanding é o hostname do DC.
10multiotp -config ldap-base-dn="DC=sevenkingdoms,DC=local"
11multiotp -config ldap-bind-dn="CN=multiotp_srv,OU=ServiceAccounts,DC=sevenkingdoms,DC=local"
12multiotp -config ldap-server-password="Minhasenha@123"
13multiotp -config ldap-in-group="2FAUsers" # Grupo do AD criado para habilitar usuários ao 2FA.
14multiotp -config ldap-without2fa-in-group="without2FA" # Grupo do AD para exceção de users ao 2FA.
15multiotp -config ldap-network-timeout=10
16multiotp -config ldap-time-limit=30
17multiotp -config ldap-activated=1
18multiotp -config server-secret=secret2OTP

Para demais configurações, veja a documentação oficial. O link da documentação está em Referências.

Ok! Depois de feito essas configurações iniciais, agora vamos sincronizar tudo! Execute:

1multiotp -debug -display-log -ldap-users-sync

Se tudo ocorreu certo, você receberá o seguinte:

 1root@multiotp:~# multiotp -debug -display-log -ldap-users-sync
 2
 3LOG 2025-03-27 14:25:51 debug LDAP Debug: *AD/LDAP synchronization started at 14:25:51 / Memory used: 1.6MB / Peak: 1.6MB
 4
 5LOG 2025-03-27 14:25:51 info LDAP Info: AD/LDAP synchronization started
 6
 7LOG 2025-03-27 14:25:51 debug System Debug: *LDAP cache folder value: /tmp/.ldap_cache/
 8
 9LOG 2025-03-27 14:25:51 debug System Info: *File created: /etc/multiotp/users/cersei.lannister.db
10
11LOG 2025-03-27 14:25:51 info System Info: User cersei.lannister automatically created
12
13LOG 2025-03-27 14:25:51 debug System Info: *File created: /etc/multiotp/users/robert.baratheon.db
14
15LOG 2025-03-27 14:25:51 info System Info: User robert.baratheon automatically created
16
17LOG 2025-03-27 14:25:51 debug System Info: *File created: /etc/multiotp/users/robin.arryn.db
18
19LOG 2025-03-27 14:25:51 info System Info: User robin.arryn automatically created
20
21LOG 2025-03-27 14:25:51 debug System Info: *File created: /etc/multiotp/users/sandson.costa.db
22
23LOG 2025-03-27 14:25:51 info System Info: User sandson.costa automatically created
24
25LOG 2025-03-27 14:25:51 info LDAP Info: 4 users created, based on 4 LDAP entries (processed in 00:00:00)
2619 *INFO: Requested operation successfully done

Você verá a quantidade de usuários importados dos grupos no qual você criou.

Acesse o serviço web, o acesso é o IP de sua VM: https://<ip_VM>/. Se você configurou o MultiOTP no Windows, o acesso é pelo link: https://<ip_VM>:8112/.

Figura 1. Essa é a linda GUI do nosso MultiOTP. O importante é a funcionalidade. Foca no poder da ferramenta!
Figura 2. Essa é a tela após logado.

Perceba que na figura 2, temos 3 usuários, dois deles referenciados como [AD/LDAP], isso indica que esses usuários foram importados do grupo no AD criado com exclusividade para o 2FA. O outro usuário que tem não tem essa marcação e está em cinza, é um usuário configurado manualmente para ser ignorado no 2FA, ele só precisa da senha. Quando você realizar o sync novamente do AD, esses usuários serão removidos, sendo necessário recadastrar manualmente.

Quando configurado o grupo do AD que será excluído do 2FA e é importado no servidor OTP, a configuração fica assim:

Figura 3. Os usuários robert.baratheon e robin.arryn foram importados como usuários que NÃO devem usar 2FA.

Ok! Depois que o LDAP está sincronizado e você já consegue visualizar os usuários em tela, agora é hora de gerar os qrcodes dos usuários, para ser enviado para eles, repassados ou como você quiser distribuir.

4.4. Gerando o QRCode

Para gerar o QRCode de usuários:

  • Para criar somente a imagem para um usuário: multiotp -qrcode username username.png.
  • Para criar a página HTML para um usuário: multiotp -htmlinfo username username.html.
  • Para criar a página HTML para todos os usuários: multiotp -htmlinfo /usr/local/bin/multiotp/.

O caminho padrão para a geração de todos os qrcodes dos usuários é o /usr/local/bin/multiotp/. O sistema não aceita a criação para outra pasta, pelo menos no meu teste eu não consegui gerar para outra pasta.

Você também pode gerar, individualmente o HTML pelo GUI clicando em Print, conforme Figura 3.

Abaixo um exemplo da página que é gerada:

Este PDF é um exemplo de como é a página HTML gerada. Pode ser gerado o PDF do HTML e enviado ao usuário ou enviado via e-mail como uma página HTML.

Ok! Depois dessas configurações terem sido realizadas, seu servidor está pronto para ser usado.

5. Configurando o MultiOTP no computador

Agora é a hora da verdade! Vamos configurar e saber se vai de vera ou não!

Baixe e instale o multiOTP Credential Provider 5.9.9.2 pelo link do GitHub: https://github.com/multiOTP/multiOTPCredentialProvider/releases.

Figura 4. Tela de configuração do OTP.
  • Em multiOTP Login Title você personaliza o que quiser.
  • Em URL Server você coloca o FQDN ou IP configurado, conforme imagem. Se você configurou o multiOTP no Windows, deve incluir a porta 8112, conforme exemplo no próprio programa.
  • Em Secret shared… você inclui a senha configurada na instalação do servidor.
  • A opção No remote server, local multiOTP only só é pra ser usada, se você quiser a autenticação descentralizada, ou seja, a própria máquina é servida como servidor, então você não precisa configurar servidor externo.

Selecione a seguinte configuração:

Figura 5. Segunda tela de configuração do OTP.
  • A primeira opção marcada habilita automagicamente o NumLock. Por padrão, na tela de login é desabilitada.
  • A segunda opção marcada é default.
  • A terceira opção marcada desabilita a solicitação de OTP para usuário que não necessitam de 2FA.
Figura 6. Terceira tela de configuração do OTP.
  • Você configura se quer autenticação OTP somente para conexões remotas ou para conexões remotas e local ou somente local. No meu caso eu configurei para tudo.

Tudo certo! Depois de instalado, pode reiniciar ou apenas desconectar o usuário.

Figura 7. Tela de login com a configuração personalizada.
Figura 8. Tela de solicitação do OTP.

6. Outras configurações

Todos os registros são armazenados em HKEY_CLASSES_ROOT\CLSID\{FCEFDFAB-B0A1-4C4D-8B2B-4FF4E0A3D978} ou podem ser alterados em C:\Program Files\multiOTP\config\multiotp.ini.

Para alterar a logo da tela de autenticação é necessário criar um registro chamado v1_bitmap_path do tipo REG_SZ em HKEY_CLASSES_ROOT\CLSID\{FCEFDFAB-B0A1-4C4D-8B2B-4FF4E0A3D978} e incluir o caminho da imagem sem aspas. A imagem tem que ser do tipo .bmp e tamanho de 128x128.

Eu criei um script automatizando isso, que pode ser acessado em: https://github.com/sandsoncosta/multiOTP-Change-Logo/tree/main.

Caso queira executar diretamente no powerhsell sem baixar o script, basta executar o seguinte comando: iex (New-Object Net.WebClient).DownloadString("https://raw.githubusercontent.com/sandsoncosta/multiOTP-Change-Logo/refs/heads/main/multiOTP_Change_logo.ps1"). Ele solicitará o caminho do arquivo, que deve ser repassado sem aspas e ele criará automaticamente a chave de registro.

Figura 9. Execução do script alterando a logo de autenticação inicial.
Figura 10. Tela de solicitação do OTP.

7. Observações e Recomendações

É importante fazer a implementação progressiva, selecionando poucos usuários ou equipes menos críticas para implantar aos poucos em todo o ambiente.

Outro ponto importante é que ele, por ser um Credential Provider, não oferece proteção para autenticações via terminal como, PSSession ou uso de ferramentas maliciosas como Impacket. Ele fornece proteção para autenticação local e remota como o RDP.

Referências



  1. Esta referência foi retirada do site Aiqon. Ver referências. ↩︎

  2. Seção 5.1.1 Memorized Secrets do NIST Special Publication 800-63B. Ver referências. ↩︎

  3. Referência do NIST dedicada exclusiva para a arquitetura Zero Trust. Ver referências. ↩︎

sábado, 31 de maio de 2025 terça-feira, 25 de março de 2025