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
- 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
- Nunca hardcodees credenciales en aplicaciones
- Usa tokens IAM en lugar de passwords estáticos
- Rota los tokens regularmente (expiran automáticamente)
- Mantén los Security Groups restrictivos - solo IPs necesarias
- Usa conexiones SSL/TLS siempre que sea posible
- 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
Publicar un comentario