独自のOpenVPNサーバーをセットアップした後、そのセキュリティを強化することをお勧めします。これを行い、認証プロセスを合理化する1つの方法は、シングルサインインまたはシングルサインオン(SSO)を使用することです。これは、SAML(これはSSOプロトコル)とも呼ばれます。これにより、不要なユーザーがサーバーに接続するのを防ぐと同時に、既存のユーザー、ID、クライアント管理システム、または認証プロセスと統合するための別のセキュリティ対策が追加されます。
このガイドは、これが人気のあるクラウドベースのIDプラットフォームであるOktaでどのように機能するかの例を提供します。この例の基本は、選択したIDMSとの通信方法を変更するだけで、ほとんどのID管理システム(IDMS)に変換されます。
この例は、IDMまたはSSOシステムがサーバー側でOpenVPNと統合する方法の基本を示すように設計されており、そのまま使用するようには設計されていないことに注意してください。
このガイドでは、次のことを前提としています。
- Oktaアカウントをお持ちです(このガイドはOktaの無料トライアルで機能します)
- すでに最新バージョンのUbuntuをインストールしています (執筆時点で20.04)
- ルートがあります このインストールへのアクセス
- HTTPおよびHTTPSアクセス用のポート80および443でこのシステムにパブリックアクセスでき、それを指すDNS A-NAME(たとえば、openvpnsso.server.com)
- クライアントデバイスにViscosityのコピーがすでにインストールされており、このサーバー用にセットアップ済みです
Oktaのドキュメントは、https://help.okta.com/en/prod/Content/index.htm
にあります。Oktaのその他の例は、GitHubページ(https://github.com/okta
)にあります。このガイドは、サーバーでSSOを設定するための例としてのみ使用してください。提供されているPythonFlaskWebサイトは単なる例として設計されており、本番環境での使用を目的としたものではありません。
Ubuntu 20.04の新規インストールを最初から開始する場合、ここから終了までのこのプロセスには約20分しかかかりません。
Oktaセットアップ
まず、OpenVPNとOkta間の通信を処理する新しいWebサイト用にOktaを構成する必要があります。
- 管理者アカウントでOktaにログインします
- 左側でメニューを展開し、アプリケーション>アプリケーションに移動します
- [アプリ統合の作成]をクリックします
- ODIC-OpenID Connectを選択します 、次にWebアプリケーション 次へをクリックします
- アプリ統合名を付けます 「MyOpenVPNServer」のように認識できる名前
- 認証コードを確認します 「付与タイプ」の「ユーザーに代わって動作するクライアント」でチェックされる唯一のオプションです
- 以下の「
」を置き換えて、サインインリダイレクトURIを設定します http://<yourserver.com>/authorization-code/callback
へ - 必要に応じて、次の「
」を再度置き換えて、サインアウトリダイレクトURIを設定します。 http://<yourserver.com>/logout
へ - 制御されたアクセスを設定します これが試用アカウントである場合は、テスト目的で、組織内の全員にアクセスを許可するを選択するだけです。
- [保存]をクリックします
保存後、ページがリロードされます。このページを開いたままにするか、クライアントIDを今すぐメモしてください 、クライアントシークレット 、およびOktaドメイン 、後で必要になります。
次に、サーバーをセットアップする必要があります。要約すると、Python Flaskアプリケーションのプロキシとしてnginxをインストールし、ファイアウォールに小さな変更を加え、SSL証明書をインストールし、フラスコアプリケーションを構成し、OpenVPNに小さな変更を加えるには、OpenVPNサーバーの準備ができている必要があります。
>まず、SSH経由でサーバーにログインするか、ターミナルを開き、次のコマンドを実行して、すべてが最新であることを確認します
sudo apt-get update
sudo apt-get -y upgrade
OpenVPNサーバーのセットアップ
まず、OpenVPNサーバーの準備ができている必要があります。このサーバーにまだサーバーがない場合は、UbuntuとViscosityを使用したOpenVPNサーバーのセットアップに従ってください。
セットアップしたら、接続できることを確認してください。
次に、OpenVPNサーバー構成に数行追加する必要があります:
- 構成を編集します
sudo nano /etc/openvpn/server.conf
- ファイルの最後に、以下を追加します。
management 127.0.0.1 50123 auth-user-pass-optional management-client-auth
- Ctrl + Xを押して終了し、Yを押して保存してから、Enterキーを押してパスを確認します
-
sudo systemctl restart [email protected]
を使用してサーバーを再起動します
今すぐ接続しようとすると、接続は最終的に失敗し、認証に失敗しましたというメッセージが表示されます。
注:
認証スクリプトまたはプラグインを備えた既存のサーバーがある場合は、SSOがそれらを置き換えるため、これらを削除する必要があります。 Oktaは2FAオプションで構成できますが、このガイドでは取り上げません。Oktaのドキュメントを参照してください。
Webサーバーのセットアップ
UbuntuとViscosityを使用したOpenVPNサーバーのセットアップガイドに従った場合は、最初にファイアウォールを開いてHTTPおよびHTTPSトラフィックを許可する必要があります。次に、以下を実行します。
-
sudo ufw allow http
-
sudo ufw allow https
-
sudo ufw reload
ningxをインストールします
次に、nginxをインストールする必要があります。 nginxはHTTPおよびリバースプロキシサーバーであり、Webアプリケーションのコンポーネントを提供し、TLS/SSLなどの機能の使用を可能にします。 Ubuntuサーバーで次の手順を実行します。
-
sudo apt-get -y install nginx
を実行します -
sudo nano /etc/nginx/sites-enabled/default
を編集します -
server_name _;
の行まで下にスクロールします 、アンダースコア(_)をサーバーのDNS名(myserver.comなど)に置き換えると、次のようになります-server_name myserver.com;
- Ctrl + Xを押して終了し、Yを押して保存してから、Enterキーを押してパスを確認します
-
sudo nginx -s reload
を使用してnginxをリロードします
このセクションのSSL証明書を既にお持ちの場合は、次のセクションにスキップできます。それ以外の場合は、Let'sEncryptとCertbotを使用してSSL証明書を簡単に取得できます。
-
sudo apt-get install -y certbot python3-certbot-nginx
を実行します - 以下を実行し、myserver.comをFQDNに置き換えて、プロンプト
sudo certbot --nginx -d myserver.com
に従います。 。必要に応じて、追加のドメインを指定できます。たとえば、sudo certbot --nginx -d myserver.com -d www.myserver.com -d sso.myserver.com
。 - プロンプトに応答した後、certbotが応答するまでに数分かかる場合があります
- 完了すると、certbotは証明書を自動的に更新できます。cronジョブを追加して
/usr/bin/certbot renew --quiet
を実行するだけです。 1日1回。
これでSSL証明書ができたので、nginxのセットアップを完了できます。
-
sudo nano /etc/nginx/sites-enabled/default
を編集します - 次のセクションを削除します。
location / { # First attempt to serve request as file, then # as directory, then fall back to displaying a 404. try_files $uri $uri/ =404; }
-
# managed by Certbot
の行の後に下にスクロールします 、ただし}
の前 、次のように貼り付けます。
real_ip_header X-Real-IP; real_ip_recursive on; proxy_connect_timeout 600; proxy_send_timeout 600; proxy_read_timeout 600; send_timeout 600; location / { try_files $uri @proxy; } location @proxy { proxy_pass http://127.0.0.1:8080; proxy_pass_header Server; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_pass_header Server; proxy_connect_timeout 3s; proxy_read_timeout 10s; }
- Ctrl + Xを押して終了し、Yを押して保存してから、Enterキーを押してパスを確認します
-
sudo nginx -s reload
を使用してnginxをリロードします
Webアプリのインストール
これで、Webアプリをインストールして起動できます。セキュリティが少し強化されるため、Webアプリケーションを実行するユーザーを作成します。次を実行します:
-
sudo apt-get install -y python3-pip
python pipをインストールして、Flaskの依存関係をインストールできるようにします -
sudo adduser --system --no-create-home --group ssoappuser
Webアプリを実行するユーザーを作成します -
cd /home
-
sudo mkdir ssoapp
-
sudo chown ssoappuser:ssoappuser ssoapp
-
cd ssoapp
-
sudo git clone https://github.com/thesparklabs/openvpn-okta-sso-example.git
GitHubからWebアプリケーションをダウンロードします -
cd openvpn-okta-sso-example
-
sudo python3 -m pip install -r requirements.txt
Webアプリケーションの依存関係をインストールする -
sudo cp ssoapp.service /lib/systemd/system/ssoapp.service
サービスファイルをインストールします -
sudo chown root:root /lib/systemd/system/ssoapp.service
-
sudo systemctl daemon-reload
Webアプリのセットアップ
最後に、Webアプリケーションが機能してOktaと通信するには、いくつかの簡単なセットアップ作業が必要です。ここでクライアントIDが必要になります 、クライアントシークレット 、およびOktaドメイン 以前にOktaのセットアップを集めました。
-
sudo cp client_secrets.json.dist client_secrets.json
を使用してシークレットテンプレートのコピーを作成します - 以下を使用してランダムなシークレットを作成し、それをコピーします
openssl rand -hex 20
-
sudo nano client_secrets.json
を使用して構成を編集します - {{THIS_IS_A_SECRET}}を置き換えます 2ステップ前に生成したランダムな文字列を使用
- {{OKTA_DOMAIN}}を置き換えます auth_uri、issuer、token_uri、userinfo_uriでOktaドメインを使用
- {{CLIENT_ID}}を置き換えます クライアントID
- {{CLIENT_SECRET]]を置き換えます クライアントシークレット
- {{YOUR_DOMAIN}}を置き換えます サーバーアドレスを使用します。例: myserver.com
- Ctrl + Xを押して終了し、Yを押して保存してから、Enterキーを押してパスを確認します
-
sudo nginx -s reload
を使用してnginxをリロードします
これで、アプリケーションサービスを有効にして開始できます
- システムが
sudo systemctl enable ssoapp
を実行したときにサービスを開始できるようにします - サービスを開始します
sudo systemctl start ssoapp
このガイドに従って、UbuntuとViscosityを使用したOpenVPNサーバーのセットアップガイドを使用した場合は、何もする必要はありません。Viscosityに接続するだけです。
既存のサーバーを変更した場合、必要な変更は、ユーザー/パスワード認証がオンになっている場合はオフにすることだけです。これを行うには、接続を編集し、[認証]に移動して、[ユーザーユーザー名/パスワード認証]のチェックを外し、接続を保存して接続します。
OpenVPN auth-gen-token
サンプルアプリケーションには、auth-gen-tokenのサポートが含まれています。 OpenVPN経由でユーザー名/パスワードを使用していないため、これは管理インターフェース経由で処理する必要があります。有効にするには、auth-gen-token 0 external-auth
を追加するだけです。 サーバー構成に。
Oktaトークンの更新
上記の例は、再認証にOpenVPNの認証トークンの代わりにOktaトークンを使用するように拡張できます。 OpenVPNの組み込みサポートがセットアップの大部分をカバーするため、この例は提供しません。
ただし、代わりにOktaを使用したい場合は、次の点に注意してください。
- 認証トークンをプッシュするには、clientAllow関数の応答を変更する必要があります。
- clientReauth関数を変更して、管理インターフェイスを介して渡されるクライアント環境からパスワードを取得し、Oktasのドキュメントに従ってこのトークンを更新してから、更新されたトークンを含むclientAllowと同様のclient-auth応答を送信する必要があります。
- reneg-secがOktaトークンの有効期限よりも短くなるように、サーバーとクライアントの構成を変更する必要があります