Accediendo desde servidores locales a recursos en AWS

Katty Giovanna Gómez Londoño
Bancolombia Tech
Published in
6 min readOct 31, 2023

En la actualidad es común encontrar que tenemos alojadas cargas de trabajo en una nube hibrida, uno de los desafíos de este ecosistema es como permitir el acceso desde un servidor local a un recurso en la nube. En AWS, para el acceso entre servicios que residen en la misma nube utilizamos roles de IAM, pero ¿Cómo una carga de trabajo fuera de aws obtiene credenciales para acceder a un recurso en aws?

Las credenciales se pueden obtener de dos maneras, la más conocida es mediante usuarios IAM, y la segunda es a través de AWS IAM Roles Anywhere, disponible desde julio de 2022. ¿En qué se diferencian?

Con un usuario IAM se obtienen credenciales de larga duración, es responsabilidad de nosotros como clientes establecer políticas y controles que fuercen el rotado de estas credenciales. Con IAM Roles Anywhere, las credenciales son temporales y serán solo válidas durante el tiempo que dure la sesión, eliminando así la necesidad de administrar las credenciales de larga duración y mejorando la postura de seguridad.

¿Cómo funciona IAM Roles Anywhere?

Se basa en la infraestructura de clave pública (PKI); ya que da el acceso basado en certificados digitales X.509, donde su carga de trabajo usa un certificado cliente, firmado por una autoridad certificadora (CA) que usted controla y la cual registra en “IAM Roles Anywhere”.

Por lo tanto, se requiere que usted tenga una CA que firme certificados x.509 y que sean privados. Para ello tiene 2 opciones:

1. Usar AWS Private CA, lo cual puede resultar más sencillo, pero es importante revisar sus costos $$.

2. Usar su propia CA privada.

A continuación, veremos algunos conceptos clave para empezar a usar el servicio.

Anclaje de confianza: establece la relación de confianza entre IAM Roles Anywhere y su CA.

Rol: es una identidad de IAM que usted puede crear en su cuenta y que tiene unos permisos específicos. Un rol puede se entiende que puede ser asumido por cualquiera que lo necesite.

Perfiles: se utilizan para especificar qué roles puede asumir IAM Roles Anywhere y qué podrán hacer las cargas de trabajo con las credenciales temporales. Además, permite definir políticas de sesión con lo cual se pueden limitar aún más los permisos.

Para demostrar como IAM Roles Anywhere funciona, tomaremos un escenario sencillo donde nosotros queremos hacer llamados a las APIs de S3 para subir datos desde un servidor en nuestro centro de datos local.

Prerrequisitos:

1. La cadena de confianza de su CA o AWS Private CA activa en la misma region de IAM Roles Anywhere. En nuestro caso utilizaremos nuestra propia CA.

2. Un certificado de entidad final y la llave privada asociada a este, disponible en el servidor local.

3. Permisos de administrador para crear roles de IAM y para crear los recursos de IAM Roles Anywhere. Estos recursos también se pueden crear mediante Infraestructura como código (IaC).

Configurando IAM Roles Anywhere

Crear el anclaje de confianza

  1. Nos dirigimos a la consola de IAM Roles Anywhere

2. Debajo de anclaje de confianza elegimos “crear anclaje de confianza”, si tienes la consola en inglés “Create trust anchor”.

Consola de Inicio de IAM Roles Anywhere
Notar que IAM Roles Anywhere es regional, por tanto, este debe ser configurado en la misma región donde están los recursos a los que necesitamos acceder.

3. En la página de creación del anclaje de confianza:

Ingresar un nombre para el anclaje de confianza
En autoridad certificadora (CA) origen, seleccionar “Paquetes de certificados externos”, si la consola está en inglés, “External certificate bundle”
Bajo “Paquetes de certificados externos”, pegar el certificado de la CA (puede ser el certificado raíz de la CA o la cadena de confianza) en formato PEM.

Para finalizar, le damos clic en “Crear un anclaje de confianza”

Crear y configurar un rol que confíe en IAM Roles Anywhere

  1. Usando AWS Cloudformation, crear un rol de IAM con los permisos apropiados que desea que su servidor local asuma después de autenticarse en IAM Roles Anywhere. Además, configure el rol con la siguiente política de confianza, así garantiza que el rol pueda ser asumido usando IAM Roles Anywhere.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "rolesanywhere.amazonaws.com"
},
"Action": [
"sts:AssumeRole",
"sts:SetSourceIdentity",
"sts:TagSession"
]
}
]
}

Este es un ejemplo de rol a crear con AWS Cloudformation, en el que se conceden permisos para cargar objetos a un bucket de Amazon S3

AWSTemplateFormatVersion: "2010-09-09"

Description: "rol para acceder a un bucket de S3"

Resources:

RoleS3upload:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Principal:
Service:
- rolesanywhere.amazonaws.com
Action:
- sts:AssumeRole
- sts:SetSourceIdentity
- sts:TagSession
Path: /
Policies:
- PolicyName: file-uploads
PolicyDocument:
Version: '2012-10-17'
Statement:
- Action:
- s3:PutObject
Resource: "arn:aws:s3:::demo-roles-anywhere/*"
Effect: Allow

Crear un perfil

  1. En la parte inferior de “Roles Anywhere”, dar click en “Crear Perfil” y proporcionar un nombre.

2. Bajo “Roles” seleccionar el rol creado en el paso anterior.

Se pueden agregar múltiples roles a un perfil.
En esta sección solo aparecerán los roles que tengan una relación de confianza con IAM Roles Anywhere.

3. Bajo “Políticas de sesión” se pueden elegir políticas administradas o definir políticas en línea que limiten los permisos a nivel de las sesiones que se creen con los roles configurados en el perfil.

Por defecto, tiene una política insertada que permite todo.

Usando IAM Roles Anywhere

En esta sección explicaremos como obtener las credenciales temporales usando los recursos previamente configurados.

IAM Roles Anywhere proporciona la herramienta “credential helper”, mediante la cual se obtienen las credenciales temporales. Consulte la documentación de IAM Roles Anywhere para aprender como instalar y utilizar la herramienta.

  1. Compruebe las configuraciones anteriores ejecutando manualmente la herramienta auxiliar de credenciales (aws_signing_helper)
./aws_signing_helper credential-process \
--certificate /path/to/certificate.pem \
--private-key /path/to/private-key.pem \
--trust-anchor-arn <TA_ARN> \
--profile-arn <PROFILE_ARN> \
--role-arn <ExampleS3WriteRole_ARN>
El auxiliar de credenciales retorna las credenciales temporales para acceder a los servicios de AWS

Es posible implementar el proceso de proveedor de credenciales con el fin de obtener las credenciales temporales de manera desatendida, para ello puede actualizar o crear el archivo ~/.aws/config y agregar el auxiliar de credenciales como un credential_process.

Contenido del archivo ~/.aws/config
[default]
credential_process = ./aws_signing_helper credential-process
--certificate /path/to/certificate.pem
--private-key /path/to/private-key.pem
--trust-anchor-arn <TA_ARN>
--profile-arn <PROFILE_ARN>
--role-arn <ExampleS3WriteRole_ARN>
Si habías utilizado el comando “aws configure” para configurar credenciales al perfil Default, debes limpiar el archivo ~/.aws/credentials.

Con el siguiente comando confirmamos que el rol asumido corresponde al que configuramos en IAM Roles Anywhere.

Por último, realizamos una prueba cargando un archivo al bucket.

Casos de uso comunes

  1. Respaldar datos de servicios locales en Amazon S3.
  2. Proporcionar acceso a cargas de trabajo corriendo en cluster de kubernetes en centros de datos privados u otras nubes a servicios nativos de AWS, como Amazon DynamoDB, Amazon SQS.
  3. Acceder a secretos almacenados en AWS Secrets Manager desde cargas fuera de AWS.
  4. Habilitar el uso de AWS Security Hub para manejar los hallazgos en recursos alojados en el centro de datos local.

Consideraciones finales

1. Custodia y protege la llave privada del certificado del cliente.

2. Limita los permisos de las sesiones para evitar escalamiento de privilegios.

3. Controla a que recursos locales vas a permitir que usen IAM Roles Anywhere, esto puede realizarse en la política de confianza a través de declaraciones de condición basadas en los atributos extraídos del certificado x.509. A continuación, vemos una política de confianza que tiene una declaración de condición basada en el atributo “CommonName” del certificado.

Referencias

Guía de usuario de IAM Roles Anywhere

Extend AWS IAM roles to workloads outside of AWS with IAM Roles Anywhere

Política de confianza para IAM Roles Anywhere.

--

--