Servidor OpenVPN desabilita e reativa clientes

Servidor OpenVPN desabilita e reativa clientes

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.sho 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.

informação relacionada