Como uso um proxy NGINX para acessar o OpenSearch Dashboards de fora de uma VPC que usa autenticação do Amazon Cognito?

Última atualização: 26/10/2021

Meu cluster do Amazon OpenSearch Service (sucessor do Amazon Elasticsearch Service) está em uma Virtual Private Cloud (VPC). Quero usar um proxy NGINX para acessar o OpenSearch Dashboards de fora de uma VPC com 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 o Amazon Cognito e OpenSearch Dashboards.

Você pode usar um túnel SSH ou cliente VPN para acessar o OpenSearch Dashboards de fora de uma VPC com autenticação do Amazon Cognito. Para obter mais informações, consulte Como posso usar um túnel SSH para acessar o OpenSearch Dashboards de fora de uma VPC com autenticação do Amazon Cognito. Para obter mais informações, consulte Como usar um túnel SSH para acessar o OpenSearch Dashboards de fora de uma VPC com autenticação do Amazon Cognito?

Observação: o OpenSearch Dashboards é o sucessor do Kibana.

Resolução

Importante: seu domínio do OpenSearch Services 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 Services para usar a autenticação do Amazon Cognito para OpenSearch Dashboards:
Para 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 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
ES-name: o nome do seu domínio do OpenSearch Services
region: a região em que o domínio do OpenSearch Service reside, com ous-east-1

12.    Inicie uma instância do EC2 em uma sub-rede pública da mesma VPC do seu domínio do OpenSearch Services. 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 Configuração do Amazon Route 53 para rotear 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 você estiver usando um ambiente de teste, gere um certificado autoassinado. Certificados autoassinados não são confiáveis para os navegadores e não devem ser usados em ambientes 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 o seu certificado SSL
/etc/nginx/cert.key: o caminho para a chave privada que você gerou para o certificado SSL
$domain-endpoint: seu endpoint do OpenSearch Services
$cognito_host: seu domínio de grupo de usuários do Amazon Cognito (que você configurou na Etapa 2)

Você pode usar o comando sed para atribuir $domain-endpoint e $cognito_host como variáveis, em vez de substituí-los 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.
server {
    listen 443;
    server_name $host;
    rewrite ^/$ https://$host/_dashboards 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 /_dashboards {
        # Forward requests to Dashboards
        proxy_pass https://$domain-endpoint/_dashboards;

        # Handle redirects to Cognito
        proxy_redirect https://$cognito_host 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) {
        # Forward requests to Cognito
        proxy_pass https://$cognito_host;

        # Handle redirects to Dashboards
        proxy_redirect https://$domain-endpoint https://$host;

        # Update cookie domain
        proxy_cookie_domain $cognito_host $host;
    }
}

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.

19.    (Opcional) Use o comando sed para atribuir as variáveis $domain-endpoint e $cognito_host:

$ sudo sed -i 's/$domain-endpoint/vpc-mydashboards-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

Observação: você não precisa substituir $domain-endpoint e $cognito_host no arquivo /etc/nginx/conf.d/default.conf.

20.    Reinicie o NGINX.

Para instâncias executadas com um Amazon Linux AMI, use este comando:

$ sudo service nginx restart

Para instâncias executadas com uma AMI do Amazon Linux 2, use este comando:

$ 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.