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

최종 업데이트 날짜: 2020년 5월 26일

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에 액세스하려면 어떻게 해야 합니까?를 참조하십시오.

해결 방법

중요: 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 자격 증명 풀]에는 생성한 자격 증명 풀을 선택합니다.

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

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

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

15.    인스턴스에 연결하고 NGINX를 설치합니다.

Amazon Linux Amazon 머신 이미지(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 엔드포인트. 자세한 내용은 자격 증명 공급자 구성을 참조하십시오.

$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에 로그인하려면 사용자 이름과 임시 암호를 입력합니다. 그런 다음, 메시지가 표시되면 암호를 변경하고 다시 로그인합니다.