OpenVPN 서버가 클라이언트를 비활성화하고 다시 활성화합니다.

OpenVPN 서버가 클라이언트를 비활성화하고 다시 활성화합니다.

저는 Ubuntu 14.04 서버 시스템에서 OpenVPN 2.3.2(아직 초보자임)를 실행하고 있습니다. OpenVPN 서버에 연결하는 클라이언트를 비활성화/재활성화하고 싶습니다.

나는 팔로우했다이것클라이언트의 인증서 취소에 대한 안내가 있지만 이 조치는 되돌릴 수 없는 것 같습니다. 또한 클라이언트의 인증서를 취소했는데 해당 클라이언트가 이미 연결되어 있는 경우에도 연결이 중단되지 않는 것 같습니다. 즉시 연결을 중단하고 싶습니다.

클라이언트를 비활성화하고 다시 활성화하는 쉬운 방법이 있습니까?

내 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

마지막 줄은 위의 가이드에 대한 것입니다.

감사합니다.

답변1

나는 davidgo와 유사한 솔루션을 구현했습니다. 불행히도 나는 다음과 유사한 openssl 오류에 직면했습니다.이 버그, 이에 대한 해결 방법을 찾는 데 많은 시간이 걸렸습니다.

마침내 클라이언트 인증서 취소 및 취소를 위한 두 개의 스크립트를 작성했습니다.

취소.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

취소 취소.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

스크립트 는 revoke.sh또한텔넷 연결openVPN을 사용하고 취소할 클라이언트를 쫓아냅니다.

답변2

Panos의 답변은 5년 전 기준으로 정확했습니다. 그러니 엄지손가락을 치켜세울 가치가 있습니다. 그러나 그 이후로 vars 디렉토리가 이동/제거되고 /usr/share/easy-rsa 디렉토리가 더 이상 존재하지 않는 것 같으며 $KEY_CONFIG가 거기에 없거나 vars에 결합된 것 같습니다. 내가 말했듯이 적어도 Ubuntu 21.10(2022년 4월)에는 더 이상 존재하지 않는 것 같습니다.

이 스크립트가 github에 제출된 것을 발견했고 보기에 좋아 보였습니다. 실행했고 작동했으며 취소된 인증서가 취소되었습니다.

#!/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

스크립트를 실행하려면 취소한 VPN 인증서의 이름을 스크립트에 제공하세요. 이는 명령줄의 /etc/openvpn/server/easy-rsa/pki/ 디렉터리에 있는 index.txt 파일에 나타나는 것과 같습니다. 따라서 이것을 복사하여 파일에 붙여넣고 unrevoke.sh라고 말한 후 다음을 실행하십시오.

chmod 777 unrevoke.sh
./unrevoke.sh <Openvpn-Cert-name>

이제 인증서 취소를 취소해서는 안 되는 이유에 대한 주장을 이해했습니다. 하지만 이건 긴급상황이었다.

상황을 설명하자면 다음과 같습니다.

저는 스타트업에서 일하는 개발자입니다. 저는 네트워크 관리자나 시스템 관리자가 아니기 때문에 물어볼 수 있는 최적의 사람은 아니지만, 물어볼 사람이 전혀 없어서 책임이 나에게 떨어졌습니다.

본질적으로 일어난 일은 원격 및 감독되지 않는 장비를 한 VPN에서 다른 VPN으로 이동해야 한다는 것입니다. 새로운 VPN에 대한 모든 테스트에도 불구하고 우리(즉, "나"를 의미함)는 시스템이 기본적으로 VPN을 통해 모든 것을 전송하려고 한다는 사실을 간과했습니다. 4G 연결을 통해 수십 기가바이트의 데이터 스트리밍을 포함합니다.

당연히 전환 후 시스템이 완전히 응답하지 않게 되었고 VPN 연결(또는 팀뷰어를 통해서도)을 통해 로그온할 수 없었습니다. 이유를 알아내려고 노력한 후, 인터넷을 통해 데이터를 자체적으로 스트리밍하려고 했기 때문이며 이로 인해 수천 달러의 비용이 발생할 수 있다는 결론에 도달했습니다.

문제 해결 방법을 생각하는 동안 상황을 완화하기 위해 VPN 인증서를 취소했기 때문에 최소한 사용하려는 대역폭은 대규모 데이터 스트림이 아닌 연결 시도로 제한됩니다.

VPN 인증서를 취소하는 데 사용한 명령은 다음과 같습니다.

openvpn-install.sh

이는 openvpn 설치와 함께 제공되며 특정 인증서를 취소하는 방법을 제공합니다.

한밤중에 저는 openvpn 서버 구성에서 더 구체적인 라우팅 정보를 푸시하여 모든 스트리밍을 중지할 수 있는 방법이 있다는 것을 알아냈습니다. 그래서 그렇게 했고, 취소된 openvpn 인증서를 취소했습니다.

물론, 약 20~30분 후에 원격 장비가 VPN 변경 사항을 감지하고 충분히 진정되기 시작하여 우리가 전환을 시도하고 시스템이 복구되기 전에 로그인하여 VPN을 이전 설정으로 되돌릴 수 있었습니다. .

나는 이것 때문에 직장을 잃지 않을 것입니다. 하지만 다른 회사의 다른 사람은 그럴 수도 있습니다. 어쨌든, 저는 VPN 인증서 취소를 취소하려는 이유에 대한 제 경험과 통찰력을 여러분과 공유하고 싶었습니다.

답변3

openvpn 사용자에게 파생된 다른 *.ovpn 구성 파일을 제공하지 않고도 openvpn 사용자를 활성화/비활성화할 수 있는 방법을 찾고 싶다면 이 페이지를 찾으세요.

나는 Owl의 대답을 시도했고 첫 번째 취소/취소 취소 라운드에는 괜찮습니다. 그러나 사용자를 두 번째로 취소하려는 경우 easy-rsa는 삭제하고 /etc/openvpn/easy-rsa/pki로 이동할 유효한 *.crt, *.key 및 *.pem 파일을 찾을 수 없기 때문에 오류가 발생합니다. /폐기된 디렉토리.

따라서 해결책은 Owl의 답변에 3줄을 추가하여 파일을 원래 디렉터리에 다시 복사하는 것입니다. 그들은:

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

취소 취소 스크립트는 다음과 같습니다.

#!/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

답변4

iptables 옵션(기술적으로 우수하다고 생각함)을 무시하고 취소 파일을 수정하고 openvpn을 다시 로드하여 개인 키를 취소하고 복원할 수 있습니다. (easyRSA를 사용하는 경우 easyRSA/index.txt를 편집할 수 있습니다. 해당 행을 찾아 "R" 플래그를 "V" 플래그로 변경하고 세 번째 열을 제거합니다.)

  source ./vars
  openssl ca -gencrl -out "crl.pem" -config "$KEY_CONFIG"

시작 서버를 다시 로드하여 새 구성을 적용할 수 있습니다. 이렇게 하면 모든 클라이언트가 종료되지만 자동으로 다시 연결되어 새 세션을 협상해야 합니다.

보다http://sq4ind.eu/openvpn-revoke-unrevoke-certificates/이 솔루션의 기반이 되는 참조 기사입니다.

관련 정보