回答:
この投稿によるとcommon_name
、ユーザーが偽ることはできません。
これをopenvpn server.confに追加します
script-security 2
# untrusted state
auth-user-pass-verify /etc/openvpn/scripts/check_cn_on_connect.sh via-env
/etc/openvpn/scripts/check_cn_on_connect.sh
含む
#!/bin/bash
# username and common_name must be the same to allow access.
# users are not allowed to share their cert
if [ $username != $common_name ]; then
echo "$(date +%Y%m%d-%H%M%S) DENIED username=$username cert=$common_name" >> /var/log/openvpn-access.log
exit 1
fi
echo "$(date +%Y%m%d-%H%M%S) GRANTED username=$username cert=$common_name" >> /var/log/openvpn-access.log
exit 0
更新
これはOpenVPN 2.1.4用です。2.2.0 env >> /tmp/env
では、で確認できる多くの新しい変数が追加されました。これらの新しい変数の1つは、証明書のフィンガープリント/シリアル番号です。
OpenVPNはオープンソースプロジェクトであり、独自の認証フックを作成する機能があるため、さまざまなオプションがあり、さまざまなレベルの認証を提供するためにさまざまなことを行ってきた人がたくさんいます。
docs / blogs / maillistsで言及されているのを見ただけで、これらのほとんどを試したことはありません。これらの一部には、パッチまたは非フリーバージョンが必要な場合があります。
主な方法の1つは、キーペアのプライベート部分を抽出/コピーするのが非常に困難になることです。
それらのキーを保護することがコスト的に禁止されている、クライアントプラットフォームでサポートされていない、またはその他の理由で不可能である場合、いくつかのオプションが残されます。
異常を監視するために、サーバーに多くのログを設定します。通常、ボブが自分の家からのみログインしていて、ある日、彼がAcme Inc.からログインを開始した場合、調査が必要になることがあります。
多要素認証を設定します。証明書は「持っているもの」としてカウントされます。したがって、「あなたは何か」または「あなたが知っているもの」の代替案を検討する必要があります。これには、バイオメトリック、またはパスワード/パスフレーズが含まれます。
auth-user-pass-verify
オプションを使用します。このオプションは、提供されたユーザー名とパスワードを外部スクリプト/プログラムに渡し、必要なものに基づいて認証を決定します。私はセキュリティの専門家ではありません。セキュリティについて厳格です。あなたの質問はITセキュリティの核心である信頼に正確に及んでいます。私が見ているように、ボブが信頼できると思い込んではいけません。確かに、ボブは本当に素晴らしくて信頼できる人かもしれません。彼はあなたの会社で20年以上働いています。ただし、「ボブ」という人物は、ITインフラストラクチャとはまったく無関係です。
ボブは、アクセスを許可する任意の「リレー」を使用します。リレーは何でもかまいません:パスワード、証明書、ハードウェアトークン、アイリススキャン、DNA。これらは、システムへのアクセスを許可するキーです。キーを使用している人の身元を確認することに関する質問の場合、正直な答えはおそらく、同じ部屋にいる必要があるということです。他のすべての場合では、ボブが本当にボブであり、彼のアクセス権を取得している間、現在銃口で拘束されていないことを確信してはいけないと思います。したがって、ITインフラストラクチャの設計計画では、論理的には「ボブ」を指すのではなく、エンティティがサイトへのアクセス権を取得しました。
あなたが本当に知ることができるのは、「エンティティ」が過去に渡したキーでアクセス権を得たことだけです。適切な観点は、キーが開くことができるドアの数を制限することです。渡すキーが多いほど、開くドアが少なくなります。
OpenVPNには、キーごとに1つの同時接続のみを許可するオプションもあります。次に、ボブがすでにいる間にアリスがボブのキーでログインした場合、アリスはアクセスを拒否されます。残念ながら、これは、アリスがボブのキーでログインしているときにボブがログインできないことも意味します。したがって、複数のソースIPからの同時ログイン試行を通知するようにシステムを構成する必要があります。また、違反が発生したときに両方を開始するため、ボブは助けを求めてダイヤルする必要があります。
重要なのは、確信が持てないことを自分で保証するのではなく、セキュリティ計画を立てるときはこのことを覚えておいてください。あなたよりずっと先に、あなたの間違いを証明するのを待ちきれない賢い人が常にいると仮定してください...ちょうど「ルルツのために」。:-)
auth-user-pass-verify /etc/openvpn/scripts/connect.sh via-env
て、ユーザーのユーザー名を取得できます。ユーザーが使用している証明書からもIDを取得できるかどうか知っていますか?もしそうなら、既知の証明書IDでyamlファイルをチェックするPerlスクリプトを書くことができます。