O ser humano, como se sabe, é uma criatura preguiçosa.
Ainda mais quando se trata da questão de escolher uma senha segura.
Acredito que cada administrador já enfrentou o problema do uso de senhas fracas e padrão. Esse fenômeno é comum entre os altos escalões da gestão da empresa. Sim, exatamente entre aqueles que têm acesso a informações secretas ou comerciais, e seria extremamente indesejável lidar com as consequências de uma violação ou um hack de senha e os incidentes subsequentes.
Na minha experiência, houve um caso em que, em um domínio do Active Directory com uma política de senha ativada, as pessoas do departamento de contabilidade chegaram à conclusão de que uma senha como "Pas$w0rd1234" atendia perfeitamente aos requisitos da política. Como consequência, essa senha foi amplamente utilizada em todos os lugares. A única diferença era, às vezes, o conjunto de números.
Tive uma grande vontade de ter a capacidade não apenas de ativar a política de senhas e definir o conjunto de caracteres, mas também de filtrar com base em um dicionário. Para excluir a possibilidade de uso desse tipo de senhas.
A Microsoft gentilmente nos informa, através do link, que qualquer um que saiba manusear corretamente um compilador, IDE e pronunciar C++ corretamente, é capaz de compilar sua própria biblioteca necessária e usá-la como bem entender. O seu humilde servidor não é capaz disso, então tive que buscar uma solução pronta.
Após uma hora longa de pesquisa, foram apresentados dois variantes de solução para o problema. Claro, estou falando de uma solução OpenSource. Afinal, opções pagas vão de A a Z.
Opção nº 1.
Não há commits há cerca de 2 anos. O instalador original funciona de maneira intermitente, é preciso ajustar manualmente. Cria um serviço separado. Ao atualizar o arquivo de senhas, a DLL não captura automaticamente o conteúdo modificado; é necessário parar o serviço, aguardar o timeout, editar o arquivo e reiniciar o serviço.
Nada legal!
Opção nº 2.
O projeto está ativo, vivo e nem precisa ser forçado a funcionar.
A instalação do filtro consiste na cópia de dois arquivos e na criação de várias entradas no registro. O arquivo de senhas não está em lock, ou seja, está disponível para edição e, segundo a intenção do autor do projeto, é lido uma vez por minuto. Além disso, através de entradas adicionais no registro, é possível realizar uma configuração adicional tanto do próprio filtro quanto até mesmo de nuances da política de senhas.
Assim.
Dado: domínio Active Directory test.local
estação de trabalho Windows 8.1 (para as condições do problema — irrelevante)
filtro de senhas PassFiltEx
- Baixamos a última versão pelo link
- Copiamos PassFiltEx.dll em C:WindowsSystem32 (ou %SystemRoot%System32).
Copiamos PassFiltExBlacklist.txt em C:WindowsSystem32 (ou %SystemRoot%System32). Se necessário, complementamos com nossos próprios modelos
- Editamos a chave do registro: HKLMSYSTEMCurrentControlSetControlLsa => Pacotes de Notificação
Adicionamos PassFiltEx ao final da lista. (A extensão não precisa ser especificada.) A lista completa de pacotes utilizados para verificação ficará assim «rassfm scecli PassFiltEx«.
- Reiniciamos o controlador de domínio.
- Repetimos o procedimento acima para todos os controladores de domínio.
Também é possível adicionar as seguintes entradas no registro, o que proporciona maior flexibilidade no uso deste filtro:
Seção: HKLMSOFTWAREPassFiltEx — é criado automaticamente.
- HKLMSOFTWAREPassFiltExBlacklistFileName, REG_SZ, Padrão: PassFiltExBlacklist.txt
BlacklistFileName — permite especificar um caminho personalizado para o arquivo de modelos de senhas. Se esta entrada do registro tiver um valor vazio ou não existir, o caminho padrão será usado, ou seja — %SystemRoot%System32. É possível até especificar um caminho de rede, MAS deve-se lembrar que o arquivo de modelos deve ter permissões claras de leitura, escrita, exclusão e modificação.
- HKLMSOFTWAREPassFiltExTokenPercentageOfPassword, REG_DWORD, Padrão: 60
TokenPercentageOfPassword — permite especificar a porcentagem de ocorrência da máscara na nova senha. Por padrão, o valor é 60%. Por exemplo, se a porcentagem de ocorrência for definida como 60 e no arquivo de modelos houver a string starwars, então a senha Starwars1! será rejeitada, enquanto a senha starwars1!DarthVader88 será aceita, pois a porcentagem de ocorrência da string na senha é inferior a 60%
- HKLMSOFTWAREPassFiltExRequireCharClasses, REG_DWORD, Padrão: 0
RequireCharClasses — permite expandir os requisitos de senha em comparação com os requisitos padrão de complexidade de senha do Active Directory. Os requisitos de complexidade incorporados requerem 3 de 5 tipos diferentes de caracteres: Maiúsculas, Minúsculas, Dígitos, Símbolos Especiais e Unicode. Com este registro, é possível definir seus próprios requisitos de complexidade de senha. O valor que pode ser especificado é um conjunto de bits, cada um dos quais representa uma potência de dois.
Ou seja — 1 = minúscula, 2 = maiúscula, 4 = dígito, 8 = símbolo especial, e 16 = símbolo Unicode.
Assim, com um valor de 7, os requisitos serão “Maiúscula E minúscula E dígito”, enquanto com um valor de 31 serão “Maiúscula E minúscula E dígito E símbolo especial E símbolo Unicode”.
É possível até combinar — 19 = “Maiúscula E minúscula E símbolo Unicode”.
Uma série de regras para a criação de arquivos de modelos:
- Os modelos são insensíveis a maiúsculas e minúsculas. Portanto, a entrada no arquivo starwars e StarWarS será considerada um valor igual.
- O arquivo de lista negra é lido a cada 60 segundos, portanto pode ser editado tranquilamente, e em um minuto os novos dados serão utilizados pelo filtro.
- No momento, não há suporte para Unicode na verificação de padrões. Ou seja, usar caracteres Unicode nas senhas é possível, mas o filtro não funcionará. Isso não é crítico, pois não vi usuários que utilizam senhas em Unicode.
- É desejável não permitir linhas vazias no arquivo de modelos. No debbuging, um erro é exibido quando os dados são carregados do arquivo. O filtro funciona, mas por que ter exceções desnecessárias?
Para debugging, o arquivo zip contém scripts que permitem criar um log e depois analisá-lo usando, por exemplo,
Este filtro de senhas utiliza o Event Tracing for Windows.
O provedor ETW para este filtro de senhas é 07d83223-7594-4852-babc-784803fdf6c5. Assim, por exemplo, é possível configurar o rastreamento de eventos após a próxima reinicialização:
logman create trace autosessionPassFiltEx -o %SystemRootbugPassFiltEx.etl -p "{07d83223-7594-4852-babc-784803fdf6c5}" 0xFFFFFFFF -ets
O rastreamento será iniciado após a próxima reinicialização do sistema. Para parar:
logman stop PassFiltEx -ets && logman delete autosessionPassFiltEx -ets
Todos esses comandos estão indicados nos scripts StartTracingAtBoot.cmd e StopTracingAtBoot.cmd.
Para verificação única do funcionamento do filtro, pode-se usar StartTracing.cmd e StopTracing.cmd.
Para facilitar a leitura da saída de depuração deste filtro em Microsoft Message Analyzer recomenda-se usar as seguintes configurações:


Ao interromper o log e a análise em Microsoft Message Analyzer tudo aparece mais ou menos assim:

Aqui podemos ver que houve uma tentativa de definir uma senha para o usuário - isso é indicado pela palavra mágica SET na depuração. E a senha foi rejeitada devido à sua presença no arquivo de modelos e mais de 30% de correspondência no texto inserido.
Em uma tentativa bem-sucedida de alterar a senha, vemos o seguinte:

Há um certo inconveniente para o usuário final. Ao tentar mudar uma senha que está na lista do arquivo de modelos, a mensagem na tela não é especialmente inteligente e perspicaz em comparação com a mensagem padrão em caso de não conformidade com a política de senhas.

Portanto, esteja preparado para receber ligações e gritos: "Eu digitei a senha corretamente, mas não funciona."
Conclusão.
Esta biblioteca permite proibir o uso de senhas simples ou padrão no domínio do Active Directory. Digamos 'Não!' a senhas como: 'P@ssw0rd', 'Qwerty123', 'ADm1n098'.
Sim, sem dúvida, os usuários irão gostar ainda mais de você por se preocupar com a segurança deles e a necessidade de criar senhas difíceis de lembrar. E, possivelmente, o número de ligações e pedidos de ajuda com senhas aumentará. Mas segurança tem seu preço.
Links para recursos utilizados:
Artigo da Microsoft sobre a biblioteca de filtro de senhas personalizada:
PassFiltEx:
Link para o lançamento:
Listas de senhas:
DanielMiessler lists:
Lista de palavras do weakpass.com:
Lista de palavras do repositório berzerk0:
Microsoft Message Analyzer:
Fonte: habr.com
