O blog da AWS

Conecte-se com segurança ao Amazon RDS para PostgreSQL com o AWS Session Manager e a autenticação IAM

Por Adria Morgado e Alan Oberto Jimenez
As políticas das empresas geralmente não permitem que instâncias de banco de dados tenham um endpoint público, a menos que haja um requisito comercial específico. Embora isso proteja esses recursos do acesso público pela Internet, também limita a forma como os usuários podem se conectar a eles a partir de seus computadores.

Frequentemente, administradores de banco de dados e equipes de desenvolvimento tentam superar essa restrição usando um bastion host que pode receber solicitações pela Internet e encaminhá-las com segurança para um banco de dados hospedado em sub-redes privadas.

No entanto, essa abordagem tem duas grandes desvantagens:

  • Aumenta a superfície de ataque potencial para atividades maliciosas quando um servidor é exposto à Internet pública
  • Introduz a necessidade de armazenar e manter chaves SSH

Além disso, os usuários do banco de dados também precisam arcar com o ônus de gerenciar nomes de usuário e senhas para autenticação do banco de dados, o que também aumenta a exposição ao risco de segurança.

Neste post, mostramos uma solução que oferece várias vantagens em relação aos métodos tradicionais de conexão de banco de dados, trazendo também segurança aprimorada e gerenciamento simplificado de rede e acesso.
Descreveremos as etapas necessárias para se conectar da sua máquina local à sua instância do Amazon Relational Database Service (Amazon RDS) usando o Session Manager com encaminhamento de portas para um host remoto, um recurso do AWS Systems Manager, e autenticação via AWS Identity and Access Management (IAM).

Pré-requisitos

Para esta postagem, usamos uma janela de terminal para iniciar as sessões remotas.

Você deve ter as seguintes ferramentas e serviços:

  • A interface de linha de comando da AWS (AWS CLI)
  • Acesso ao AWS Management Console
  • O plug-in Session Manager instalado localmente em seu desktop ou laptop
  • Dependendo do mecanismo de banco de dados escolhido, você precisa de um dos seguintes clientes: MySQL (para MySQL e MariaDB) ou psql (PostgreSQL)
  • Um usuário do IAM com acesso programático à sua conta da AWS
  • Uma VPC existente via Amazon Virtual Private Cloud (Amazon VPC) com sub-redes privadas
  • Uma instância de RDS e um grupo de segurança de banco de dados existentes (nesta publicação, usamos o Amazon RDS para PostgreSQL, mas a solução também funciona para os outros bancos de dados RDS)
  • Acesso ao Systems Manager
  • Endpoints de VPC configurados para as chamadas de API do Systems Manager (para obter mais informações, consulte Criar endpoints de VPC).

Benefícios do uso do IAM Database Authentication e do Session Manager

Ao aproveitar a autenticação de banco de dados do IAM, os usuários finais podem se conectar ao seu banco de dados usando entidades do IAM, em vez de credenciais de banco de dados separadas. Isso significa que você pode gerenciar o acesso aos seus recursos do Amazon RDS usando políticas do IAM e conceder ou revogar permissões para usuários ou grupos específicos conforme necessário, sem precisar modificar contas de usuário ou senhas no nível do banco de dados. Essa flexibilidade é especialmente valiosa em ambientes dinâmicos em que os requisitos de acesso mudam com frequência.

Com o Session Manager, um serviço totalmente gerenciado da AWS que ajuda a fornecer gerenciamento de instâncias sem a necessidade de abrir nenhuma porta de entrada, você pode estabelecer uma conexão segura com sua instância do RDS sem expô-la diretamente à Internet pública.
O Session Manager com encaminhamento de portas permite que você crie uma conexão segura, criptografando o tráfego entre sua máquina local e a instância do RDS. Isso reduz a superfície de ataque do seu banco de dados e ajuda a impedir o acesso não autorizado a ele.

Outra vantagem de usar a autenticação IAM e o Session Manager é o gerenciamento centralizado e a auditabilidade que ele oferece. A autenticação do IAM permite que você tenha um sistema central de gerenciamento de usuários ou funções do IAM, permitindo gerenciar e auditar facilmente o acesso do usuário aos seus bancos de dados do RDS. Você pode rastrear por quem e quando o banco de dados foi acessado e quais ações foram executadas.

O Session Manager também oferece a capacidade de auditar a atividade da sessão em sua conta da AWS.

Essa abordagem centralizada aprimora a segurança e simplifica os requisitos de conformidade.

Como se conectar à sua instância do RDS com o Session Manager

Como melhor prática de segurança no nível da rede, recomendamos iniciar suas instâncias do RDS em sub-redes privadas e permitir o acesso somente dos aplicativos dentro da mesma VPC ou de uma VPC diferente.

Para permitir o acesso do usuário a esses recursos restritos, é necessário ter um bastion host por meio do qual os usuários se conectem para acessar o banco de dados. No entanto, conceder acesso a esses bastion hosts às vezes exige expô-los diretamente à Internet, pois eles precisam ser colocados em uma sub-rede pública ou em topologias de rede complexas para que o tráfego possa ser roteado localmente, usando serviços como o AWS Direct Connect ou uma VPN.

O Session Manager com encaminhamento remoto de portas elimina a necessidade de uma conexão direta com o Bastion Host ou com o banco de dados, mantendo os aspectos de segurança intactos.
O diagrama a seguir explica os componentes envolvidos na arquitetura e as etapas necessárias para estabelecer a conexão.

Os diferentes estágios do fluxo de trabalho são os seguintes:

  1. Inicie uma sessão do Session Manager em uma das instâncias gerenciadas do Systems Manager do Amazon Elastic Compute Cloud (Amazon EC2) usando o documento AWS-StartPortForwardingSessiontoRemoteHost Systems Manager e as credenciais da AWS de propriedade do usuário.
  2. O agente SSM em execução nas instâncias gerenciadas do SSM processa a solicitação do usuário do Systems Manager. Essa comunicação é possível por meio dos endpoints SSM VPC configurados para essa finalidade.
  3. O encaminhamento de portas está estabelecido e o usuário agora pode abrir um novo terminal e enviar qualquer comando ao host remoto por meio do túnel estabelecido.
  4. O usuário chama o Amazon RDS para obter o token de autenticação usando suas credenciais do IAM.
  5. O usuário se conecta ao banco de dados por meio do túnel usando o token de autenticação do banco de dados gerado pelo Amazon RDS.

Configuração inicial

Nesta seção, orientaremos você nas etapas iniciais de configuração.

Crie o grupo de segurança para a instância do EC2

Para criar seu grupo de segurança, conclua as seguintes etapas:

  1. No console do Amazon EC2, escolha Grupos de segurança no painel de navegação.
  2. Escolha Criar grupo de segurança.
  3. Insira um nome e uma descrição para seu grupo de segurança.
  4. Para VPC, insira sua VPC.

5. Na seção Regras de saída, permita o acesso à porta PostgreSQL (5432).

6. Para que a instância do EC2 se comunique com as interfaces de endpoint SSM VPC, também é necessário ativar o tráfego de saída da porta 443 (HTTPS).
Em ambas as regras, adicione como destino seu intervalo CIDR da VPC.

7. Escolha Criar grupo de segurança.

Crie a função do IAM para a instância do EC2

Agora, criamos a role do IAM para a instância do EC2:

    1. No console do IAM, escolha Funções no painel de navegação.
    2. Escolha Criar perfil.
    3. Selecione o serviço da AWS para o tipo de entidade confiável.
    4. Escolha EC2 para caso de uso.
    5. Escolha Próximo.

6. Na seção Adicionar permissões, selecione a política AmazonSSMManagedInstanceCore.

7. Escolha Próximo.

8. Insira um nome para a função, uma breve descrição e, se necessário, adicione as suas tags. Neste post, usaremos ec2-RDS-AccessRole como nome de função.

9. Escolha Criar perfil.

Crie a instância do EC2 (bastion host)

Para provisionar sua instância do EC2, conclua as seguintes etapas:

  1. No console do Amazon EC2, escolha Executar instância no painel de navegação.
  2. Insira um nome e as tags necessárias para sua instância do EC2.
  3. Escolha o Amazon Linux AMI mais recente.
  4. Escolha um tipo de instância (por exemplo, uma classe de instância t3.micro).
  5. Escolha Prosseguir sem um par de chaves.

Como estamos usando o Session Manager para lidar com a conexão, não precisamos criar ou usar um par de chaves existente.

  1. Para Configurações de rede, escolha uma das sub-redes privadas configuradas na sua Amazon Virtual Private Cloud (VPC).
  2. Para Atribuir IP público automaticamente, escolha Desabilitar.
  3. Para grupos de segurança, escolha o grupo de segurança que você criou.
  4. Na seção Detalhes avançados, para o perfil de instância do IAM, escolha o perfil do IAM criada anteriormente, ec2-RDS-AccessRole.

10. Prossiga agora com a criação da sua instância escolhendo Executar instância.

Se tudo tiver sido bem-sucedido e todos os requisitos forem atendidos, a instância recém-lançada aparecerá em Instâncias gerenciadas (Fleet Manager) e estará pronta para ser usada com o Systems Manager.

Autenticação de banco de dados IAM

Para configurar a autenticação do banco de dados IAM em seu banco de dados RDS para PostgreSQL usando funções do IAM, siga estas etapas:

  1. Ative a autenticação de banco de dados IAM na instância do RDS para PostgreSQL.
  2. Crie uma conta de usuário do banco de dados usada para se conectar à instância de banco de dados com a autenticação via Certifique-se de que o usuário do banco de dados (no exemplo, db_user) receba a role rds_iam conforme mostrado no código a seguir:

CREATE USER db_user;
GRANT rds_iam TO db_user;

Observe que, para fins de auditoria, cada usuário humano ou identidade de máquina ainda precisará de seu próprio usuário/função do banco de dados.

Para obter mais informações, consulte Criação de uma conta de banco de dados usando a autenticação IAM.

Agora você cria uma política do IAM para mapear o usuário do banco de dados criado para um usuário ou função do IAM.

  1. No console do IAM, no painel de navegação esquerdo, escolha Políticas.
  2. Escolha Criar política.
  3. No editor de políticas, na guia JSON, insira o seguinte documento JSON:

{
   "Version": "2012-10-17",
   "Statement": [
      {
         "Effect": "Allow",
         "Action": [
             "rds-db:connect"
         ],
         "Resource": [
             "arn:aws:rds-db:<region>:<account-id>:dbuser:<DBInstanceResourceID>/<DatabaseUser>"
         ]
      }
   ]
}

Certifique-se de substituir os seguintes elementos adequadamente:

  • region – A Região da AWS para a instância de banco de dados.
  • account-id – O número da conta da AWS para a instância de banco de dados.
  • DBInstanceResourceID – O identificador da instância de banco de dados. Para encontrar o ID do recurso da instância de banco de dados no console do Amazon RDS, escolha a instância de banco de dados para ver seus detalhes. Em seguida, escolha a guia Configuração e o ID do recurso será mostrado na seção Configuração.
  • DatabaseUser – A conta de usuário do banco de dados criada para se conectar à instância de banco de dados usando a autenticação via Em nosso exemplo, usamos db_user.
  1. Escolha Próximo e insira um nome para a política, por exemplo, rds-db-iam.
  2. Opcionalmente, você pode inserir uma descrição.
  3. Escolha Criar política.
  4. Escolha o nome do usuário ou função do IAM ao qual você gostaria de anexar a política.
  5. Selecione Adicionar permissões e, em seguida, Anexar políticas existentes diretamente.
  6. Pesquise a política do IAM que acabou de ser criada e selecione a política.
  7. Escolha Avançar: Revisar.
  8. Verifique se a política está correta e escolha Adicionar permissões.
  9. Gere um token de autenticação do IAM usando a AWS CLI:

aws rds generate-db-auth-token \
   --hostname <rds_hostname> \
   --port 5432 \
   --region <region> \
   --username db_user

Os parâmetros para gerar o token de autenticação do banco de dados são os seguintes:

  • rds_hostname – O nome do host da instância de banco de dados que você deseja acessar (por exemplo, rdspostgres.123456789012.eu-central-1.rds.amazonaws.com).
  • port – O número da porta usada para se conectar à sua instância de banco de dados (em nosso exemplo, 5432 é usado como padrão para o PostgreSQL).
  • region – A Região da AWS para a instância de banco de dados.
  • database_user – A conta de usuário do banco de dados criada para se conectar à instância de banco de dados usando a autenticação do banco de dados IAM. Em nosso exemplo, usamos db_user.

Como o token de autenticação consiste em várias centenas de caracteres, é recomendável salvá-lo em uma variável de ambiente e usar essa variável posteriormente ao se conectar ao banco de dados.

O exemplo a seguir mostra como gerar um token de autenticação de banco de dados para o usuário do banco de dados db_user e armazená-lo em uma variável de ambiente PGPASSWORD. A variável PGPASSWORD se comportará da mesma forma que o parâmetro de conexão da senha.

export RDSHOST="rdspostgres.123456789012.eu-central-1.rds.amazonaws.com"
export PGPASSWORD="$(aws rds generate-db-auth-token --hostname $RDSHOST --port 5432 --region eu-central-1 --username db_user)"

Depois de gerar um token de autenticação, ele é válido por 15 minutos antes de expirar. Se você tentar se conectar ao seu banco de dados usando um token expirado, a solicitação de conexão será negada. Observe que o token de autenticação do banco de dados só é necessário para estabelecer a conexão com seu banco de dados e não determina, em nenhum caso, quanto tempo a conexão existente pode durar.

Crie uma sessão remota de encaminhamento de portas

Nesta seção, criamos uma sessão de encaminhamento de portas do Systems Manager para um host remoto usando o Systems Manager e nos conectamos à instância do RDS for PostgreSQL.

  1. Abra um terminal em seu computador e certifique-se de que suas credenciais da AWS sejam válidas e que você possa acessar sua conta da AWS.
  2. Atualize seu arquivo /etc/hosts para resolver seu $RDSHOST para 127.0.0.1.

echo "127.0.0.1 $RDSHOST" >> /etc/hosts

Observe que com essa alteração em seu arquivo /etc/hosts e a solução descrita, você poderá se conectar à sua instância de banco de dados somente a partir do seu computador local.

  1. Crie uma sessão remota do Session Manager de encaminhamento de portas para o banco de dados do RDS usando a instância EC2 (bastion host) criada

No exemplo a seguir, reutilizamos a variável de ambiente RDSHOST criada na seção anterior. O LocalPortNumber representa a porta local no cliente para a qual o tráfego deve ser redirecionado, como 1053:

aws ssm start-session \
   --region <your region> \
   --target <your EC2 instance> \ 
   --document-name AWS-StartPortForwardingSessionToRemoteHost \
   --parameters '{"host":["'"$RDSHOST"'"],"portNumber"=["5432"],"localPortNumber"=["1053"]}'

Você deve ver algo semelhante ao código a seguir:

Starting session with SessionId: mySessionID-1234abcdefghi5678
Port 1053 opened for sessionId mySessionID-1234abcdefghi5678
Waiting for connections...

Mantenha esse terminal aberto.

Conecte-se à sua instância de banco de dados RDS para PostgreSQL com autenticação IAM

Para se conectar à sua instância de banco de dados do RDS para PostgreSQL por meio da sessão de encaminhamento de portas criada na seção anterior, você deve ter a ferramenta de linha de comando psql instalada em seu computador.

Além disso, quando você se conecta à sua instância de banco de dados PostgreSQL por SSL, é necessário baixar um certificado SSL. Consulte Como usar SSL/TLS para criptografar uma conexão com uma instância de banco de dados para obter mais detalhes.

Depois que o certificado for baixado para o seu computador, você poderá referenciá-lo usando o parâmetro sslrootcert da sua ferramenta de linha de comando psql.

Agora você pode se conectar à sua instância de banco de dados PostgreSQL usando TLS com psql seguindo estas etapas:

  1. Abra um novo terminal em seu computador e certifique-se de que suas credenciais da AWS sejam válidas e que você possa acessar sua conta da AWS.
  2. Conecte-se agora à sua instância de banco de dados PostgreSQL por SSL executando o seguinte comando:

psql --host $RDSHOST \
   --port 1053 \
   "sslmode=verify-full sslrootcert=<ssl certificate file> dbname=<db name> user=db_user"

Os parâmetros para estabelecer a conexão são:

  • host – O nome do host da instância de banco de dados que você deseja acessar. Neste exemplo, usamos a variável de ambiente RDSHOST definida acima.
  • port – A mesma porta local usada no comando SSM start-session, por exemplo, 1053.
  • sslmode – O modo SSL/TLS a ser usado. Ao usar sslmode=verify-full, o cliente PostgreSQL verifica se o nome no certificado TLS do servidor corresponde ao valor do host da instância de banco de dados.
  • sslrootcert – O caminho completo para o certificado TLS que contém a chave pública.
  • dbname – O nome do banco de dados que você deseja acessar.
  • user – A conta de usuário do banco de dados criada para se conectar à instância de banco de dados usando a autenticação IAM. Esse é o mesmo usuário mencionado na seção de recursos da política do IAM criada anteriormente, que mapeia o usuário do banco de dados para um usuário ou função do IAM. Em nosso exemplo, ele se chama db_user.

Observe que, se a verificação do certificado TLS estiver ativada, o certificado TLS incluirá o endpoint da instância de banco de dados como o nome comum (CN) do certificado TLS para proteção contra ataques de falsificação. Esse é o motivo pelo qual, ao se conectar à sua ferramenta de linha de comando psql por meio da sessão de encaminhamento de portas, você precisa usar o endpoint da instância de banco de dados RDS como host, em vez de localhost, caso contrário, a verificação SSL falhará.

psql: error: connection to server at "localhost" (::1), port 1053 failed: Connection refused
    Is the server running on that host and accepting TCP/IP connections?
connection to server at "localhost" (127.0.0.1), port 1053 failed: server certificate for "rdspostgres.123456789012.eu-central-1.rds.amazonaws.com" does not match host name "localhost"

Se a conexão com sua instância de banco de dados PostgreSQL usando a autenticação IAM tiver sido bem-sucedida, você deverá ver o seguinte aviso:

psql (14.7 (Homebrew), server 14.6)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.

postgres=>

Limpe recursos desnecessários

Para evitar cobranças indesejadas em sua conta da AWS, certifique-se de excluir todas as instâncias do EC2 que você criou ao longo deste post. Além disso, remova o grupo de segurança da instância do EC2 e a função do IAM criados durante as etapas iniciais de configuração.

Para encerrar uma instância (console)

  1. Abra o console do Amazon EC2 em https://console.aws.amazon.com/ec2/.
  2. No painel de navegação, escolha Instâncias.
  3. Marque a caixa de seleção da sua instância gerenciada por SSM.
  4. Escolha Estado da instância e, em seguida, Encerrar instância.
  5. Escolha Encerrar para confirmar a exclusão.

Para excluir um grupo de segurança (console)

  1. Abra o console do Amazon EC2 em https://console.aws.amazon.com/ec2/.
  2. No painel de navegação, escolha Grupos de segurança.
  3. Selecione o grupo de segurança criado nas etapas acima e escolha Ações e Excluir grupos de segurança.
  4. Escolha Excluir quando solicitado para confirmação.

Para excluir uma função do IAM (console)

  1. Abra o console do Amazon IAM em https://console.aws.amazon.com/iam/.
  2. No painel de navegação, escolha Funções e, em seguida, marque a caixa de seleção ao lado do nome da função que você deseja excluir (em nosso exemplo acima, EC2-RDS-AccessRole).
  3. Escolha Excluir na parte superior da página.
  4. Na caixa de diálogo de confirmação, insira o nome da função no campo de entrada de texto e escolha Excluir.

Conclusão

Neste post, mostramos como se conectar aos bancos de dados do RDS usando a autenticação IAM e o Session Manager com o recurso de encaminhamento remoto de portas. Essa solução, quando comparada aos mecanismos tradicionais de conexão de banco de dados com bastion hosts expostos publicamente à Internet, reduz a superfície de ataque do sistema e, ao mesmo tempo, simplifica a arquitetura de rede.

Ele também simplifica a sobrecarga operacional do gerenciamento de nomes de usuário e senhas para seus bancos de dados, garantindo acesso seguro e controlado aos seus recursos do Amazon RDS com políticas do IAM.

Para saber mais sobre a autenticação de banco de dados IAM para diferentes mecanismos de banco de dados, consulte Autenticação de banco de dados IAM para MariaDB, MySQL e PostgreSQL.

Para obter mais informações sobre os recursos do Systems Manager, consulte os Recursos operacionais do AWS Systems Manager.

 

Sobre os autores

Adrià Morgado é arquiteto de infraestrutura de nuvem na Amazon Web Services. Ele é especializado em projetar e implementar soluções robustas, escaláveis e seguras para clientes de grandes empresas
Alan Oberto Jiménez é um arquiteto/desenvolvedor de nuvem especializado em auxiliar os clientes na arquitetura, desenvolvimento e reengenharia de aplicativos que podem aproveitar totalmente a nuvem da AWS.

Este blog foi traduzido do original em inglês (link aqui).

Revisor Português: Murilo Nascimento – Sr. Product Manager na AWS Brasil.