<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Livingstone Del Monte | Senior Software Engineer | AWS, Node, React, Python]]></title><description><![CDATA[Livingstone Del Monte, a Senior Software Engineer from Brazil with a passion for web development. Having worked extensively with AWS, Node, React, and Python.]]></description><link>https://livingstone.com.br</link><generator>RSS for Node</generator><lastBuildDate>Sun, 07 Jun 2026 14:46:42 GMT</lastBuildDate><atom:link href="https://livingstone.com.br/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Conexão segura com banco de dados na AWS utilizando RDS, SSM e EC2]]></title><description><![CDATA[Quando estamos em um ambiente de cloud, existem diferentes formas de realizar a conexão com um banco de dados.
Fazer isso com segurança é essencial, por isso, muitas vezes optamos por utilizar uma máquina EC2 como bastion host em uma subnet pública. ...]]></description><link>https://livingstone.com.br/conexao-segura-banco-de-dados-aws-rds-ssm-ec2</link><guid isPermaLink="true">https://livingstone.com.br/conexao-segura-banco-de-dados-aws-rds-ssm-ec2</guid><category><![CDATA[AWS]]></category><category><![CDATA[rds]]></category><category><![CDATA[Segurança]]></category><category><![CDATA[Segurança Cloud]]></category><category><![CDATA[Banco de Dados]]></category><category><![CDATA[ssm]]></category><category><![CDATA[AWS Session Manager]]></category><category><![CDATA[ec2]]></category><category><![CDATA[vpc]]></category><dc:creator><![CDATA[Livingstone Del Monte]]></dc:creator><pubDate>Mon, 25 Mar 2024 17:23:07 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/KPZNNKQbTMw/upload/f326cf28ec04cab7fc06621cf18becbb.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Quando estamos em um ambiente de cloud, existem diferentes formas de realizar a conexão com um banco de dados.</p>
<p>Fazer isso com segurança é essencial, por isso, muitas vezes optamos por utilizar uma máquina EC2 como bastion host em uma subnet pública. Dessa forma, é possível autenticar o usuário através de um par de chaves, permitindo a conexão via SSH.</p>
<p>Para alguns casos, essa é uma prática viável, porém lidar com a segurança e gerenciamento dessas chaves não é algo tão simples. Se, por exemplo, um desenvolvedor deixar o projeto por algum motivo, uma medida de segurança comum seria a troca das chaves de todas as máquinas às quais ele tinha acesso e a redistribuição de novas chaves para o restante da equipe, correto?</p>
<p>E se, além disso, limitássemos o acesso na porta 22 do bastion host para os IPs do time de forma individual, prevenindo inclusive ataques DDoS no bastion host?</p>
<p>Ainda assim, não poderíamos deixar de atualizar os IPs de diversos desenvolvedores sempre que o IP da máquina deles mudasse ou de conceder permissões de acesso em Security Groups para que eles mesmos façam as atualizações, abrindo brechas de segurança difíceis de serem monitoradas.</p>
<p>Sempre que um desenvolvedor é desligado ou muda para outro projeto, precisamos remover o seu IP em múltiplas contas da AWS, projetos e ambientes (desenvolvimento, homologação, produção, entre outros), aumentando a complexidade de gerenciamento.</p>
<p>Felizmente, temos uma solução efetiva na AWS que permite manter todo o gerenciamento de acessos pelo IAM e conectar em uma subnet privada através do SSM (Systems Manager Session Manager) e VPC Endpoints.</p>
<p>Confira abaixo o passo a passo detalhado de como fazer uma conexão no RDS com o SSM e realizar a configuração de cada recurso.</p>
<p><strong>Imagem da arquitetura implementada:</strong></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710818862744/a06a5806-ea02-41f1-bb81-8b1d59f2acf7.jpeg" alt class="image--center mx-auto" /></p>
<h2 id="heading-pre-requisitos"><strong>Pré-requisitos</strong></h2>
<p>Para começar, é necessário configurar as seguintes ferramentas e serviços:</p>
<ul>
<li><p><a target="_blank" href="https://aws.amazon.com/cli/">AWS CLI versão 2</a></p>
</li>
<li><p><a target="_blank" href="https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-working-with-install-plugin.html">Session Manager plugin</a></p>
</li>
<li><p>VPC com DNS ativado</p>
</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710818795353/870fb394-2e37-4f29-a26e-1fb94dba4b4e.png" alt class="image--center mx-auto" /></p>
<ul>
<li><p>Subnet(s) privada(s)</p>
</li>
<li><p>Banco de dados no RDS</p>
</li>
<li><p>DBeaver ou similar para conexão com banco de dados local</p>
</li>
</ul>
<p>Para verificar a instalação e as suas credenciais, utilize os comandos <code>aws --version</code>, <code>session-manager-plugin</code> e <code>aws sts get-caller-identity</code>.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710818901314/18ffc34c-46cf-45cd-853f-25ae462e9be6.png" alt class="image--center mx-auto" /></p>
<p><em>Nesse tutorial, estou usando ambiente Linux via WSL</em>.</p>
<h2 id="heading-security-groups"><strong>Security Groups</strong></h2>
<p>Com tudo configurado, podemos criar Security Groups para os VPC Endpoints, Bastion Host e RDS. (Vou me referir a eles com o mesmo nome utilizado no momento da criação, SG_SSM_ENDPOINTS, SG_SSM_BH e SG_RDS, respectivamente).</p>
<p><em>Como o banco de dados foi criado anteriormente, você pode usar o mesmo Security Group do momento da criação ou um novo, como preferir.</em></p>
<h3 id="heading-sgssmendpoints"><strong>SG_SSM_ENDPOINTS</strong></h3>
<p>Ao criar um novo Security Group, preencha o seu nome, descrição e VPC.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710818907732/5367f9f3-143c-40d4-84c1-4b54f549d4d1.png" alt class="image--center mx-auto" /></p>
<p>Inbound Rules: Entrada HTTPS para o CIDR da sua VPC.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710818912774/5d2ae2ed-b8e0-4ca9-bdd2-a7fd13b144a3.png" alt class="image--center mx-auto" /></p>
<p>Outbound Rules: Saída de dados para o CIDR da sua VPC.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710818915745/fb5a5182-53df-4ee8-be7f-49a3179b8959.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-sgssmbh">SG_SSM_BH</h3>
<p>Inbound Rules: Entrada do banco de dados para o SG_RDS.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710818918487/16f84645-76bc-498a-a993-57c3621887d1.png" alt class="image--center mx-auto" /></p>
<p>Outbound Rules: Saída PostgreSQL e HTTPS para a internet.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710818922457/444e133f-b9eb-4a0a-aa47-a03be74de77e.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-sgrds"><strong>SG_RDS</strong></h3>
<p>Inbound Rules: Entrada PostgreSQL para o SG_SSM_BH.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710818926243/25d27c8c-7e44-497f-b990-c208c903838a.png" alt class="image--center mx-auto" /></p>
<p>Outbound Rules: Saída para a rede.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710818930658/023471b8-8482-4b97-86d0-2a5172f54bab.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-role-iam"><strong>Role IAM</strong></h2>
<p>O próximo passo será a criação de uma role no IAM do tipo serviços AWS.</p>
<p>Em EC2, selecione EC2 Role for AWS Systems Manager como na print abaixo:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710818936016/41d7804e-043f-489b-8bd3-59ea50856126.png" alt class="image--center mx-auto" /></p>
<p>A política gerenciada AmazonSSMManagedInstanceCore estará selecionada automaticamente, apenas prossiga.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710818938411/ad3fe243-c107-4060-bc6b-855bb2ad736b.png" alt class="image--center mx-auto" /></p>
<p>Preencha o nome da role e finalize a criação.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710818941858/1f9660c3-b2d1-4527-8dfb-65b460d432e6.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-criacao-de-vpc-endpoints"><strong>Criação de VPC Endpoints</strong></h2>
<p>Estou utilizando os 5 VPC Endpoints listados abaixo, mas somente os 3 primeiros são obrigatórios. Essa variação acontece conforme a sua necessidade e você poderá encontrar os detalhes de cada endpoint na <a target="_blank" href="https://docs.aws.amazon.com/systems-manager/latest/userguide/setup-create-vpc.html#sysman-setting-up-vpc-create">documentação da AWS</a>.</p>
<ul>
<li><p>com.amazonaws.region.<strong>ssm</strong></p>
</li>
<li><p>com.amazonaws.region.ssmmessages</p>
</li>
<li><p><a target="_blank" href="http://com.amazonaws.region.ec">com.amazonaws.region.ec</a>2messages</p>
</li>
<li><p>com.amazonaws.region.logs</p>
</li>
<li><p><a target="_blank" href="http://com.amazonaws.region.ec">com.amazonaws.region.ec</a>2</p>
</li>
</ul>
<p>Começaremos com o endpoint com.amazonaws.region.<strong>ssm</strong>.</p>
<p>Passo 1: Preencha o nome, selecione AWS Services e busque por <strong>ssm</strong>. Em seguida, selecione o com.amazonaws.region.<strong>ssm</strong>.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710818947407/2756ed35-d862-4e5f-8764-ef7319158254.png" alt class="image--center mx-auto" /></p>
<p>Passo 2: Escolha a VPC, habilite o DNS e selecione suas subnets privadas.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710818949518/ae669f01-781e-4b41-87a1-0b1d44ad1690.png" alt class="image--center mx-auto" /></p>
<p>Passo 3: Escolha o security group SG_SSM_ENDPOINTS.</p>
<p><em>Para esse tutorial, estou utilizando a política com acesso completo</em>.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710818958817/5d874bd3-0713-4c3f-b644-b3aefa68f982.png" alt class="image--center mx-auto" /></p>
<p>Agora é só clicar em “Criar endpoint”. Lembrando que você deverá repetir essas etapas para cada um dos endpoints mencionados acima.</p>
<p>Se estiver tudo certo, todos os endpoints configurados estarão listados e disponíveis.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710818962658/5b42457b-a028-41fe-83e5-ead937011209.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-criacao-do-bastion-host-no-ec2">Criação do Bastion Host no EC2</h2>
<p>Escolha um nome, sistema operacional e tipo de instância e siga sem associar pares de chaves.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710818968002/acb54d33-1edd-4d86-821c-6f1bca3dc2b7.png" alt class="image--center mx-auto" /></p>
<p>Em configurações de rede:</p>
<ul>
<li><p>Selecione sua VPC, uma subnet privada que também esteja associada ao seu banco de dados e o security group do Bastion Host (SG_BH_SSM).</p>
</li>
<li><p>A opção de <strong>Auto IP Público</strong> deve ficar <strong>desabilitada</strong>.</p>
</li>
</ul>
<p>Em opções avançadas, selecione a role que criamos (EC2_SSM_CONNECT) no campo perfil IAM da instância.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710818970932/55cf4412-5a8a-4bf1-b426-ed88f0314834.png" alt class="image--center mx-auto" /></p>
<p>Clique em criar instância para finalizar e aguarde a máquina ser ativada.</p>
<p>Ainda nessa página, copie e guarde o ID completo da instância, que tem esse formato: <code>I-0xyz123</code>.</p>
<h2 id="heading-agente-ssm"><strong>Agente SSM</strong></h2>
<p>Verifique se o agente do SSM já está ativo na máquina. Dependendo do sistema operacional, ele já vem instalado, caso contrário, você deverá instalá-lo manualmente.</p>
<p>Se o agente já estiver instalado, seu ec2 estará listado no “Fleet Manager” e pronto para ser acessado.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710818975490/eb565e81-5f01-43dc-9061-ea23d36f74be.png" alt class="image--center mx-auto" /></p>
<p>Se ainda não apareceu, <a target="_blank" href="https://docs.aws.amazon.com/systems-manager/latest/userguide/ssm-agent-status-and-restart.html">verifique</a> se o agente está ativo na máquina. Você também poderá um guia para fazer a instalação manualmente em diferentes sistemas operacionais na <a target="_blank" href="https://docs.aws.amazon.com/systems-manager/latest/userguide/ssm-agent.html">documentação</a>.</p>
<h2 id="heading-sessao-ssm-e-conexao-com-o-banco-de-dados"><strong>Sessão SSM e conexão com o banco de dados</strong></h2>
<p>Para preparar o comando e iniciar a sessão no SSM, edite o comando abaixo preenchendo o ID do EC2 e o host do banco de dados.</p>
<p>No portNumber, preencha com a porta do banco de dados configurada no RDS.</p>
<p>No localPortNumber, preencha com a porta que utilizará para conectar no banco local.</p>
<p><em>As barras (\) no comando são apenas para melhorar a visibilidade. Dependendo do seu sistema, elas podem não funcionar. Nesse caso, retire as barras deixando apenas espaços entre os parâmetros.</em></p>
<pre><code class="lang-bash">aws ssm start-session \
--target i-ID-ec2-bastion-host \
--document-name AWS-StartPortForwardingSessionToRemoteHost \
--parameters <span class="hljs-string">'{"host":["database.id.region.rds.amazonaws.com"],"portNumber":["5432"], "localPortNumber":["5001"]}'</span>
</code></pre>
<p>Se tudo estiver correto, você verá a mensagem abaixo no terminal, confirmando que a sua sessão foi iniciada no SSM com o número da porta local de conexão.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710818981171/e35df7e8-ffe1-4c5d-9374-bf632b7ee08f.png" alt class="image--center mx-auto" /></p>
<p>Mantenha o terminal aberto para conectar no banco.</p>
<p>No DBeaver ou similar, preencha o usuário e senha apontando o <a target="_blank" href="http://localhost">localhost</a> para a porta escolhida.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710818985018/86f75d92-7f09-4437-a582-9649394415d1.png" alt class="image--center mx-auto" /></p>
<p>Pronto, agora você está conectado com segurança!</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710818988560/559e2635-cc76-4f3c-b514-eb3ea66c81fc.png" alt class="image--center mx-auto" /></p>
<p>Se você está utilizando um acesso com altos privilégios na AWS, você não terá problemas com permissões, mas caso sua equipe utilize acessos mais restritos, é importante adicionar o SSM na política de acesso deles.</p>
<h2 id="heading-conclusao"><strong>Conclusão</strong></h2>
<p>Agora você já está conectado no banco de dados de forma segura e gerencia de forma prática os acessos no RDS, mas é importante destacar que embora a abordagem discutida ofereça um alto nível de segurança, existem outras práticas e isso pode variar conforme a política interna de cada empresa. Vou citar algumas que podem ser exploradas:</p>
<ul>
<li><p>Evitar armazenamento de credenciais direto no código com o uso do AWS Secrets Manager ou AWS Parameter Store.</p>
</li>
<li><p>Utilização do RDS IAM Authentication para eliminar a gestão de credenciais.</p>
</li>
<li><p>Auditorias e monitoramento de ameaças com AWS CloudTrail e Amazon CloudWatch.</p>
</li>
<li><p>Estabelecer outras camadas de segurança através de conexão VPN, AWS Direct Connect ou AWS PrivateLink.</p>
</li>
</ul>
<p>O Session Manager ainda oferece logs de sessões que podem ser salvos no CloudWatch ou S3, possibilita a especificação de variáveis e inclusão de comandos shell ao iniciar sessões, integração com KMS, gerenciamento do tempo de sessão e muito mais.</p>
]]></content:encoded></item><item><title><![CDATA[Secure Database Connection on AWS using RDS, SSM and EC2]]></title><description><![CDATA[When operating in a cloud environment, there are various ways to establish a connection with a database. Ensuring security is essential, which is why we often opt for using an EC2 instance as a bastion host in a public subnet. This allows authenticat...]]></description><link>https://livingstone.com.br/secure-database-connection-aws-rds-ssm-ec2</link><guid isPermaLink="true">https://livingstone.com.br/secure-database-connection-aws-rds-ssm-ec2</guid><category><![CDATA[AWS]]></category><category><![CDATA[rds]]></category><category><![CDATA[ssm]]></category><category><![CDATA[AWS Session Manager]]></category><category><![CDATA[Security]]></category><category><![CDATA[cloud security]]></category><category><![CDATA[ec2]]></category><category><![CDATA[vpc]]></category><dc:creator><![CDATA[Livingstone Del Monte]]></dc:creator><pubDate>Wed, 20 Mar 2024 23:34:04 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/KPZNNKQbTMw/upload/f326cf28ec04cab7fc06621cf18becbb.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>When operating in a cloud environment, there are various ways to establish a connection with a database. Ensuring security is essential, which is why we often opt for using an EC2 instance as a bastion host in a public subnet. This allows authentication through SSH using key pairs.</p>
<p>For some scenarios, this is a viable practice, but managing the security of these keys isn't straightforward. For instance, if a developer leaves the project, a common security measure would involve changing the keys for all machines they had access to and redistributing new keys to the remaining team members. Correct? Moreover, what if we restricted access to port 22 of the bastion host to individual team IPs, thereby preventing DDoS attacks on the bastion host?</p>
<p>However, we'd still face the challenge of updating IPs for multiple developers whenever their machine IPs change or granting access permissions in Security Groups for them to update themselves, potentially causing security gaps that are difficult to monitor.</p>
<p>Whenever a developer leaves or switches to another project, we must remove their IP from multiple AWS accounts, projects, and environments (such as development, staging, production, among others), increasing management complexity.</p>
<p>Fortunately, AWS provides an effective solution that allows access management through IAM and connection to a private subnet through SSM (Systems Manager Session Manager) and VPC Endpoints.</p>
<p>Check below for a detailed step-by-step guide on connecting to RDS using SSM and configuring each resource.</p>
<p><strong>Image of the implemented architecture:</strong></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710812510539/b29b358e-ed86-4b1a-9824-8d5fa8d4717d.jpeg" alt class="image--center mx-auto" /></p>
<h2 id="heading-prerequisites"><strong>Prerequisites</strong></h2>
<p>To begin, you'll need to set up the following tools and services:</p>
<ul>
<li><p><a target="_blank" href="https://aws.amazon.com/cli/">AWS CLI version 2</a></p>
</li>
<li><p><a target="_blank" href="https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-working-with-install-plugin.html">Session Manager plugin</a></p>
</li>
<li><p>VPC with DNS enabled</p>
</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710812585167/1d6969a5-4c3b-44c1-8d19-adb1a93c08ec.png" alt class="image--center mx-auto" /></p>
<ul>
<li><p>Private subnet(s)</p>
</li>
<li><p>Database on RDS</p>
</li>
<li><p>DBeaver or a similar tool for local database connection</p>
</li>
</ul>
<p>To verify installation and your credentials, you can use the commands <code>aws --version</code>, <code>session-manager-plugin</code>, and <code>aws sts get-caller-identity</code>.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710812676184/f8bef51d-abeb-4dad-89c6-e9d9527ba0dd.png" alt class="image--center mx-auto" /></p>
<p><em>In this tutorial, I'm using a Linux environment through WSL.</em></p>
<h2 id="heading-security-groups"><strong>Security Groups</strong></h2>
<p>With everything set up, we can create Security Groups for the VPC Endpoints, Bastion Host, and RDS (referenced with the same names used during creation: SG_SSM_ENDPOINTS, SG_SSM_BH, and SG_RDS, respectively).</p>
<p><em>You can use the same Security Group created during database creation or create a new one, as you prefer.</em></p>
<h3 id="heading-sgssmendpoints"><strong>SG_SSM_ENDPOINTS</strong></h3>
<p>When creating a new Security Group, fill in its name, description, and VPC.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710812784636/e86f67d4-6b1a-4d5f-8a54-6c48aee47bb9.png" alt class="image--center mx-auto" /></p>
<p>Inbound Rules: HTTPS input for your VPC's CIDR.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710812805746/72586ad9-410c-4e12-b3cc-02f7f4548b41.png" alt class="image--center mx-auto" /></p>
<p>Outbound Rules: Data output for your VPC's CIDR.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710812859623/2351e8f6-174a-4600-b5d6-4b51c81b8163.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-sgssmbh">SG_SSM_BH</h3>
<p>Inbound Rules: Database input for SG_RDS.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710812881588/6594f390-9685-4f3f-9753-85e329b3d30b.png" alt class="image--center mx-auto" /></p>
<p>Outbound Rules: PostgreSQL and HTTPS output to the internet.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710812900089/4628b5d1-2841-4619-b0c7-6f1384750cc4.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-sgrds"><strong>SG_RDS</strong></h3>
<p>Inbound Rules: PostgreSQL input for SG_SSM_BH.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710813283857/3616e0ff-3479-4aa4-b8c2-b66d2f3690c1.png" alt class="image--center mx-auto" /></p>
<p>Outbound Rules: Output to the network.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710813296206/78e77ebe-9c19-455e-a543-00a162f52c89.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-iam-role"><strong>IAM Role</strong></h2>
<p>The next step is to create a role in IAM of the AWS service type. In EC2, select "EC2 Role for AWS Systems Manager" as shown in the screenshot below:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710813306191/a117dcad-0773-4915-8e9f-9caef03e58c5.png" alt class="image--center mx-auto" /></p>
<p>The managed policy AmazonSSMManagedInstanceCore will be automatically selected, click next.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710813310024/490f5d8e-7f56-4326-8de3-3a3f6c3f6e9e.png" alt class="image--center mx-auto" /></p>
<p>Fill in the role name and complete the creation.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710813320486/2288d8a7-c404-4c50-88b8-9db71136cdef.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-creation-of-vpc-endpoints"><strong>Creation of VPC Endpoints</strong></h2>
<p>I'm using the 5 VPC Endpoints listed below, but only the first 3 are mandatory. This variation depends on your needs, and you can find details for each endpoint in the <a target="_blank" href="https://docs.aws.amazon.com/systems-manager/latest/userguide/setup-create-vpc.html#sysman-setting-up-vpc-create">AWS documentation</a>.</p>
<ul>
<li><p>com.amazonaws.region.<strong>ssm</strong></p>
</li>
<li><p>com.amazonaws.region.ssmmessages</p>
</li>
<li><p><a target="_blank" href="http://com.amazonaws.region.ec">com.amazonaws.region.ec</a>2messages</p>
</li>
<li><p>com.amazonaws.region.logs</p>
</li>
<li><p><a target="_blank" href="http://com.amazonaws.region.ec">com.amazonaws.region.ec</a>2</p>
</li>
</ul>
<p>We'll start with the endpoint com.amazonaws.region.<strong>ssm</strong>.</p>
<p>Step 1: Fill in the name, select AWS Services, and search for <strong>ssm</strong>. Then, select com.amazonaws.region.<strong>ssm</strong>.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710813328819/4d02b270-0fe5-48ac-962d-a90a24f2ac14.png" alt class="image--center mx-auto" /></p>
<p>Step 2: Choose the VPC, enable DNS, and select your private subnets.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710813332008/b8c81b0f-acee-4aef-8696-4fb84f440cc2.png" alt class="image--center mx-auto" /></p>
<p>Step 3: Choose the security group SG_SSM_ENDPOINTS.</p>
<p><em>For this tutorial, I'm using the policy with full access.</em></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710813342391/eeea6160-7ce5-42bf-bfc3-63ba2e18c3db.png" alt class="image--center mx-auto" /></p>
<p>Now, simply click "Create endpoint". Remember to repeat these steps for each of the endpoints mentioned above.</p>
<p>If everything is correct, all configured endpoints will be listed and available.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710813346013/53c92ff7-44c5-4863-950b-cc22647dac6c.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-creation-of-bastion-host-on-ec2"><strong>Creation of Bastion Host on EC2</strong></h2>
<p>Choose a name, operating system, and instance type, and proceed without associating key pairs.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710813351058/11d083c5-707e-4436-95c1-ccf3f833262c.png" alt class="image--center mx-auto" /></p>
<p>In network settings:</p>
<ul>
<li><p>Select your VPC, a private subnet associated with your database, and the security group of the Bastion Host (SG_BH_SSM).</p>
</li>
<li><p>The "<strong>Auto-assign Public IP</strong>" option <strong>must be disabled</strong>.</p>
</li>
</ul>
<p>In advanced options, select the role we created (EC2_SSM_CONNECT) in the IAM instance profile field.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710813355921/9d4725e6-51e8-45cc-acef-43ff5534ed9c.png" alt class="image--center mx-auto" /></p>
<p>Click "Create instance" to finish and wait for the machine to be activated. Still on this page, copy and save the full instance ID with the following format: <code>i-0xyz123</code>.</p>
<h2 id="heading-ssm-agent"><strong>SSM Agent</strong></h2>
<p>Check if the SSM agent is already active on the machine. Depending on the operating system, it may come pre-installed, or you may need to install it manually. If the agent is already installed, your EC2 instance will be listed in "Fleet Manager" and ready to be accessed.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710813361419/fe59c831-bcb7-4a59-a7ba-22c62c618c4a.png" alt class="image--center mx-auto" /></p>
<p>If it hasn't appeared yet, <a target="_blank" href="https://docs.aws.amazon.com/systems-manager/latest/userguide/ssm-agent-status-and-restart.html">verify</a> if the agent is active on the machine. You can also refer to the <a target="_blank" href="https://docs.aws.amazon.com/systems-manager/latest/userguide/ssm-agent.html">documentation</a> for manual installation guides on different operating systems.</p>
<p><strong>SSM Session and Database Connection</strong></p>
<p>To prepare the command and initiate the session in SSM, edit the command below by filling in the EC2 ID and database host.</p>
<p>Fill in the portNumber with the database port configured in RDS.</p>
<p>For localPortNumber, use the port you'll use to connect to the local database.</p>
<p><em>The backslashes (\) in the command are just for visibility improvement. Depending on your system, they may not work. In this case, remove the backslashes, leaving only spaces between the parameters.</em></p>
<pre><code class="lang-bash">aws ssm start-session \
--target i-ID-ec2-bastion-host \
--document-name AWS-StartPortForwardingSessionToRemoteHost \
--parameters <span class="hljs-string">'{"host":["database.id.region.rds.amazonaws.com"],"portNumber":["5432"], "localPortNumber":["5001"]}'</span>
</code></pre>
<p>If everything is correct, you'll see the message below in the terminal, confirming that your session has been started in SSM with the local connection port number.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710813388240/1338cfee-b474-4a72-8754-878ccc088673.png" alt class="image--center mx-auto" /></p>
<p>Keep the terminal open to connect to the database. In DBeaver or a similar tool, fill in the username and password, pointing <a target="_blank" href="http://localhost">localhost</a> to the chosen port.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710813393860/5b513cab-e8a6-4b18-ac6d-3c5df2e06191.png" alt class="image--center mx-auto" /></p>
<p>Now, you're securely connected!</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710813398627/af9acb6c-14b2-45d4-95c5-2ed62b48222c.png" alt class="image--center mx-auto" /></p>
<p>If you're using high-privilege access in AWS, you won't encounter permission issues. However, if your team uses more restricted access, it's important to add SSM to their access policy.</p>
<h2 id="heading-conclusion"><strong>Conclusion</strong></h2>
<p>You're now securely connected to the database and can conveniently manage RDS access. However, it's important to note that while the discussed approach offers a high level of security, there are other practices that may vary depending on each company's internal policy. I'll mention some that can be explored:</p>
<ul>
<li><p>Avoid storing credentials directly in the code using AWS Secrets Manager or AWS Parameter Store.</p>
</li>
<li><p>Use RDS IAM Authentication to eliminate credential management.</p>
</li>
<li><p>Audit and monitor threats with AWS CloudTrail and Amazon CloudWatch.</p>
</li>
<li><p>Establish additional security layers through VPN connections, AWS Direct Connect, or AWS PrivateLink.</p>
</li>
</ul>
<p>The Session Manager also offers session logs that can be saved in CloudWatch or S3, allows variable specification, inclusion of shell commands when starting sessions, integration with KMS, session time management, and much more.</p>
]]></content:encoded></item></channel></rss>