私は 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エラーが発生しました。このバグ、この問題の回避策を見つけるのにかなりの時間がかかりました。
最終的に、クライアント証明書の失効と失効解除を行う 2 つのスクリプトを作成しました。
取り消し:
#!/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
取り消し解除:
#!/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 月) では、vars ディレクトリはもう存在しないようです。
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>
さて、証明書の失効を取り消すべきではない理由については理解しています。しかし、これは緊急事態でした。
状況を説明させてください。
私はスタートアップ企業で働く開発者です。ネットワーク管理者でもシステム管理者でもないので、質問するのに最適な人物ではありませんが、他に質問できる人が誰もいなかったので、責任が私に降りかかってきました。
基本的に何が起こったかというと、リモートで監視されていない機器を 1 つの VPN から別の VPN に移動する必要がありました。新しい VPN でのすべてのテストにもかかわらず、私たち (つまり「私」) は、システムがデフォルトですべてを VPN 経由で送信しようとするという事実を見落としていました。4G 接続を介した数十ギガバイトのデータのストリーミングもこれに含まれます。
当然、切り替え後、システムは完全に応答しなくなり、VPN 接続 (および TeamViewer) 経由でもログオンできなくなりました。原因を突き止めようとした結果、システムがインターネット経由でデータをストリームしようとしていたためであり、おそらく数千ドルの請求が発生するだろうという結論に達しました。
問題を解決する方法を考えながら状況を緩和するために、VPN 証明書を取り消しました。これにより、少なくとも使用しようとしている帯域幅は、大量のデータ ストリームではなく、接続試行に制限されます。
VPN 証明書を取り消すために使用したコマンドは次のとおりです。
openvpn-install.sh
これは openvpn のインストールに付属しており、特定の証明書を取り消す方法を提供します。
真夜中に、OpenVPN サーバー構成からより具体的なルーティング情報をプッシュして、すべてのストリーミングを停止する方法があることに気付きました。そこでそれを実行し、失効した OpenVPN 証明書の失効を解除しました。
予想通り、約 20 ~ 30 分後、リモート機器が VPN の変更を認識し、落ち着き始めたため、ログインして VPN を以前の設定に戻すことができ、その後、切り替えを試み、システムが回復しました。
私はこれで職を失うことはありません。しかし、別の会社の人は職を失うかもしれません。とにかく、VPN 証明書の失効を取り消したい理由について、私の経験と洞察を皆さんと共有したいと思いました。
答え3
別の *.ovpn 構成ファイルを提供しなくても、openvpn ユーザーをアクティブ化/非アクティブ化できる方法を希望していたところ、このページを見つけました。
Owl の回答を試してみましたが、最初の取り消し/取り消し解除では問題ありません。ただし、ユーザーを 2 回目に取り消したい場合、easy-rsa は、削除して /etc/openvpn/easy-rsa/pki/revoked ディレクトリに移動する有効な *.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」フラグに変更し、3 番目の列を削除します。) 次に、
source ./vars
openssl ca -gencrl -out "crl.pem" -config "$KEY_CONFIG"
新しい設定を有効にするには、開いているサーバーをリロードします。これにより、すべてのクライアントがキックされますが、クライアントは自動的に再接続して新しいセッションをネゴシエートするはずです。
見る証明書の無効化このソリューションのベースとなる参考記事。