Amazon Cognito 인증을 사용하는 VPC 외부에서 NGINX 프록시를 사용하여 Kibana에 액세스하려면 어떻게 해야 하나요?

최종 업데이트 날짜: 2021년 6월 22일

Amazon Elasticsearch Service (Amazon ES) 클러스터가 Virtual Private Cloud(VPC)에 있습니다. Amazon Cognito 인증으로 VPC 외부에서 Kibana에 액세스하기 위해 NGINX 프록시를 사용하려고 합니다. 어떻게 해야 하나요?

간략한 설명

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

참고: Amazon Cognito 인증으로 VPC 외부에서 Kibana에 액세스하는 데 SSH 터널 또는 클라이언트 VPN을 사용할 수도 있습니다. 자세한 내용은 Amazon Cognito 인증으로 VPC 외부에서 Kibana에 액세스하기 위해 SSH 터널을 사용하려면 어떻게 해야 합니까?를 참조하세요.

해결 방법

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

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

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

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

4.    [Create user]를 선택한 다음 필드를 입력합니다. 이메일 주소를 입력하고 [Mark email as verified] 확인란을 선택했는지 확인합니다.

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.    Kibana에 대한 Amazon Cognito 인증에 사용할 Amazon ES 도메인을 구성합니다.
Cognito 사용자 풀(Cognito User Pool)에는 앞서 생성한 사용자 풀을 선택합니다.
[Cognito 자격 증명 풀(Cognito Identity Pool)]에는 앞서 생성한 자격 증명 풀을 선택합니다.
자세한 내용은 Get started with Amazon Elasticsearch Service: Use Amazon Cognito for Kibana 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:account-id:domain/ES-name/*"
    }
  ]
}

다음 값을 업데이트해야 합니다.
account-id: AWS 계정 ID
identity-name: Amazon Cognito 자격 증명 풀 이름
ES-name: Amazon ES 도메인 이름
region: us-east-1과 같이 Amazon ES 도메인이 위치한 리전

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

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을 구성합니다.

참고: 테스트 환경을 사용하는 경우 자체 서명된 인증서를 대신 생성합니다. 자체 서명된 인증서는 브라우저에서 신뢰하지 않으며 프로덕션 환경에서 사용해서는 안 됩니다.

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 사용자 풀 도메인

sed 명령을 사용하여 $ES_endpoint$cognito_host를 변수로 할당할 수 있습니다. 즉, 이러한 값을 default.conf 파일에서 직접 바꾸지 않아도 됩니다. 또한 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에 로그인하려면 사용자 이름과 임시 암호를 입력합니다. 그런 다음, 메시지가 표시되면 암호를 변경하고 다시 로그인합니다.