top of page

Uso de IAM Roles Anywhere en lugar de claves IAM

  • 13 abr
  • 4 Min. de lectura
uso-de-iam-roles-anywhere-en-lugar-de-ckaves-iam


Introducción

En entornos híbridos y multi-cloud, uno de los mayores desafíos es habilitar el acceso seguro a recursos en la nube sin depender de credenciales estáticas como las claves de acceso de IAM. A medida que las organizaciones integran workloads on-premises, dispositivos edge y servicios que corren en otras nubes con AWS, la gestión de identidades se vuelve una pieza crítica de la arquitectura.

AWS IAM Roles Anywhere aborda este desafío permitiendo que sistemas fuera de AWS se autentiquen utilizando certificados X.509 y asuman roles de IAM de forma segura. En lugar de distribuir claves de acceso de larga duración, los workloads utilizan certificados para obtener credenciales temporales a través de AWS Security Token Service, alineándose con prácticas modernas de seguridad como Zero Trust.

Este enfoque cambia el modelo de secretos compartidos a identidades verificables respaldadas por PKI. Los certificados X.509 necesarios pueden ser emitidos tanto por una PKI empresarial existente como utilizando AWS Private Certificate Authority, lo que lo hace lo suficientemente flexible para integrarse con infraestructuras de seguridad actuales.


Probando IAM Roles Anywhere

Veamos un ejemplo donde utilizaremos una CA privada/local para generar certificados y configurar un servidor on-premises para acceder a un bucket de S3 e interactuar con objetos usando IAM Roles Anywhere. En este ejemplo vamos a:

  • Generar certificados para una CA privada/local

  • Establecer un trust anchor entre AWS y nuestra CA

  • Crear y configurar un Role

  • Configurar un Profile

  • Generar certificados para nuestro servidor on-premises

  • Configurar el profile en el servidor

  • Probar acceso a servicios de AWS



Paso 1 - Generar certificados para una CA privada/local

Lo primero que necesitamos hacer es generar una clave privada para nuestra CA, que llamaremos ca.key. Podemos generarla con OpenSSL, y es muy importante almacenarla de forma segura.

openssl genrsa -out ca.key 4096

Luego, creamos un archivo de configuración llamado ca.cnf, donde definimos los datos de la organización. Ejemplo:

[ req ]

default_bits       = 4096

prompt             = no

default_md         = sha256

distinguished_name = dn

x509_extensions    = v3_ca


[ dn ]

C  = AR

ST = Buenos Aires

L  = Pergamino

O  = Teracloud

OU = DevOps

CN = Facundo Montero

emailAddress = facundo.montero@teracloud.io

[ v3_ca ]

basicConstraints = critical, CA:TRUE, pathlen:0

keyUsage = critical, keyCertSign, cRLSign

subjectKeyIdentifier = hash

authorityKeyIdentifier = keyid:always

Finalmente, usando la clave privada y el archivo de configuración, generamos el certificado público de la CA (ca.crt), definiendo también su período de validez:

openssl req -new -x509 \\n  -days 365 \\n  -key ca.key \\n  -out ca.crt \\n  -config ca.cnf\n


Paso 2 - Establecer un trust anchor entre AWS y nuestra CA

Para acceder a la configuración de IAM Roles Anywhere desde la consola, debemos ir al final de la sección de Roles en IAM.


identity-and-access-management-access

Para que AWS reconozca nuestra CA como válida y establezca confianza, necesitamos configurar el certificado público (ca.crt) en Roles Anywhere. Para esto:


configure-the-CAs-public-certificate
  • Definimos un nombre para la relación de confianza

  • Indicamos que es un certificado externo

  • Pegamos el contenido del archivo ca.crt


Paso 3 - Crear y configurar un Role

Ahora debemos crear un IAM Role, especificando durante su creación que será utilizado para Roles Anywhere.


create-an-IAM-Role

Luego seleccionamos las políticas que tendrá el Role. En este ejemplo usamos la política administrada AmazonS3FullAccess.


select-the-policies-that-the-Role-will-have-permission-to

Finalmente, definimos un nombre para el Role y verificamos que tenga una Trust Policy que permita a Roles Anywhere asumirlo.


define-a-name-for-the-role

Paso 4 - Configurar un Profile

Una vez creado el Role, debemos crear un Profile en Roles Anywhere.


create-a-profile-in-roles-anywhere

Ahí definimos:

  • Un nombre

  • El Role creado previamente


Opcionalmente, podemos:

  • Configurar una Session Policy para limitar permisos

  • Definir la duración de la sesión (por defecto, 1 hora)

Trust-Anchor-and-Profile-values ​-configured

Paso 5 - Generar certificados para el servidor on-premises


Ahora generamos los certificados para el servidor que usará el profile, firmados por la CA creada anteriormente.

Primero, creamos server.cnf con los datos del servidor:

[ req ]

default_bits       = 2048

prompt             = no

default_md         = sha256

distinguished_name = dn

x509_extensions    = v3_ca


[ dn ]

C  = AR

ST = Buenos Aires

L  = Pergamino

O  = Teracloud

OU = DevOps

CN = mi-servidor

emailAddress = facundo@jcaii.ca

[ v3_ca ]

basicConstraints = critical, CA:FALSE

keyUsage = critical, digitalSignature, keyEncipherment

subjectKeyIdentifier = clientAuth

authorityKeyIdentifier = hash

Luego generamos la clave privada:

openssl genrsa -out server.key 2048

Generamos el CSR:

openssl req -new 

-key server.key \ 

-out server.csr \ 

-config server.cnf

Firmamos el certificado:

openssl x509 -req \ 

-in server.csr \ 

-CA ca.crt \ 

-CAkey ca.key \ 

-CAcreateserial \ 

-out server.crt \ 

-days 365 \

-sha256 \ 

-extfile server.cnf \ 

-extensions v3_req

Verificamos la cadena de confianza:

openssl verify -CAfile ca.crt server.crt

Luego subimos server.crt y server.key al servidor, por ejemplo en: /etc/aws/rolesanywhere/


Paso 6 - Configurar el profile en el servidor

Debemos instalar la herramienta Signing Helper para obtener credenciales temporales:


 curl -Lo aws_signing_helper https://rolesanywhere.amazonaws.com/releases/1.7.2/X86_64/Linux/Amzn2023/aws_signing_helper

chmod +x aws_signing_helper

sudo mv aws_signing_helper /usr/local/bin/

Luego configuramos el profile en ~/.aws/config:

[profile mi-servidor]

region = us-east-1

credential_process = /usr/local/bin/aws_signing_helper credential-process --region us-east-1 --certificate /etc/aws/rolesanywhere/server.crt --private-key /etc/aws/rolesanywhere/server.key --trust-anchor-arn arn:aws:rolesanywhere:us-east-1:756003157369:trust-anchor/bcn5fdc2-56u3-4d55-a4a3-932c90fcc63b --profile-arn

 arn:aws:rolesanywhere:us-east-1:756003157369:profile/4e1C84s0-c20b-4p07t-0983r-8744912 --role-arn arn:aws:iam::756003157369:role/EjemploRolesAnywhere

Paso 7 - Probar acceso a servicios de AWS


Una vez que todo está configurado, necesitamos probar el profile en el servidor y verificar que funcione correctamente. Para esto, podemos usar la AWS CLI y comprobar que la identidad sea válida:


aws sts get-caller-identity --profile mi-servidor

{

    "UserId": "DREAZS353SACNNSMMSZPM:8713b1b390710894f86205281ca62c028367bc06",

    "Account": "756003157369",

    "Arn": "arn:aws:sts::756003157369:assumed-role/EjemploRolesAnywhere/8713b1b390710894f86205281ca62c028367bc06"

}

Una vez verificada la identidad, podemos listar el contenido de un bucket en nuestra cuenta o subir un archivo:

aws s3 ls s3://your-bucket --profile mi-servidor


aws s3 cp objeto.txt s3://your-bucket/objeto.txt --profile mi-servidor


También podemos usar el profile desde un script en Python con boto3. Este es un ejemplo de cómo subir un archivo a un bucket. Por defecto, intentará obtener el nombre del bucket y los valores del profile desde las variables de entorno del sistema; si no los encuentra, utilizará los valores definidos en el script:

import os

import boto3

from botocore.exceptions import BotoCoreError, ClientError

BUCKET_NAME = os.environ.get("BUCKET_NAME", "your-bucket")

AWS_PROFILE = os.environ.get("AWS_PROFILE", "mi-servidor")

FILE_NAME = "objeto.txt"

OBJECT_NAME = "objeto.txt"

def upload_file():   

try:       

session = boto3.Session(profile_name=AWS_PROFILE)

s3 = session.client("s3")

s3.upload_file(FILE_NAME, BUCKET_NAME, OBJECT_NAME)        print(f"Archivo '{FILE_NAME}' subido a s3://{BUCKET_NAME}/{OBJECT_NAME}")    except FileNotFoundError:       

print("El archivo no existe")   

except (BotoCoreError, ClientError) as e:       

print(f"Error al subir el archivo: {e}")

if name == "__main__":   

upload_file()


Conclusión

Este ejemplo muestra lo simple que es configurar IAM Roles Anywhere en un servidor. Una vez configurado, puede utilizarse igual que un profile estándar de AWS basado en claves de acceso, lo que facilita su adopción en workflows existentes.

Sin embargo, la principal ventaja está en su modelo de seguridad. Al utilizar AWS Security Token Service, IAM Roles Anywhere provee credenciales temporales que se rotan automáticamente.

Esto elimina la necesidad de gestionar claves de acceso de larga duración, reduciendo la carga operativa y disminuyendo significativamente el riesgo asociado a la filtración de credenciales.



facundo-montero


Facundo Montero

Cloud Engineer

 
 
bottom of page