TFS e FIPS

Implantar sistemas em ambientes produtivos é sempre um grande aprendizado. O mundo real é muito rico. Em ambientes corporativos temos sempre políticas e controles para garantir a segurança da corporação. Políticas essas que apesar de proverem um grau de controle, as vezes barram o bom funcionamento de algumas aplicações. Esse foi o caso da instalação do TFS com isapi filters, e acabei esbarrando em uma situação similar ao instalar um agente de build/deploy em um servidor em rede corporativa.

O servidor no qual eu ia instalar o agente era uma VM Windows que não possuía acesso a internet, mas que estava dentro da rede e, assim, conseguia se comunicar com o TFS corporativo (on premises).

Acessei o site de administração do tfs, baixei o agente e segui os procedimentos descrito na documentação oficial. Após o último passo, em que se informa a senha do usuário de serviço, apareceu o seguinte erro:

Erro instalação

Fui logo consultar o log de instalação do agente, que fica normalmente dentro da pasta "_diag" no diretório de instalação do agente. Então surpresa:

20:48:06.156387 System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.InvalidOperationException: This implementation is not part of the Windows Platform FIPS validated cryptographic algorithms.
20:48:06.156387at System.Security.Cryptography.MD5CryptoServiceProvider..ctor()
20:48:06.156387--- End of inner exception stack trace ---
20:48:06.156387at VsoAgent.AgentManager.ConfigureAgent(IResourceManager resourceManager, Dictionary`2 settings, CommandLine commandLine, String logonAccount, String logonPassword, Boolean force)
20:48:06.156387at VsoAgent.Program.Main(String[] args)
20:48:06.156387at VsoAgent.AgentManager.ConfigureAgent(IResourceManager resourceManager, Dictionary`2 settings, CommandLine commandLine, String logonAccount, String logonPassword, Boolean force)
20:48:06.156387at VsoAgent.Program.Main(String[] args)

Duas coisas me chamaram atenção no erro:

  • "This implementation is not part of the Windows Platform FIPS validated cryptographic algorithms";
  • MD5CryptoServiceProvider;

Eu não tinha idéia do que era FIPS, mas suspeitei ser algum tipo de política do Windows. Já o MD5 ok, um algorítmo bastante difundido principalmente para gerar hashes de arquivos e validar se uma copia é igual ao arquivo de origem. Provavelmente o instalador usa MD5 para validar hashes dos arquivos utilizados durante a instalação. Até ai tudo bem. Mas porque esse tal de FIPS estava dando problema com o MD5? Foi então que descobri:

FIPS é uma sigla para Federal Information Processing Standard, um padrão utilizado pelo governo Americano e Canadense que definine um conjunto mínimo de requisitos de segurança para produtos que implementam criptografia. Esse padrão é designado para módulos de criptografia que são utilizados para segurar informações sensíveis mas não classificadas. Testes de conformidades para este padrão são realizados por órgãos do governo Americano e Canadense. É conhecido que o algoritmo do MD5 possui uma vulnerabilidade e não é certificado pelo FIPS (detalhes). Eis aí o problema.

Mas porque esse problema somente aconteceu nesse servidor? Eu já tinha instalado agentes em várias outros servidores dentro da mesma rede corporativa...

Existe uma política local no Windows que, quando habilitada, exige que qualquer algoritmo de criptografia, hash e assinatura satisfaça as exigências do FIPS. Essa política estava habilitada apenas nesse servidor por uma falha de padronização na criação desse servidor :-( Para maiores detalhes de como o Windows implementa essa política, clique aqui.

Para solucionar o meu problema, foi necessário apenas desabilitar essa política:

  1. Executar 'secpol.msc';
  2. No Local Security Policy, navegar até Local Policies -> Security Options
  3. Buscar por 'System cryptography: Use FIPS compliant
    algorithms for encryption, hashing, and signing'
    ;

  4. Clicar duas vezes e, na janela de propriedades, selecionar para desabilitar e aplicar.

Após esse procedimento, tentei instalar o agente novamente, e dessa vez sucesso!!

Procurei saber se era apenas um problema da instalação do agente ou se o TFS como um todo não suporta FIPS. Não descobri muita coisa atual oficial sobre o assunto, apenas uma referência oficial no msdn dizendo que o TFS 2010 não suporta FIPS e uma solicitação no User Voice requisitando o suporte do TFS ao FIPS. Essa solicitação é recente, e em um dos comentários é relatado o mesmo problema que eu tive ao instalar o agente. Existem também vários relatos em fóruns (como esse) de problemas com a instalação do TFS2015 e a politica de FIPS habilitada.

Conclusão: TFS 2015 também não suporta a politica do FIPS.

Porém, isso não significa que o TFS seja inseguro. É conhecido que o TFS utiliza diversos algoritmos que são validados pelo FIPS (como SHA1). Tudo depende se as informações que são criptografadas por algoritmos como MD5, são informações sensíveis ou não. Pode ser que não sejam dados sensíveis e foi utilizado MD5 para ter maior performance em operações com esses dados. Infelizmente eu não tenho conhecimento suficiente para afirmar.

E não é apenas o TFS que tem problema com a política do FIPS, várias coisas podem parar de funcionar quando se habilita a política. Por exemplo, o algoritmo de SSL não é certificado pelo FIPS. Assim, ao habilitar a política, o browser será forçado a utilizar TLS ao invés de SSL. Se o browser ou o site não suportar TLS, então não irá funcionar. Consulte aqui as consequências de se habilitar a politica.

Mais informações: