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

最終更新日: 2020 年 5 月 26 日

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を使用することもできます。詳細については、「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 ID プール] を選択し、作成した ID プールを選択します。

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 Amazon Machine Image (AMI) で起動されたインスタンスの場合、次のコマンドを使用します。

$ sudo yum install nginx

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

$ sudo amazon-linux-extras install nginx1.12

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 エンドポイント詳細については、「ID プロバイダーの設定」を参照してください。

$cognito_host: ステップ 2 で設定された Amazon Cognito ユーザープールドメイン

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;
 
 
    location ^~ /_plugin/kibana {
        # Forward requests to Kibana
        proxy_pass https://$ES_endpoint/_plugin/kibana;
 
        # Handle redirects to Amazon Cognito
        proxy_redirect https://$cognito_host https://$host;
 
        # Update cookie domain and path
        proxy_cookie_domain $ES_endpoint $host;
 
        proxy_set_header Accept-Encoding "";
        sub_filter_types *;
        sub_filter $ES_endpoint $host;
        sub_filter_once off;
 
        # Response buffer settings
        proxy_buffer_size 128k;
        proxy_buffers 4 256k;
        proxy_busy_buffers_size 256k;
    }
 
    location ~ \/(log|sign|error|fav|forgot|change|confirm) {
        # Forward requests to Cognito
        proxy_pass https://$cognito_host;
 
        # Handle redirects to Kibana
        proxy_redirect https://$ES_endpoint https://$host;
 
        # Handle redirects to Amazon Cognito
        proxy_redirect https://$cognito_host https://$host;
 
        # Update cookie domain
        proxy_cookie_domain $cognito_host $host;
    }
}

注意: default.conf ファイルで直接置換する代わりに、sed コマンドを使用して、$ES_endpoint および $cognito_host を変数として割り当てることができます。

たとえば、次の設定ファイルでは、これらの値が使用されます。

Amazon ES エンドポイント: vpc-mykibana-111xxx.us-east1.es.amazonaws.com

Amazon Cognito ホスト: mydomain.auth.us-east-1.amazoncognito.com

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;
 
 
    location ^~ /_plugin/kibana {
        # Forward requests to Kibana
        proxy_pass https://vpc-mykibana-111xxx.us-east1.es.amazonaws.com/_plugin/kibana;
 
        # Handle redirects to Amazon Cognito
        proxy_redirect https://mydomain.auth.us-east-1.amazoncognito.com https://$host;
 
        # Update cookie domain and path
        proxy_cookie_domain vpc-mykibana-111xxx.us-east1.es.amazonaws.com $host;
 
        proxy_set_header Accept-Encoding "";
        sub_filter_types *;
        sub_filter vpc-mykibana-111xxx.us-east1.es.amazonaws.com $host;
        sub_filter_once off;
 
        # Response buffer settings
        proxy_buffer_size 128k;
        proxy_buffers 4 256k;
        proxy_busy_buffers_size 256k;
    }
 
    location ~ \/(log|sign|error|fav|forgot|change|confirm) {
        # Forward requests to Cognito
        proxy_pass https://mydomain.auth.us-east-1.amazoncognito.com;
 
        # Handle redirects to Kibana
        proxy_redirect https://vpc-mykibana-111xxx.us-east1.es.amazonaws.com https://$host;
 
        # Handle redirects to Amazon Cognito
        proxy_redirect https://mydomain.auth.us-east-1.amazoncognito.com https://$host;
 
        # Update cookie domain
        proxy_cookie_domain mydomain.auth.us-east-1.amazoncognito.com $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 にログインするには、ユーザー名と一時パスワードを入力します。次に、プロンプトが表示されたらパスワードを変更し、再度ログインします。