Amazon Cognito 認証を使用して、NGINX プロキシで VPC の外部から OpenSearch Dashboards にアクセスするにはどうすればよいですか?

最終更新日: 2021 年 10 月 26 日

Amazon OpenSearch Service (Amazon Elasticsearch Service の後継サービス) クラスターは、Virtual Private Cloud (VPC) にあります。Amazon Cognito 認証を使用して、NGINX プロキシで VPC の外部から OpenSearch Dashboards にアクセスしたいと考えています。これを行うにはどうすればよいですか?

簡単な説明

NGINX を使用してプロキシサーバーとして Amazon Elastic Compute Cloud (Amazon EC2) インスタンスを設定します。その後、プロキシサーバーはブラウザのリクエストを Amazon Cognito および OpenSearch Dashboards に転送します。

Amazon Cognito 認証で VPC の外部から OpenSearch Dashboards にアクセスするために、SSH トンネルまたはクライアント VPNを使用することもできます。詳細については、How can I use an SSH tunnel to access OpenSearch Dashboards from outside a VPC with Amazon Cognito authentication を参照してください。詳細については、How can I use an SSH tunnel to access OpenSearch Dashboards from outside of a VPC with Amazon Cognito authentication? を参照してください。

注: OpenSearch Dashboards は Kibana の後継サービスです。

解決方法

重要: アクセスを VPC のユーザーに制限すると、OpenSearch Services ドメインがより安全になります。作業を続ける前に、必ずこの手順が組織のセキュリティ要件に違反しないことを確認してください。

1.    Amazon Cognito のユーザープールを作成します

2.    ホストされたユーザープールドメインを設定します

3.    Amazon Cognito コンソールのナビゲーションペインで、ユーザーとグループを選択します。

4.    [Create user] を選択し、フィールドに入力します。E メールアドレスを入力して [Mark email as verified] チェックボックスをオンにしていることを確認します。

5.    [Groups] タブを選択し、[Create group] を選択します。[Precedence] について、0 を入力します。詳細については、「AWS マネジメントコンソールでの新しいグループの作成」を参照してください。

6.    Amazon Cognito コンソール を開きます。

7.    [Manage Identity Pools] を選択し、続いて [Create new identity pool] を選択します。

8.    ID プールの名前を入力し、[Enable access to unauthenticated identities] チェックボックスをオンにしてから、[Create Pool] を選択します。

9.    プロンプトが表示されたら、AWS リソースにアクセスし、[許可] を選択して ID プールに関連付けられた 2 つのデフォルトロールを作成します。認証されていないユーザー用にデフォルトのロールを 1 つ作成し、認証されたユーザー用に別のデフォルトのロールを作成します。

10.    OpenSearch Dashboards で Amazon Cognito 認証を使用するように OpenSearch Services ドメインを設定します。
[Cognito User Pool] (Cognito ユーザープール) で、作成したユーザープールを選択します。
[Cognito Identity Pool] (Cognito アイデンティティプール) を選択し、作成したアイデンティティプールを選択します。
詳細については、Get started with Amazon OpenSearch Service: Use Amazon Cognito for OpenSearch Dashboards access control を参照してください。

11.    次のようなリソースベースのポリシーになるようにアクセスポリシーを設定します:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::account-id:role/Cognito_identity-nameAuth_Role"
      },
      "Action": "es:*",
      "Resource": "arn:aws:es:region:aws-account-id:domain/domain-name/*"
    }
  ]
}

これらの値を更新する必要があります。
account-id: AWS アカウント ID
identity-name: Amazon Cognito アイデンティティプールの名前
ES-name: OpenSearch Services ドメインの名前
リージョン: us-east-1 など、OpenSearch Service ドメインが存在するリージョン

12.    OpenSearch Services ドメインの同じ VPC のパブリックサブネット内に EC2 インスタンスを起動します。インスタンスがドメインと同じセキュリティグループを使用することを確認してください。

13.    (オプション) テスト環境を使用していない場合は、Elastic IP アドレスを割り当て、作成したインスタンスに関連付けます。Elastic IP アドレスの割り当ての詳細については、「Elastic IP アドレスの操作」を参照してください。

14.    (オプション) テスト環境を使用していない場合は、Elastic IP アドレスへのリクエストを解決するように DNS を設定します。Amazon Route 53 でリクエストを解決する方法の詳細については、トラフィックを Amazon EC2 インスタンスにルーティングする Amazon Route 53 の設定を参照してください。

15.    インスタンスに接続して NGINX をインストールします。

Amazon Linux 2 AMI で起動されたインスタンスの場合、次のコマンドを使用します。

$ sudo amazon-linux-extras install nginx1

16.    認証機関 (CA) から SSL 証明書を取得し、NGINX の SSL を設定します。

注: テスト環境を使用している場合は、代わりに自己署名証明書を生成します。自己署名証明書はブラウザによって信頼されないため、本稼働環境では使用してはなりません。

17.    (オプション) 自己署名証明書でテスト環境を使用している場合は、OpenSSL x509 コマンドを使用してプライベートキーを生成します。

$ sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/cert.key -out /etc/nginx/cert.crt

このコマンド構文は、自己署名 SSL 証明書のプライベートキーである cert.key を生成します。

18.    /etc/nginx/conf.d ディレクトリに移動し、default.confという名前のファイルを作成します。以下の値を使用してファイルを変更します。
/etc/nginx/cert.crt: SSL 証明書へのパス
/etc/nginx/cert.key: SSL 証明書に対して生成されたプライベートキーへのパス
$domain-endpoint: OpenSearch Services のエンドポイント
$cognito_host: (ステップ 2 で設定した) Amazon Cognito ユーザープールドメイン

default.conf ファイルで直接置換する代わりに、sed コマンドを使用して、$domain-endpoint および $cognito_host を変数として割り当てることができます。また、必ず HTTPS を使用してください。そうしないと、エラーが発生する可能性があります。

この例では、次の点に注意してください。

  • Amazon OpenSearch Service ドメインが OpenSearch Service バージョン 1.0 以降を実行している場合は、_dashboards エンドポイントを使用します。
  • Amazon OpenSearch Service ドメインが Elasticsearch バージョン 5.x から 7.x を実行している場合は、_plugin/kibana エンドポイントを使用します。
server {
    listen 443;
    server_name $host;
    rewrite ^/$ https://$host/_dashboards redirect;

    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/_dashboards;

        # Handle redirects to Cognito
        proxy_redirect https://$cognito_host 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) {
        # Forward requests to Cognito
        proxy_pass https://$cognito_host;

        # Handle redirects to Dashboards
        proxy_redirect https://$domain-endpoint https://$host;

        # Update cookie domain
        proxy_cookie_domain $cognito_host $host;
    }
}

重要: resolver パラメータは、VPC の設定に応じて変化します。DNS リゾルバーは、プライマリ CIDR ブロックのベース IP に 2 を加えた場所に配置されます。例えば、CIDR ブロック 10.0.0.0/24 を持つ VPC を作成すると、DNS リゾルバーは 10.0.0.2 に配置されます。

19.    (オプション) sed コマンドを使用して、$domain-endpoint および $cognito_host 変数を割り当てます。

$ sudo sed -i 's/$domain-endpoint/vpc-mydashboards-111xxx.us-east1.es.amazonaws.com/' /etc/nginx/conf.d/default.conf
$ sudo sed -i 's/$cognito_host/mydomain.auth.us-east-1.amazoncognito.com/' /etc/nginx/conf.d/default.conf

注: /etc/nginx/conf.d/default.conf ファイルの $domain-endpoint および $cognito_host を置き換える必要はありません。

20.    NGINX を再起動します。

Amazon Linux AMI で起動されたインスタンスの場合、次のコマンドを使用します。

$ sudo service nginx restart

Amazon Linux 2 AMI で起動されたインスタンスの場合、次のコマンドを使用します。

$ sudo systemctl restart nginx.service

21.    ブラウザを使用して NGINX IP または DNS 名にアクセスします。Amazon Cognito ログイン ページにリダイレクトされます。

22.    Dashboards にログインするには、ユーザー名と一時パスワードを入力します。その後、プロンプトが表示されたらパスワードを変更し、再度ログインします。