見出し画像

OpenVPNのアカウント管理

OpenVPNでアクセスできるサーバを作ったのでクライアント証明書を発行してクライアントからアクセスできるようにするのはだれでもやると思います。しかしアクセスできるようにしたらアクセスできなくする方法も知っておくべきです。
というわけでクライアント証明書を発行したけどやっぱり禁止したい、なんてなった時のためにやり方を調べておきます。

こちらが非常に参考になりました。

OpenVPNのアクセス権設定

今のところテスト用に作ったクライアントアカウントはcrient1という一つだけ。これを無効にして、新しくアクセス権を与えるユーザを追加することにします。
まずは追加するアカウントのキーペア作成から、公開鍵と秘密鍵作成です。
easy-rasは既にインストールしてあるのでそれを使います。

$cd ~/ca

で鍵の作業ディレクトリに移動。

$./easyrsa build-client-full user1 nopass

でキーペアを作成。パスフレーズの入力を求められます。とりあえず追加するユーザ名はuser1としておきます。

$sudo cp pki/issued/user1.crt pki/private/user1.key /etc/openvpn

でキーペアをコピー。これをもとにovpnアクセスファイルを作ります。前回はこの辺りの設定を書かなかったので今回はちゃんと書こうと思います。
認証ファイルのヘッダをテキストで作成します。自分の環境だとこんな感じ。名前はhead_ovpnとしておきます。

client
dev tun
proto udp
"IP" "PORT" #グローバルIPとポート 
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
key-direction 1
cipher AES-256-GCM
auth SHA256
verb 3
user nobody
group nogroup
compress lz4-v2
push "compress lz4-v

次に設定ファイルを生成するスクリプトを書きます。名前は適当でいいのですがとりあえずmkovpn.shとでもしておきます。ユーザ名と書いてあるところはeasy-rsaをインストールしたユーザ名です。

#!/bin/bash
ca_path=/home/ユーザ名/ca/pki
key_path=/home/ユーザ名/ca/pki/private
crt_path=/home/ユーザ名/ca/pki/issued
ta_path=/etc/openvpn
if [ $# -ne 2 ]; then
       echo "mkovpn.sh HEADER CLIENT" 1>2
       exit 1
fi
header=$1
target=$2
cat $header
echo '<ca>'
grep -A 30 'BEGIN CERTIFICATE' "$ca_path/ca.crt"
echo '</ca>'
echo '<key>'
cat "$key_path/$target.key"
echo '</key>'
echo '<cert>'
grep -A 30 'BEGIN CERTIFICATE' "$crt_path/$target.crt"
echo '</cert>'
echo '<tls-auth>'
cat "$ta_path/ta.key"
echo '</tls-auth>'

これで引数にヘッダファイル名、クライアントユーザ名を指定すれば認証ファイルの内容が表示されます。これをリダイレクトでファイルに保存してやれば認証ファイルになります。

$sudo mkovpn.sh head_ovpn user1 > user1.ovpn

これでuser1.ovpnという認証ファイルが出来ます。これを安全な方法でアクセスするユーザに渡してインストールしてもらえばOpenVPNでアクセスできるはずです。

アクセス拒否の設定

revokeのやりかたが前述のサイトだと古かったようで、こちらを参考にしました。~/caで

$./easyrsa revoke user1
$./easyrsa gen-crl

とすればいいようです。これでpki/srl.pemというのができました。できたpemファイルをコピーします。

$sudo cp pki/crl.pem /etc/openvpn/

さらに/etc/openvpn/server.confの末尾に

crl-verify  crl.pem

という記述を追加します。追加したらopenvpnサーバを再起動します。

クライアントで確認

設定が終わったらクライアントからアクセスできなくなったことを確認します。サーバのログを見ると

Tue Dec 15 21:54:17 2020 XXX.XXX.XXX.XXX:XXXXX VERIFY ERROR: depth=0, error=certifcate revoked: CN=client1

というログを確認。ちゃんと制御できているようです。

お疲れさまでした!







この記事が気に入ったらサポートをしてみませんか?