Amazon Cognito 인증을 사용하는 VPC 외부에서 NGINX 프록시를 사용하여 OpenSearch 대시보드에 액세스하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2022년 09월 16일

내 Amazon OpenSearch Service 클러스터는 Virtual Private Cloud(VPC)에서 실행됩니다. Amazon Cognito 인증으로 VPC 외부에서 OpenSearch 대시보드에 액세스하기 위해 NGINX 프록시를 사용하려고 합니다. 어떻게 해야 합니까?

간략한 설명

NGINX를 사용하여 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스를 프록시 서버로 구성합니다. 그런 다음 프록시 서버는 Amazon Cognito 및 OpenSearch 대시보드에 브라우저 요청을 전달합니다.

참고: 이 솔루션은 네이티브 Amazon Cognito 사용자에게만 적용됩니다.

Amazon Cognito 인증으로 VPC 외부에서 OpenSearch 대시보드에 액세스하는 데 SSH 터널 또는 Client VPN을 사용할 수도 있습니다. 자세한 내용은 Amazon Cognito 인증으로 VPC 외부에서 OpenSearch 대시보드에 액세스하려면 어떻게 해야 합니까?를 참조하세요.

참고: OpenSearch Dashboards는 Kibana의 후속입니다.

해결 방법

중요: VPC에서 사용자 액세스를 제한하면 OpenSearch Service 도메인이 더욱 안전해집니다. 계속하기 전에, 이 절차가 조직의 보안 요구 사항을 위반하지 않는지 확인하십시오.

1.    Amazon Cognito 사용자 풀을 생성합니다.

2.    호스팅된 사용자 풀 도메인을 구성합니다.

3.    Amazon Cognito 콘솔 탐색 창에서 [Users and groups]를 선택합니다.

4.    사용자 생성을 선택한 다음 필드를 입력합니다. 이메일 주소를 입력하고 확인된 것으로 표시 확인란을 선택했는지 확인합니다.

5.    [Groups] 탭을 선택한 후 [Create group]을 선택합니다. 우선순위(Precedence)0을 입력합니다. 자세한 내용은 AWS Management Console에서 새 그룹 생성을 참조하세요.

6.    Amazon Cognito 콘솔을 다시 엽니다.

7.    [Manage Identity Pools]를 선택한 후 [Create new identity pool]을 선택합니다.

8.    자격 증명 풀의 이름을 입력하고 [Enable access to unauthenticated identities] 확인란을 선택한 후 [Create Pool]을 선택합니다.

9.    AWS 리소스에 대한 액세스 메시지가 표시되면 [허용]을 선택하여 자격 증명 풀과 연결된 기본 역할 2개를 생성합니다. 인증되지 않은 사용자에 대해 기본 역할 하나를 생성한 다음 인증된 사용자에 대해 다른 기본 역할을 생성합니다.

10.    OpenSearch 대시보드에 대한 Amazon Cognito 인증을 사용하도록 OpenSearch Service 도메인을 구성: Cognito 사용자 풀의 경우 생성한 사용자 풀을 선택합니다. 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 자격 증명 풀 이름
domain-name: OpenSearch Service 도메인의 이름
region: OpenSearch Service 도메인이 상주하는 리전(예: us-east-1)

참고: 이 예시의 설정은 Amazon Linux 2 AMI에 적용됩니다. 다른 AMI를 사용하는 경우 특정 설정을 조정해야 할 수 있습니다.

12.    OpenSearch Service 도메인이 있는 동일한 VPC의 퍼블릭 서브넷에서 EC2 인스턴스를 시작합니다. 인스턴스가 도메인과 동일한 보안 그룹을 사용하는지 확인합니다.

13.    (선택 사항) 테스트 환경을 사용하지 않는 경우 탄력적 IP 주소를 할당하여 앞서 생성한 인스턴스와 연결합니다. 탄력적 IP 주소 할당에 대한 자세한 내용은 탄력적 IP 주소 작업을 참조하세요.

14.    (선택 사항) 테스트 환경을 사용하지 않는 경우 DNS를 구성하여 탄력적 IP 주소에 대한 요청을 해결합니다. Amazon Route 53를 통해 요청을 해결하는 방법에 대한 자세한 내용은 Amazon Route 53를 Amazon EC2 Instance로 트래픽을 라우팅하도록 구성을 참조하세요.

15.    인스턴스에 연결한 다음 NGINX를 설치합니다.

Amazon Linux 2 AMI를 사용하여 시작한 인스턴스의 경우 다음 명령을 사용합니다.

$ sudo amazon-linux-extras install nginx1

16.    CA(인증 기관)에서 SSL 인증서를 획득하여 NGINX에 대한 SSL을 구성합니다.

참고: 테스트 환경을 사용하는 경우 자체 서명된 인증서를 대신 생성합니다. 프로덕션 환경에서는 타사 인증 기관에서 서명한 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 인증서를 생성한 프라이빗 키 경로 my_domain_host: OpenSearch Services 엔드포인트 my_cognito_host: Amazon Cognito 사용자 풀 도메인 (단계 2에서 생성)

sed 명령을 사용하여 my_cognito_hostmy_domain_host를 변수로 할당할 수 있습니다. 즉, 이러한 값을 default.conf 파일에서 직접 바꾸지 않아도 됩니다. 또한 HTTPS를 사용해야 합니다. 그러지 않으면 오류가 발생할 수 있습니다.

이 예제에서는 다음 사항에 유의해야 합니다.

  • Amazon OpenSearch Service 도메인이 OpenSearch Service 버전 1.0 이상을 실행하면 _dashboards 엔드포인트를 사용합니다.
  • Amazon OpenSearch Service 도메인이 Elasticsearch versions 5.x~7.x를 실행하면 _plugin/kibana 엔드포인트를 사용합니다.

중요: resolver 파라미터는 VPC 설정에 따라 변경됩니다. DNS 해석기는 기본 CIDR 블록의 기준 IP에 2를 더한 위치에 있습니다. 예를 들어 CIDR 블록이 10.0.0.0/24인 VPC를 생성하는 경우 DNS 해석기는 10.0.0.2에 위치합니다.

server {
 listen 443;
 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;
 }
}

19.    (선택 사항) sed 명령을 사용하여 my_domain_hostmy_cognito_host 변수를 할당합니다.

sudo sed -i 's/my_domain_host/vpc-cognito-private-xxxxxxxxxx.us-east-1.es.amazonaws.com/' /etc/nginx/conf.d/default.conf
sudo sed -i 's/my_cognito_host/dean-kumo-xxxxxxx.auth.us-east-1.amazoncognito.com/' /etc/nginx/conf.d/default.conf

참고: my_domain_hostmy_cognito_host/etc/nginx/conf.d/default.conf 파일에서 바꿀 필요가 없습니다.

20.    NGINX를 다시 시작하려면 이 명령을 사용하십시오.

$ sudo systemctl restart nginx.service

21.    브라우저를 사용하여 NGINX IP 또는 DNS 이름에 액세스합니다. Amazon Cognito 로그인 페이지로 리디렉션됩니다.

22.    대시보드에 로그인하려면 사용자 이름과 임시 암호를 입력합니다. 그런 다음, 메시지가 표시되면 암호를 변경하고 다시 로그인합니다.