Como faço para usar um proxy NGINX para acessar os painéis do OpenSearch de fora de uma VPC que está usando a autenticação do Amazon Cognito?

Data da última atualização: 16/09/2022

Meu cluster do Amazon OpenSearch Service está em uma nuvem privada virtual (VPC). Quero usar um proxy NGINX para acessar o OpenSearch Dashboards de fora de uma VPC com a autenticação do Amazon Cognito. Como posso fazer isso?

Breve descrição

Use o NGINX para configurar uma instância do Amazon Elastic Compute Cloud (Amazon EC2) como um servidor proxy. O servidor proxy então encaminha as solicitações do navegador para os Amazon Cognito e OpenSearch Dashboards.

Observação: esta solução funciona somente para usuários nativos do Amazon Cognito.

É possível usar um túnel SSH ou cliente VPN para acessar o OpenSearch Dashboards de fora de uma VPC com a autenticação do Amazon Cognito. Para obter mais informações, consulte Como acessar o OpenSearch Dashboards de fora de uma VPC usando a autenticação do Amazon Cognito?

Resolução

Importante: seu domínio do OpenSearch Service fica mais seguro quando você restringe o acesso a usuários na VPC. Antes de continuar, verifique se esse procedimento não viola os requisitos de segurança da sua organização.

1.    Crie um grupo de usuários do Amazon Cognito.

2.    Configure um domínio de grupo de usuários hospedado.

3.    No painel de navegação do console do Amazon Cognito, escolha Users and groups (Usuários e grupos).

4.    Escolha Create user (Criar usuário) e, em seguida, preencha os campos. Certifique-se de inserir um endereço de e-mail e marcar a caixa de seleção Mark email as verified (Marcar e-mail como verificado).

5.    Escolha a guia Groups (Grupos) e, em seguida, escolha Create group (Criar grupo). Em Precedence (Precedência), insira 0. Para obter mais informações, consulte Criação de um novo grupo no Console de Gerenciamento da AWS.

6.    Abra o console do Amazon Cognito novamente.

7.    Escolha Manage Identity Pools (Gerenciar grupos de identidades) e, em seguida, escolha Create new identity pool (Criar novo grupo de identidades).

8.    Insira um nome para o grupo de identidades, marque a caixa de seleção Enable access to unauthenticated identities (Habilitar acesso a identidades não autenticadas) e escolha Create Pool (Criar Pool).

9.    Quando você for solicitado a acessar seus recursos da AWS, escolha Allow (Permitir) para criar as duas funções padrão associadas ao seu grupo de identidades. Crie uma função padrão para usuários não autenticados e crie a outra função padrão para usuários autenticados.

10.    Configure seu domínio do OpenSearch Service para usar a autenticação do Amazon Cognito para OpenSearch Dashboards: Para o Cognito User Pool (Grupo de usuários do Cognito), escolha o grupo de usuários que você criou. Para Cognito Identity Pool (Grupo de identidades do Cognito), escolha o grupo de identidades que você criou. Para obter mais informações, consulte Get started with Amazon Elasticsearch Service: Use Amazon Cognito for Kibana access control (Introdução ao Amazon OpenSearch Service: usar o controle de acesso do Amazon Cognito para OpenSearch Dashboards).

11.    Configure sua política de acesso para que ela seja uma política baseada em recursos, como a seguinte:

{
     "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/*"
     }]
}

Você deve atualizar esses valores:
account-id: seu ID da conta da AWS
identity-name: o nome do grupo de identidades do Amazon Cognito
domain-name: o nome do domínio do OpenSearch Service
region: a região em que o domínio do OpenSearch Service reside, como us-east-1

Observação: as configurações neste exemplo se aplicam à AMI do Amazon Linux 2. Se você estiver usando uma AMI diferente, talvez seja necessário ajustar suas configurações específicas.

12.    Inicie uma instância do EC2 em uma sub-rede pública da mesma VPC do seu domínio do OpenSearch Service. Verifique se a instância usa o mesmo grupo de segurança que o seu domínio.

13.    (Opcional) Se você não estiver usando um ambiente de teste, aloque um endereço IP elástico para associar à instância que você criou. Para obter mais informações sobre a alocação de endereços IP elásticos, consulte Trabalhar com endereços IP elásticos.

14.    (Opcional) Se você não estiver usando um ambiente de teste, configure o DNS para resolver solicitações para o endereço IP elástico. Para obter mais informações sobre como resolver solicitações com o Amazon Route 53, consulte Como configurar o Amazon Route 53 para encaminhar o tráfego para uma instância do Amazon EC2.

15.    Conecte-se à sua instância e instale o NGINX.

Para instâncias iniciadas com uma AMI do Amazon Linux 2, use o seguinte comando:

$ sudo amazon-linux-extras install nginx1

16.    Obtenha um certificado SSL de uma autoridade de certificação (CA) para configurar o SSL para NGINX.

Observação: se estiver usando um ambiente de teste, gere um certificado autoassinado. Observe que é prática recomendada usar apenas certificados SSL assinados por uma autoridade de certificação terceirizada em seu ambiente de produção.

17.    (Opcional) Se você estiver usando um ambiente de teste com um certificado autoassinado, use o comando OpenSSL x509 para gerar uma chave privada:

$ sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/cert.key -out /etc/nginx/cert.crt

Essa sintaxe de comando gera cert.key, uma chave privada para o certificado SSL autoassinado.

18.    Navegue até o diretório /etc/nginx/conf.d e crie um arquivo chamado default.conf. Modifique o arquivo com os seguintes valores:/etc/nginx/cert.crt: o caminho para seu certificado SSL /etc/nginx/cert.key: o caminho para a chave privada que você gerou para o certificado SSL my_domain_host: o endpoint do OpenSearch Service my_cognito_host: o domínio do grupo de usuários do Amazon Cognito (que você configurou na Etapa 2).

Você pode usar o comando sed para atribuir my_cognito_host e my_domain_host como variáveis, em vez de substituí-las diretamente no arquivo default.conf. Além disso, certifique-se de usar HTTPS, ou você pode encontrar um erro.

Neste exemplo, esteja ciente do seguinte:

  • Se o seu domínio do Amazon OpenSearch Service estiver executando o OpenSearch Service versão 1.0+, use o endpoint _dashboards.
  • Se o seu domínio do Amazon OpenSearch Service estiver executando o Elasticsearch versões 5.x-7.x, use o endpoint _plugin/kibana.

Importante: o parâmetro resolvedor muda de acordo com as configurações da VPC. O resolvedor de DNS está localizado no IP base do bloco CIDR primário mais dois. Por exemplo, se você criar uma VPC com o bloco CIDR 10.0.0.0/24, o resolvedor de DNS estará localizado em 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.    (Opcional) Use o comando sed para atribuir as variáveis my_domain_host e my_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

Observação: você não precisa substituir my_domain_host e my_cognito_host no arquivo /etc/nginx/conf.d/default.conf.

20.    Use este comando para reiniciar o NGINX.

$ sudo systemctl restart nginx.service

21.    Use seu navegador para acessar o IP NGINX ou o nome DNS. Você é redirecionado para a página de login do Amazon Cognito.

22.    Para fazer login no Dashboards, insira seu nome de usuário e senha temporária. Em seguida, altere sua senha quando solicitado e faça login novamente.