NGINX プロキシを使用して、Amazon Cognito 認証を使用している VPC の外部から Kibana にアクセスする方法を教えてください。

最終更新日: 2021 年 6 月 22 日

Amazon Elasticsearch Service (Amazon ES) クラスターが Virtual Private Cloud (VPC) にあります。NGINX プロキシを使用して Amazon Cognito 認証で VPC 外部から Kibana にアクセスする必要があります。これを行うにはどうすればよいですか?

簡単な説明

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

: Amazon Cognito 認証で VPC の外部から Kibana にアクセスするために、SSH トンネルまたはクライアント VPNを使用することもできます。詳細については、「SSH トンネルを使用して Amazon Cognito 認証で VPC の外部から Kibana にアクセスするにはどうすればよいですか?」をご参照ください。

解決方法

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

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.    Kibana に対して Amazon Cognito 認証を使用して Amazon ES ドメインを設定します。
[Cognito ユーザープール] で、作成したユーザープールを選択します。
[Cognito Identity Pool] (Cognito ID プール) を選択し、作成した ID プールを選択します。
詳細については、「Amazon Elasticsearch Service の開始方法: Kibana のアクセスコントロールに Amazon Cognito を使用する」をご参照ください。

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:account-id:domain/ES-name/*"
    }
  ]
}

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

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

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 証明書に対して生成されたプライベートキーへのパス
$ES_endpoint: Amazon ES エンドポイント
$cognito_host: (ステップ 2 で設定した) Amazon Cognito ユーザープールドメイン

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

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

resolver 10.0.0.2 ipv6=off;

server {
    listen 443;
    server_name $host;
    rewrite ^/$ https://$host/_plugin/kibana  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;

    set $es_endpoint $ES_endpoint;
    set $cognito_endpoint $cognito_host;

    location ^~ /_plugin/kibana {
        # Forward requests to Kibana
        proxy_pass https://$es_endpoint; 

        # Handle redirects to Amazon Cognito
        proxy_redirect https://$cognito_endpoint  https://$host; 

        # Update cookie domain and path
        proxy_cookie_domain $es_endpoint $host;

        # Response buffer settings
        proxy_buffer_size 128k;
        proxy_buffers 4 256k;
        proxy_busy_buffers_size 256k;
    }

    location ~ \/(log|sign|error|fav|forgot|change|confirm|mfa) {
        # Forward requests to Cognito
        proxy_pass https://$cognito_endpoint; 

        # Handle redirects to Kibana
        proxy_redirect https://$es_endpoint  https://$host; 

        # Handle redirects to Amazon Cognito
        proxy_redirect https://$cognito_endpoint  https://$host; 

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

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

$ sudo sed -i 's/$ES_endpoint/vpc-mykibana-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 ファイルの $ES_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.    Kibana にログインするには、ユーザー名と一時パスワードを入力します。次に、プロンプトが表示されたらパスワードを変更し、再度ログインします。