NGINX プロキシを使用して VPC の外部から Amazon Cognito 認証で OpenSearch ダッシュボードにアクセスする方法を教えてください。
Amazon OpenSearch Service ドメインを仮想プライベートクラウド (VPC) に配置しています。NGINX プロキシを使用して VPC の外部から Amazon Cognito 認証で OpenSearch ダッシュボードにアクセスしたいです。
簡単な説明
NGINX を使用して Amazon Elastic Compute Cloud (Amazon EC2) インスタンスをプロキシサーバーとして構成すると、そのプロキシサーバーは、ブラウザリクエストを Cognito および OpenSearch ダッシュボードに転送します。
注: 次の解決策は、ネイティブ Cognito ユーザーにのみ適用されます。
Amazon Cognito 認証を使用して VPC の外部から OpenSearch ダッシュボードにアクセスするには、SSH トンネルまたはクライアント VPN を使用することも可能です。詳細については、「Amazon Cognito 認証を使用して VPC の外部から OpenSearch ダッシュボードにアクセスする方法を教えてください」を参照してください。
解決策
重要: VPC 内のユーザーへのアクセスを制限することで、OpenSearch Service ドメインの安全性を向上できます。続行する前に、この解決策が組織のセキュリティ要件と一致していることを確認してください。
Cognito ユーザープールと ID プールを作成する
次の手順を実行します。
-
Cognito ユーザープールを作成します。次の設定を行います。
[アプリケーションの種類] で [従来のウェブアプリケーション] を選択します。
[アプリケーションに名前を付ける] にカスタムアプリケーション名を入力するか、デフォルトの名前をそのまま使用します。
[サインイン識別子のオプション] で [ユーザー名] を選択します。
[サインアップに必要な属性] で [電子メール] を選択します。 -
Cognito コンソールを開きます。
-
ナビゲーションペインで [ユーザープール] を選択します。
-
目的のユーザープールを選択し、次の設定を行います。
ナビゲーションペインの [ブランディング] で [マネージドログイン] を選択します。
[マネージドログインのブランディングが設定されたドメイン] で [バージョンの更新] を選択します。
[ブランディングバージョン] で [ホステッド UI (Classic)] を選択します。 -
ユーザーとグループを設定します。
-
Cognito ID プールを作成します。次の設定を行います。
[ユーザーアクセス] で [認証されたアクセス] を選択します。
[認証された ID ソース] に Amazon Cognito ユーザープールを入力します。
[IAM ロール] で [新しい IAM ロールを作成] を選択し、ロール名を入力します。
[ユーザープールの詳細] で該当するユーザープール ID を選択し、[アプリクライアント ID] を選択します。
[ロール設定] で [デフォルトの認証されたロールを使用] を選択します。
[クレームマッピング] で [非アクティブ] を選択します。 -
OpenSearch Service ドメインにおいて、Cognito 認証を行うよう設定します。次の設定を行います。
[Cognito ユーザープール] で該当するユーザープールを選択します。
[Cognito ID プール] で該当する ID プールを選択します。 -
[ドメイン] のアクセスポリシーに次のアクセスポリシーを入力します。
{ "Version": "2012-10-17", "Statement": \[ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::account-id:role/service-role/identitypool-role" }, "Action": "es:\*", "Resource": "arn:aws:es:region:account-id:domain/domain-name/\*" } \] }注: account-id を AWS アカウント ID に、identitypool-role を ID プールロール名に置き換えてください。domain-name を OpenSearch Service ドメインに、region をドメインの AWS リージョンに置き換えてください。
NGINX プロキシを設定する
注: 次の設定は、Amazon Linux 2023 上の Amazon マシンイメージ (AMI) に適用されます。別の AMI を使用する場合は、設定を調整する必要がある場合があります。
次の手順を実行します。
-
OpenSearch Service ドメインが属する VPC のパブリックサブネットで EC2 インスタンスを起動します。このインスタンスは、ドメインと同じセキュリティグループを使用する必要があります。
-
(オプション) テスト環境を使用しない場合は、Elastic IP アドレスを割り当てて EC2 インスタンスに関連付けます。
-
(オプション) テスト環境を使用しない場合は、リクエストをその Elastic IP アドレスに解決するように DNS を設定します。Amazon Route 53 を使用してリクエストを解決する方法については、「Amazon Route 53 がトラフィックを Amazon EC2 インスタンスにルーティングするように設定する」を参照してください。
-
インスタンスに接続し、NGINX をインストールするには、次のコマンドを実行します。
sudo yum updatesudo yum install nginx -y -
認証局 (CA) から SSL 証明書を取得します。
注: テスト環境を使用する場合は、代わりに自己署名証明書を生成してください。本番環境では、サードパーティ CA 署名の SSL 証明書を使用することをおすすめします。 -
(オプション) 自己署名証明書を使用するテスト環境を使用する場合は、OpenSSL x509 コマンドを実行してプライベートキーを生成します。
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/cert.key -out /etc/nginx/cert.crt詳細については、OpenSSL のウェブサイトで「x509」を参照してください。
注: 上記のコマンドは、自己署名 SSL 証明書のプライベートキーである cert.key を生成します。 -
/etc/nginx/conf.d ディレクトリに移動し、default.conf というファイルを作成します。
-
default.conf ** ファイルを次の値に変更します。
/etc/nginx/cert.crt に SSL 証明書へのパスを入力します。
/etc/nginx/cert.key に SSL 証明書用に生成したプライベートキーへのパスを入力します。
my_domain_host に OpenSearch Service エンドポイントを入力します。
my_cognito_host に Cognito ユーザープールのドメインを入力します。
重要: HTTPS を使用する必要があります。
お使いの Amazon OpenSearch Service ドメインで OpenSearch Service バージョン 1.0 以降を実行している場合は、_dashboards** エンドポイントを使用します。
Amazon OpenSearch Service ドメインで Elasticsearch バージョン 5.x ~ 7.x を実行している場合は、_plugin/kibana エンドポイントを使用します。注: resolver 値は VPC の設定によって変動します。DNS リゾルバーには、プライマリ CIDR ブロックのベース IP アドレスに 2 を加えた値を使用します。たとえば、CIDR ブロック 10.0.0.0/24 で VPC を作成した場合、DNS リゾルバーは 10.0.0.2 に配置されます。
default.conf ファイルの例
server { listen 443 ssl; server_name host; rewrite ^/$ https://host/_dashboards redirect; resolver 10.0.0.2 ipv6=off valid=5s; set domain_endpoint my_domain_host; set cognito_host my_cognito_host; ssl_certificate /etc/nginx/cert.crt; ssl_certificate_key /etc/nginx/cert.key; # ssl on; ssl_session_cache builtin:1000 shared:SSL:10m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4; ssl_prefer_server_ciphers on; location ^~ /_dashboards { # Forward requests to Dashboards proxy_pass https://domain_endpoint; # Handle redirects to Cognito proxy_redirect https://cognito_host https://host; # Handle redirects to Dashboards proxy_redirect https://domain_endpoint https://host; # Update cookie domain and path proxy_cookie_domain domain_endpoint host; proxy_cookie_path ~*^/$ /_dashboards/; # Response buffer settings proxy_buffer_size 128k; proxy_buffers 4 256k; proxy_busy_buffers_size 256k; } location ~ \/(log|sign|fav|forgot|change|saml|oauth2|confirm) { # Forward requests to Cognito proxy_pass https://cognito_host; # Handle redirects to Dashboards proxy_redirect https://domain_endpoint https://host; # Handle redirects to Cognito proxy_redirect https://cognito_host https://host; proxy_cookie_domain cognito_host host; } } -
(オプション) my_domain_host と my_cognito_host を変数として割り当てるには、sed コマンドを実行します。
sudo sed -i 's/my_domain_host/vpc-cognito-private-xxxxxxxxxx.us-east-1.es.amazonaws.com/' /etc/nginx/conf.d/default.confsudo sed -i 's/my_cognito_host/domain-xxxxxxx.auth.us-east-1.amazoncognito.com/' /etc/nginx/conf.d/default.conf注: 上記のコマンドを実行する場合は、/etc/nginx/conf.d/default.conf ファイル内の my_domain_host と my_cognito_host を置き換える必要はありません。
-
NGINX を有効化して起動するには、次のコマンドを実行します。
sudo systemctl enable nginx && sudo systemctl start nginx
OpenSearch ダッシュボードにアクセスする
次の手順を実行します。
- Cognito ログインページにリダイレクトする NGINX の IP アドレスまたは DNS 名をブラウザで開きます。
- ユーザー名と仮パスワードを入力して OpenSearch ダッシュボードにログインします。
- プロンプトが表示された場合は、パスワードを変更してから再度ログインします。

