Como impedir que os usuários compartilhem certificados no OpenVPN?

8

Eu tenho um servidor OpenVPN que usa certificados e autenticação LDAP.

O problema é que, um usuário pode compartilhar seu certificado e outros usuários LDAP válidos podem usá-lo.

Questão

Como garantir que o certificado de Bob possa ser usado apenas com o usuário LDAP "bob"?

Sandra
fonte

Respostas:

9

De acordo com este post , common_namenão pode ser falsificado pelo usuário.

Adicione isso ao openvpn server.conf

script-security 2

# untrusted state
auth-user-pass-verify /etc/openvpn/scripts/check_cn_on_connect.sh via-env

/etc/openvpn/scripts/check_cn_on_connect.sh contém

#!/bin/bash

# username and common_name must be the same to allow access.
# users are not allowed to share their cert
if [ $username != $common_name ]; then
   echo "$(date +%Y%m%d-%H%M%S) DENIED  username=$username cert=$common_name" >> /var/log/openvpn-access.log
   exit 1
fi

echo "$(date +%Y%m%d-%H%M%S) GRANTED username=$username cert=$common_name" >> /var/log/openvpn-access.log

exit 0

Atualizar

Isto é para o OpenVPN 2.1.4. No 2.2.0, eles adicionaram muitas variáveis ​​novas que você pode ver env >> /tmp/env, onde uma dessas novas variáveis ​​é a impressão digital / número de série dos certificados.

Sandra
fonte
4

Existem muitas opções, já que o OpenVPN é um projeto de código aberto e possui a capacidade de escrever seu gancho de autenticação própria. Muitas pessoas fizeram várias coisas diferentes para fornecer níveis diferentes de autenticação.

Eu não tentei a maioria deles, apenas os vi mencionados nos documentos / blogs / maillists. Alguns deles podem exigir patches ou a versão não gratuita.

Um método principal será tornar a parte privada do seu par de chaves proibitivamente difícil de extrair / copiar.

Se a proteção da chave é proibitiva em termos de custo, não é suportada nas plataformas do cliente ou não é possível por algum outro motivo, você tem algumas opções.

  • Requer renovações frequentes do certificado, para que um certificado copiado não possa ser usado por muito tempo.
  • Defina muito log em seu servidor, para observar anomalias. Se Bob normalmente faz login apenas em sua casa e, em seguida, um dia, ele começa a fazer login na Acme Inc., talvez seja necessário investigar.

  • Configurar autenticação multifator. Seu certificado conta como "algo que você tem". Portanto, você deve procurar alternativas em 'algo que você é' ou 'algo que você conhece'. Isso inclui métricas bio ou senhas / frases secretas.

  • Como mencionei, o OpenVPN fornece autenticação muito flexível. Isso usa a auth-user-pass-verifyopção Essa opção passa o nome de usuário e a senha fornecidos para um script / programa externo que tomará a decisão de autenticação com base no que você desejar.
Zoredache
fonte
Eu posso usar o auth-user-pass-verify /etc/openvpn/scripts/connect.sh via-envpara obter o nome de usuário do usuário. Você sabe se eu também posso obter o ID do certificado que o usuário está usando? Nesse caso, posso escrever um script Perl que verifique um arquivo yaml com IDs de certificação conhecidas.
1100 Sandra
1
Infelizmente, não conheço um método para obter o ID / assunto / detalhes do certificado usado, mas isso não significa que não seja possível.
Zoredache
Encontrei a solução e a publiquei.
1515 Sandra
1

Eu não sou um profissional de segurança, sou rigoroso com segurança. Sua pergunta atinge precisamente o núcleo da segurança de TI: confiança. A meu ver, nunca se deve presumir que Bob possa ser confiável. Claro, Bob pode ser um cara muito legal e confiável. Ele trabalha na sua empresa há mais de 20 anos. No entanto, a pessoa "Bob" é totalmente irrelevante em sua infraestrutura de TI.

Bob usa 'relés' arbitrários que permitem acesso. Os relés podem ser qualquer coisa: uma senha, certificado, token de hardware, verificação de íris, DNA. São chaves que permitem o acesso ao seu sistema. Se sua pergunta é sobre a verificação da identidade da pessoa que está usando uma chave, a única resposta honesta provavelmente é que você precisará estar na mesma sala. Em todos os outros casos, acho que você não deve se assegurar de que Bob realmente é Bob e que atualmente não está sendo mantido à mão armada enquanto obtém seu acesso. Portanto, no seu plano de design de infraestrutura de TI, o lógico é não se referir a "Bob": uma entidade obteve acesso ao seu site.

Como você só pode realmente saber que 'uma entidade' obteve acesso com uma chave que você distribuiu no passado, a perspectiva correta provavelmente é limitar o número de portas que a chave pode abrir. Quanto mais chaves você passa, menos portas se abrem.

O OpenVPN também tem uma opção para permitir apenas uma conexão simultânea por chave. Então, se Alice fizer login com a chave de Bob enquanto Bob já estiver dentro, terá acesso negado a Alice. Infelizmente, isso também significa que Bob não pode fazer login quando Alice estiver logada com a chave de Bob. Portanto, você deve configurar seu sistema para informá-lo sobre tentativas simultâneas de login de vários IPs de origem. E comece os dois quando ocorrer alguma violação, para que Bob precise discar para obter ajuda.

O ponto é: não se assegure de coisas das quais não tenha certeza e lembre-se disso ao criar seu plano de segurança. Suponha que sempre exista uma pessoa mais inteligente lá fora, muito à sua frente, que mal pode esperar para provar que está errado ... apenas 'pelo prazer'. :-)

drumfire
fonte