Ir al contenido principal

Conectarse a BD de Postgress / RDS mediante VPN AWS

 

Cómo Conectarse a Amazon RDS mediante VPN con Autenticación IAM

La conexión a bases de datos Amazon RDS ubicadas en redes privadas requiere una configuración específica que incluye conectividad VPN y autenticación mediante tokens IAM. En esta guía te explico paso a paso cómo configurar y solucionar problemas comunes en este proceso.

Requisitos Previos

  • Conexión VPN establecida a la red corporativa

Recuerda que para configurar la VPN te deben proporcionar un archivo OVPN como este. En el que hablo mas a detalle aqui: Anatomía de un archivo .ovpn: Entendiendo la configuración de OpenVPN


  • Credenciales AWS válidas con permisos de RDS
  • Cliente de base de datos compatible (psql, pgAdmin, etc.)
  • AWS CLI Instalado y configurado, depende tus configuraciones y demas en AWS lo puedes ver de la siguiente manera:

Paso 1: Verificar la Conectividad VPN

Primero, confirma que tu VPN esté funcionando correctamente y que puedas resolver el hostname de la base de datos.

# Verificar resolución DNS
nslookup prod-analytics-db-cluster.abc123def456.us-east-1.rds.amazonaws.com

# Resultado esperado:
# Server: 10.0.0.1
# Address: 10.0.0.1#53
# 
# Non-authoritative answer:
# Name: prod-analytics-db-cluster.abc123def456.us-east-1.rds.amazonaws.com
# Address: 10.10.50.25

Paso 2: Probar Conectividad de Red

Verifica que puedas alcanzar el puerto de la base de datos desde tu ubicación actual.

En Windows PowerShell:

Test-NetConnection -ComputerName prod-analytics-db-cluster.abc123def456.us-east-1.rds.amazonaws.com -Port 5432

En Linux/Mac:

telnet prod-analytics-db-cluster.abc123def456.us-east-1.rds.amazonaws.com 5432
# o
nc -zv prod-analytics-db-cluster.abc123def456.us-east-1.rds.amazonaws.com 5432

Resultado exitoso esperado:

ComputerName     : prod-analytics-db-cluster.abc123def456.us-east-1.rds.amazonaws.com
RemoteAddress    : 10.10.50.25
RemotePort       : 5432
InterfaceAlias   : Corporate VPN
SourceAddress    : 10.20.15.100
TcpTestSucceeded : True

Paso 3: Verificar Credenciales AWS

Confirma que tus credenciales AWS estén funcionando y no hayan expirado.

# Verificar identidad actual
aws sts get-caller-identity --region us-east-1

# Resultado esperado:
# {
#     "UserId": "AIDACKCEVSQ6C2EXAMPLE",
#     "Account": "123456789012",
#     "Arn": "arn:aws:sts::123456789012:assumed-role/DatabaseAccessRole/usuario.desarrollador"
# }

Paso 4: Identificar la Instancia RDS Correcta

Lista las instancias disponibles para encontrar la correcta.

# Listar todas las instancias RDS
aws rds describe-db-instances --region us-east-1 --query 'DBInstances[].DBInstanceIdentifier'

# Buscar información específica de tu instancia
aws rds describe-db-instances \
    --db-instance-identifier prod-analytics-main-db \
    --region us-east-1 \
    --query 'DBInstances[0].{Endpoint:Endpoint.Address,Port:Endpoint.Port,SecurityGroups:VpcSecurityGroups[].VpcSecurityGroupId,PublicAccess:PubliclyAccessible,IAMAuth:IAMDatabaseAuthenticationEnabled}'

Paso 5: Verificar Configuración de Security Groups

El problema más común es que tu IP no esté permitida en el Security Group.

# Obtener el Security Group ID
aws rds describe-db-instances \
    --db-instance-identifier prod-analytics-main-db \
    --region us-east-1 \
    --query 'DBInstances[0].VpcSecurityGroups[].VpcSecurityGroupId' \
    --output text

# Verificar reglas del Security Group
aws ec2 describe-security-groups \
    --group-ids sg-0123456789abcdef0 \
    --region us-east-1 \
    --query 'SecurityGroups[0].IpPermissions[?FromPort==`5432`]'

Ejemplo de reglas correctas:

[
    {
        "IpProtocol": "tcp",
        "FromPort": 5432,
        "ToPort": 5432,
        "IpRanges": [
            {
                "CidrIp": "10.20.0.0/16",
                "Description": "Corporate VPN network"
            },
            {
                "CidrIp": "10.10.0.0/16", 
                "Description": "Internal subnet range"
            }
        ]
    }
]

Paso 6: Obtener tu IP Actual

Verifica qué IP tienes asignada desde la VPN.

# IP pública
curl -s ifconfig.me

# IPs locales (Windows)
ipconfig | findstr "IPv4"

# IPs locales (Linux/Mac)
ip addr show | grep inet

Paso 7: Generar Token de Autenticación IAM

Con la conectividad verificada, genera el token de acceso.

aws rds generate-db-auth-token \
    --hostname prod-analytics-db-cluster.abc123def456.us-east-1.rds.amazonaws.com \
    --port 5432 \
    --region us-east-1 \
    --username app_readonly

Te devolvera algo parecido a esto el cual será tu contraseña. 




Paso 8: Conectarse a la Base de Datos

Usando psql (línea de comandos):

psql -h prod-analytics-db-cluster.abc123def456.us-east-1.rds.amazonaws.com \
     -p 5432 \
     -U app_readonly \
     -d analytics_prod \
     -W
# Cuando solicite password, pega el token generado

Usando pgAdmin o cliente visual:

  • Host: prod-analytics-db-cluster.abc123def456.us-east-1.rds.amazonaws.com
  • Port: 5432
  • Database: analytics_prod
  • Username: app_readonly
  • Password: [pegar el token IAM generado]

Solución de Problemas Comunes

Error: "Connection timed out"

Causa: Security Group no permite tu IP
Solución: Contactar al administrador para agregar tu IP al Security Group

# El administrador necesitará ejecutar:
aws ec2 authorize-security-group-ingress \
    --group-id sg-0123456789abcdef0 \
    --protocol tcp \
    --port 5432 \
    --cidr TU_IP/32 \
    --region us-east-1

Error: "InvalidClientTokenId"

Causa: Credenciales AWS expiradas
Solución: Renovar las credenciales temporales

# Verificar si las credenciales están expiradas
aws sts get-caller-identity

Error: "Access denied"

Causa: Usuario no tiene permisos IAM o la instancia no tiene IAM auth habilitado
Solución: Verificar permisos y configuración

# Verificar si IAM auth está habilitado
aws rds describe-db-instances \
    --db-instance-identifier prod-analytics-main-db \
    --query 'DBInstances[0].IAMDatabaseAuthenticationEnabled'

Error: "Name resolution failed"

Causa: Problemas de DNS o VPN desconectada
Solución: Verificar conexión VPN y configuración DNS

Buenas Prácticas de Seguridad

  1. Nunca hardcodees credenciales en aplicaciones
  2. Usa tokens IAM en lugar de passwords estáticos
  3. Rota los tokens regularmente (expiran automáticamente)
  4. Mantén los Security Groups restrictivos - solo IPs necesarias
  5. Usa conexiones SSL/TLS siempre que sea posible
  6. Monitorea los logs de conexión para detectar accesos no autorizados

Automatización con Scripts

Puedes automatizar el proceso de conexión con un script:

#!/bin/bash

# Configuración
DB_HOST="prod-analytics-db-cluster.abc123def456.us-east-1.rds.amazonaws.com"
DB_PORT="5432"
DB_USER="app_readonly"
DB_NAME="analytics_prod"
AWS_REGION="us-east-1"

# Verificar conectividad
echo "Verificando conectividad..."
if ! nc -z $DB_HOST $DB_PORT; then
    echo "Error: No se puede conectar a $DB_HOST:$DB_PORT"
    exit 1
fi

# Generar token
echo "Generando token IAM..."
TOKEN=$(aws rds generate-db-auth-token \
    --hostname $DB_HOST \
    --port $DB_PORT \
    --region $AWS_REGION \
    --username $DB_USER)

if [ -z "$TOKEN" ]; then
    echo "Error: No se pudo generar el token"
    exit 1
fi

# Conectar
echo "Conectando a la base de datos..."
PGPASSWORD="$TOKEN" psql -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME


Comentarios

Entradas más populares de este blog

Arquitectura N-Capas GUÍA COMPLETA .NET Core

Entendiendo la Arquitectura Limpia (Clean Architecture) en .NET: Una Guía Completa La Arquitectura Limpia, también conocida como arquitectura N-Capas, es un patrón de diseño que nos ayuda a crear aplicaciones mantenibles, testables y escalables. En este artículo, exploraremos en detalle cómo implementar esta arquitectura en un proyecto .NET. Si quieres entenderlo más fácil y con código, te dejo este otro artículo:   Arquitectura Limpia explicado con patitos 🐤 ¿Qué es la Arquitectura Limpia? La Arquitectura Limpia es un conjunto de principios de diseño que nos ayuda a separar las responsabilidades en diferentes capas de nuestra aplicación. Cada capa tiene una responsabilidad específica y se comunica con las otras capas a través de interfaces bien definidas. Estructura del Proyecto Una típica estructura de proyecto en Arquitectura Limpia se ve así: ├── Controllers/ │   └── ProductController.cs ├── Domain/ │   ├── Models/ │   └── DTOs/ ├── Repository/ │...

Archivo Application.properties en SPRING BOOT

  Guía Completa: Application.properties en Spring Boot El archivo application.properties es una pieza fundamental en aplicaciones Spring Boot, actuando como el centro de configuración para todo tu proyecto. En esta guía, exploraremos sus características principales y cómo aprovecharlo al máximo. ¿Qué es application.properties? Es un archivo de configuración que permite definir diferentes parámetros y valores para tu aplicación Spring Boot sin necesidad de modificar el código fuente. Se ubica en src/main/resources y Spring Boot lo lee automáticamente al iniciar. Configuraciones Esenciales Configuración del Servidor # Puerto del servidor server.port = 8080 # Contexto de la aplicación server.servlet.context-path = /miapp Conexión a Base de Datos # MySQL spring.datasource.url = jdbc:mysql://localhost:3306/mibasededatos spring.datasource.username = usuario spring.datasource.password = contraseña spring.datasource.driver-class-name = com.mysql.cj.jdbc.Driver JPA y Hibernat...

Kubernets (K8S) - PRIMEROS pasos

¡Hola, amantes de la tecnología! 👋 Si has escuchado hablar de Kubernetes pero aún no sabes por dónde empezar, este artículo es para ti. 🚢 Kubernetes, también conocido como K8s, es una herramienta poderosa para la gestión de contenedores que puede parecer intimidante al principio. Pero no te preocupes, aquí te guiaremos paso a paso para que puedas dominar los conceptos básicos y empezar a desplegar tus propias aplicaciones en un clúster de Kubernetes. 🌐 Prepárate para descubrir cómo esta tecnología puede transformar la manera en que desarrollas y despliegas tus aplicaciones. ¡Vamos a sumergirnos en el mundo de Kubernetes! 💻🚀 Vamos hacer un listado para lo que vamos a necesitar instalar:  Docker Desktop  Install Docker Desktop on Windows | Docker Docs   Kubectl  Install Tools | Kubernetes   MiniCube  https://minikube.sigs.k8s.io/docs/start Scoop ( opcional para instalar Kubecolor)  Scoop   Kubecolor ( opcional para colores en PowerShell)  ...