Estou executando o OpenVPN 2.3.2 (ainda um novato nisso) em uma máquina Ubuntu 14.04 Server. Quero poder desabilitar/reativar clientes que se conectam ao meu servidor OpenVPN.
eu seguiesseguia para revogar o certificado de um cliente, mas parece que essa mudança é irreversível. Além disso, se eu revogar o certificado de um cliente e o cliente já estiver conectado, a conexão parece não parar. Quero que a conexão pare imediatamente.
Existe alguma maneira fácil de desabilitar e reativar clientes?
Meu arquivo server.conf:
# OpenVPN server configuration file
dev tun
proto udp
port 1194
server 10.8.0.0 255.255.255.0
ca /usr/share/easy-rsa/keys/ca.crt
cert /usr/share/easy-rsa/keys/vpnserver.crt
key /usr/share/easy-rsa/keys/vpnserver.key
dh /usr/share/easy-rsa/keys/dh2048.pem
push "dhcp-option DNS 8.8.8.8"
push "redirect-gateway def1"
comp-lzo
keepalive 10 60
persist-tun
persist-key
user panos
group panos
log-append /var/log/openvpn.log
verb 3
# crl-verify keys/crl.pem
A última linha é para o guia acima.
Obrigado.
Responder1
Implementei uma solução semelhante à do Davidgo. Infelizmente, enfrentei um erro de openssl semelhante aesse bug, e levei muito tempo para encontrar uma solução alternativa para isso.
Finalmente escrevi dois scripts para revogar e cancelar a revogação de certificados de cliente:
revogar.sh:
#!/bin/bash
keys_index_file=/usr/share/easy-rsa/keys/index.txt
fileline="$(grep "/CN=$1/" $keys_index_file)"
columns_number="$(echo $fileline | awk -F' ' '{print NF;}')"
if [[ $columns_number -eq 5 ]] && [[ $fileline == V* ]]; then
source /usr/share/easy-rsa/vars
/usr/share/easy-rsa/revoke-full $1
{
sleep 3
echo kill $1
sleep 3
echo exit
} | telnet localhost 7505
echo "Client certificate revoked successfully."
exit 0;
elif [[ $columns_number -eq 6 ]] && [[ $fileline == R* ]]; then
echo "Client certificate is already revoked."
exit 0;
else
echo "Error; key index file may be corrupted."
exit 1;
fi
cancelar revogação.sh:
#!/bin/bash
keys_index_file=/usr/share/easy-rsa/keys/index.txt
linenumber="$(grep -n "/CN=$1/" $keys_index_file | cut -f1 -d:)"
fileline="$(grep -n "/CN=$1/" $keys_index_file)"
line="$(grep "/CN=$1/" $keys_index_file)"
columns_number="$(echo $line | awk -F' ' '{print NF;}')"
echo $columns_number
if [[ $columns_number -eq 6 ]] && [[ $line == R* ]]; then
column2="$(echo $fileline | awk '{print $2}')"
column4="$(echo $fileline | awk '{print $4}')"
column5="$(echo $fileline | awk '{print $5}')"
column6="$(echo $fileline | awk '{print $6}')"
echo -e "V\t$column2\t\t$column4\t$column5\t$column6" >> $keys_index_file
sed -i "${linenumber}d" $keys_index_file
cd /usr/share/easy-rsa; source ./vars; openssl ca -gencrl -out "keys/crl.pem" -config "$KEY_CONFIG"
echo "Certificate unrevoked successfully."
exit 0;
elif [[ $columns_number -eq 5 ]] && [[ $fileline == V* ]]; then
echo "Certificate is already unrevoked and active"
exit 0;
else
echo "Error; Key index file may be corrupted."
exit 1;
fi
Observe que revoke.sh
o script também abre umconexão Telnetcom openVPN e expulsa o cliente a ser revogado.
Responder2
A resposta de Panos estava correta há 5 anos. Então merece um joinha. No entanto, desde então, o que aconteceu é que o diretório vars foi movido/removido, o diretório /usr/share/easy-rsa parece não estar mais presente e o $KEY_CONFIG parece não estar lá ou acoplado ao vars diretório, que como eu disse parece não estar mais lá, pelo menos no Ubuntu 21.10 (abril de 2022).
Encontrei este script enviado ao github e me pareceu bom, executei e funcionou, ele cancelou meu certificado revogado.
#!/bin/bash
set -e
keys_index_file="/etc/openvpn/server/easy-rsa/pki/index.txt"
linenumber="$(grep -n "/CN=$1"'$' $keys_index_file | cut -f1 -d: | head -1)"
fileline="$(grep -n "/CN=$1"'$' $keys_index_file | head -1)"
line="$(grep "/CN=$1"'$' $keys_index_file | head -1)"
columns_number="$(echo $line | awk -F' ' '{print NF;}')"
echo $columns_number
if [[ $columns_number -eq 6 ]] && [[ $line == R* ]]; then
column2="$(echo $fileline | awk '{print $2}')"
column4="$(echo $fileline | awk '{print $4}')"
column5="$(echo $fileline | awk '{print $5}')"
column6="$(echo $fileline | awk '{print $6}')"
echo -e "V\t$column2\t\t$column4\t$column5\t$column6" >> $keys_index_file
sed -i "${linenumber}d" $keys_index_file
cd /etc/openvpn/server/easy-rsa
EASYRSA_CRL_DAYS=3650 ./easyrsa gen-crl
rm -f /etc/openvpn/server/crl.pem
cp /etc/openvpn/server/easy-rsa/pki/crl.pem /etc/openvpn/server/crl.pem
# CRL is read with each client connection, when OpenVPN is dropped to nobody
chown nobody:nogroup /etc/openvpn/server/crl.pem
echo "Certificate unrevoked successfully."
exit 0;
elif [[ $columns_number -eq 5 ]] && [[ $fileline == V* ]]; then
echo "Certificate is already unrevoked and active"
exit 0;
else
echo "Error; Key index file may be corrupted."
exit 1;
fi
Para executar o script, forneça o nome do certificado VPN que você revogou. Será como aparece no arquivo index.txt no diretório /etc/openvpn/server/easy-rsa/pki/ na linha de comando. Então copie e cole isso em um arquivo, diga Unrevoke.sh e execute:
chmod 777 unrevoke.sh
./unrevoke.sh <Openvpn-Cert-name>
Agora, entendo os argumentos pelos quais você não deve cancelar a revogação de certificados. Mas isto foi uma emergência.
Deixe-me explicar as circunstâncias:
Sou um desenvolvedor trabalhando para uma startup. Não sou administrador de rede ou de sistema, então não sou a melhor pessoa para perguntar, mas não há mais ninguém a quem perguntar, então a responsabilidade recaiu sobre mim.
Essencialmente, o que aconteceu foi que precisávamos mover um equipamento remoto e não supervisionado de uma VPN para outra. Apesar de todos os nossos testes na nova VPN, nós (com isso quero dizer "eu") ignoramos o fato de que o sistema, por padrão, tentaria enviar tudo através da VPN. Incluindo streaming de dezenas de gigabytes de dados através de uma conexão 4G.
Naturalmente, após a troca, o sistema parou de responder e não conseguimos fazer login por meio de nenhuma conexão VPN (nem pelo teamviewer). Depois de tentar descobrir o porquê, cheguei à conclusão de que era porque ele estava tentando transmitir dados pela Internet de volta para si mesmo e isso provavelmente nos custaria milhares de dólares em contas.
Para atenuar a situação enquanto pensava em como resolver o problema, revoguei o certificado VPN, portanto, pelo menos a largura de banda que ele está tentando usar é limitada apenas a tentativas de conexão e não a grandes fluxos de dados.
O comando que usei para revogar o certificado VPN foi:
openvpn-install.sh
Isso vem com a instalação do openvpn e fornece uma maneira de revogar um determinado certificado.
No meio da noite, descobri que há uma maneira de enviar informações de roteamento mais específicas da configuração do servidor openvpn para impedir o streaming de tudo. Então eu fiz isso e cancelei o certificado openvpn revogado.
Com certeza, após cerca de 20 a 30 minutos, o equipamento remoto detectou as alterações da VPN e começou a se acalmar o suficiente para que eu pudesse fazer login e reverter a VPN para as configurações antigas antes de tentarmos trocá-la e o sistema ser recuperado .
Não vou perder meu emprego por causa disso. Mas alguém em uma empresa diferente pode. De qualquer forma, eu só queria compartilhar com você minha experiência e insights sobre por que você pode querer cancelar a revogação de um certificado VPN.
Responder3
Desejando uma maneira de ativar/desativar usuários openvpn sem ter que fornecer a eles outro arquivo de configuração * .ovpn, encontrei esta página.
Tentei a resposta da Coruja e está tudo bem para a primeira rodada de revogação/cancelamento. Mas se você quiser revogar um usuário pela segunda vez, o easy-rsa gerará um erro porque não consegue encontrar arquivos *.crt, *.key e *.pem válidos para excluir e mover para /etc/openvpn/easy-rsa/pki / diretório revogado.
Portanto, a solução é adicionar 3 linhas à resposta do Owl para copiar os arquivos para seus diretórios originais. Eles são:
cp /etc/openvpn/easy-rsa/pki/revoked/certs_by_serial/$column4.crt /etc/openvpn/easy-rsa/pki/issued/$1.crt
mv /etc/openvpn/easy-rsa/pki/revoked/certs_by_serial/$column4.crt /etc/openvpn/easy-rsa/pki/certs_by_serial/$column4.pem
mv /etc/openvpn/easy-rsa/pki/revoked/private_by_serial/$column4.key /etc/openvpn/easy-rsa/pki/private/$1.key
O script não revogado se tornará:
#!/bin/bash
set -e
keys_index_file="/etc/openvpn/server/easy-rsa/pki/index.txt"
linenumber="$(grep -n "/CN=$1"'$' $keys_index_file | cut -f1 -d: | head -1)"
fileline="$(grep -n "/CN=$1"'$' $keys_index_file | head -1)"
line="$(grep "/CN=$1"'$' $keys_index_file | head -1)"
columns_number="$(echo $line | awk -F' ' '{print NF;}')"
echo $columns_number
if [[ $columns_number -eq 6 ]] && [[ $line == R* ]]; then
column2="$(echo $fileline | awk '{print $2}')"
column4="$(echo $fileline | awk '{print $4}')"
column5="$(echo $fileline | awk '{print $5}')"
column6="$(echo $fileline | awk '{print $6}')"
echo -e "V\t$column2\t\t$column4\t$column5\t$column6" >> $keys_index_file
sed -i "${linenumber}d" $keys_index_file
cd /etc/openvpn/server/easy-rsa
EASYRSA_CRL_DAYS=3650 ./easyrsa gen-crl
rm -f /etc/openvpn/server/crl.pem
cp /etc/openvpn/server/easy-rsa/pki/crl.pem /etc/openvpn/server/crl.pem
# CRL is read with each client connection, when OpenVPN is dropped to nobody
chown nobody:nogroup /etc/openvpn/server/crl.pem
cp /etc/openvpn/easy-rsa/pki/revoked/certs_by_serial/$column4.crt /etc/openvpn/easy-rsa/pki/issued/$1.crt
mv /etc/openvpn/easy-rsa/pki/revoked/certs_by_serial/$column4.crt /etc/openvpn/easy-rsa/pki/certs_by_serial/$column4.pem
mv /etc/openvpn/easy-rsa/pki/revoked/private_by_serial/$column4.key /etc/openvpn/easy-rsa/pki/private/$1.key
echo "Certificate unrevoked successfully."
exit 0;
elif [[ $columns_number -eq 5 ]] && [[ $fileline == V* ]]; then
echo "Certificate is already unrevoked and active"
exit 0;
else
echo "Error; Key index file may be corrupted."
exit 1;
fi
Responder4
Ignorando a opção iptables (que acredito ser tecnicamente superior), você pode revogar e restabelecer chaves privadas modificando o arquivo de revogação e recarregando o openvpn. (Se você estiver usando easyRSA, poderá editar easyRSA/index.txt. Encontre a linha apropriada e altere o sinalizador "R" para um sinalizador "V", remova a terceira coluna.) Em seguida,
source ./vars
openssl ca -gencrl -out "crl.pem" -config "$KEY_CONFIG"
Você pode recarregar o servidor de abertura para que a nova configuração tenha efeito. Isso irá expulsar TODOS os clientes, mas eles deverão se reconectar automaticamente e negociar uma nova sessão.
Verhttp://sq4ind.eu/openvpn-revoke-unrevoke-certificates/para o artigo de referência no qual esta solução se baseia.