Esta es la guía técnica completa de los recursos que Frust despliega para conectarse con tu cuenta de AWS. Aquí encontrarás todos los stacks de CloudFormation, roles IAM y permisos involucrados — tanto en la evaluación gratuita como en el servicio de producción — junto con una explicación de qué puede y qué no puede hacer Frust con esos accesos.
En AWS, un Principal es la identidad autorizada para realizar acciones — en este caso, la cuenta de AWS que Frust utiliza para acceder a su entorno. Al desplegar un stack de CloudFormation de Frust, se crea un rol IAM en su cuenta que solo este Principal específico puede asumir. Esto significa que ninguna otra cuenta o usuario de AWS puede utilizar ese rol.
Todo acceso de Frust a su cuenta de AWS se realiza a través del siguiente principal de AWS, que asume roles creados en su cuenta mediante CloudFormation:
"Principal": {
"AWS": "arn:aws:iam::064816466676:root"
}Este stack se instala durante la evaluación gratuita.
Se despliega desde la Guía de Onboarding y crea un rol IAM de solo lectura. Su propósito es permitir a Frust analizar el consumo cloud del cliente durante el período de prueba, sin modificar ningún recurso. Guía de Onboarding.
{
"Type": "AWS::IAM::Role",
"Properties": {
"RoleName": "FrustEvaluation",
"AssumeRolePolicyDocument": {
"Principal": { "AWS": "arn:aws:iam::064816466676:root" },
"Condition": { "StringEquals": { "sts:ExternalId": "<unique-per-client>" } }
},
"Policies": [
{
"PolicyName": "GeneralPolicy",
"Action": [
"ce:Describe*", "ce:Get*", "ce:List*",
"ec2:Describe*",
"savingsplans:Describe*", "savingsplans:List*",
"rds:Describe*", "rds:List*"
]
}
]
}
}Permisos acotados a lectura de costos, savings plans y configuración de instancias EC2 y RDS. El rol puede ser eliminado en cualquier momento desde la consola AWS. Al contratar el servicio completo, este stack es reemplazado por el ClientStack — ambos roles tienen nombres distintos (FrustEvaluation vs FrustCloudformation) y no generan conflicto.
Estos stacks se instalan solo al contratar el servicio.
Frust despliega hasta dos stacks de CloudFormation según los servicios contratados. Cada stack crea roles IAM específicos y limitados.
Este stack se despliega en la cuenta principal de AWS del cliente (Management Account). Crea un rol IAM llamado FrustCloudformation que permite a Frust leer metadatos de costos, uso y recursos.
{
"Type": "AWS::IAM::Role",
"Properties": {
"RoleName": "FrustCloudformation",
"AssumeRolePolicyDocument": {
"Principal": { "AWS": "arn:aws:iam::064816466676:root" },
"Condition": { "StringEquals": { "sts:ExternalId": "<unique-per-client>" } }
},
"Policies": [
{
"PolicyName": "GeneralPolicy",
"Action": [
"application-autoscaling:Describe*",
"autoscaling:Describe*",
"ce:Describe*", "ce:Get*", "ce:List*",
"cloudwatch:GetMetricData",
"cloudformation:Describe*",
"pricing:DescribeServices",
"pricing:GetAttributeValues",
"pricing:GetProducts",
"savingsplans:Describe*", "savingsplans:List*",
"organizations:List*", "organizations:Describe*",
"organizations:InviteAccountToOrganization",
"aws-portal:ViewBilling", "aws-portal:ViewUsage"
]
},
{
"PolicyName": "EC2Policy",
"Action": [
"ec2:Describe*",
"ecs:DescribeContainerInstances", "ecs:List*",
"eks:Describe*", "eks:List*"
]
},
{
"PolicyName": "RDSPolicy",
"Action": ["rds:Describe*", "rds:List*"]
},
{
"PolicyName": "RedShiftPolicy",
"Action": ["redshift:Describe*"]
},
{
"PolicyName": "PolicyES",
"Action": ["es:Describe*", "es:List*"]
},
{
"PolicyName": "ElasticCachePolicy",
"Action": ["elasticache:List*", "elasticache:Describe*"]
}
]
}
}Seguridad: El rol utiliza una condición ExternalID (sts:ExternalId) única por cliente para prevenir ataques de tipo confused deputy. Solo el principal de Frust (arn:aws:iam::064816466676:root) puede asumir este rol.
Este stack incluye organizations:InviteAccountToOrganization, que Frust utiliza para vincular sus cuentas de facturación a la organización del cliente y habilitar el uso compartido de Savings Plans. Ver sección 4 para el detalle del flujo.
El permiso cloudformation:Describe* aplica a todos los stacks de la cuenta, no solo a los de Frust. Frust lo utiliza exclusivamente para verificar que sus propios stacks están correctamente desplegados y para detectar cambios de configuración que pudieran afectar el servicio. No se almacena ni procesa información sobre otros stacks del cliente.
El permiso ec2:Describe* permite a Frust entender la arquitectura cloud del cliente y detectar cambios en el entorno que pudieran requerir ajustes en los contratos de ahorro vigentes.
Este stack configura un reporte de Costo y Uso (CUR2) en la cuenta del cliente y lo entrega a un bucket S3 privado. Frust recibe acceso de lectura a este bucket para recuperar datos de facturación.
{
"Resources": {
"CURS3Bucket": {
"Type": "AWS::S3::Bucket",
"Properties": {
"BucketName": "cur-reports-{AccountId}",
"PublicAccessBlockConfiguration": {
"BlockPublicAcls": true,
"BlockPublicPolicy": true,
"IgnorePublicAcls": true,
"RestrictPublicBuckets": true
},
"LifecycleConfiguration": {
"TransitionToGlacierAfterDays": 30,
"ExpirationInDays": 180
}
}
},
"CURS3BucketPolicy": {
"Type": "AWS::S3::BucketPolicy",
"Properties": {
"Principal": {
"AWS": "arn:aws:iam::064816466676:root",
"Service": [
"billingreports.amazonaws.com",
"bcm-data-exports.amazonaws.com"
]
},
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:GetBucketPolicy",
"s3:GetBucketLocation",
"s3:ListBucket"
]
}
},
"CUR2Report": {
"Type": "AWS::BCMDataExports::Export",
"Properties": {
"Format": "PARQUET",
"Compression": "PARQUET",
"TimeGranularity": "HOURLY",
"IncludeResources": true,
"IncludeSplitCostAllocationData": true
}
}
}
}Cuando el cliente opera una organización AWS multi-cuenta, el servicio de Frust opera desde cuentas propias de Frust que se vinculan a la organización del cliente. Para que esto funcione correctamente, la cuenta de administración (MPA) del cliente no debe bloquear las siguientes acciones en las cuentas miembro de la organización:
Acciones requeridas en cuentas miembro de Frust:
{
"FrustIAMRole @ Customer MPA": {
"Action": [
"organizations:List*",
"organizations:Describe*",
"organizations:InviteAccountToOrganization"
]
},
"FrustIAMRole @ Member (Internal) Accounts": {
"Action": [
"organizations:AcceptHandshake",
"organizations:DeclineHandshake",
"organizations:LeaveOrganization"
]
}
}SCPs que pueden bloquear el servicio
Si la organización del cliente tiene Service Control Policies (SCPs) que deniegan alguna de las acciones anteriores a nivel organizacional, el servicio de Frust no podrá operar correctamente. Esto es especialmente común en organizaciones con políticas de seguridad estrictas.
Frust puede ayudar
Si existe un SCP que bloquea estas acciones, Frust puede asistir en la configuración de un SCP personalizado que permita explícitamente que las cuentas de Frust ejecuten estas acciones, sin afectar las restricciones aplicadas al resto de la organización.
Por qué Frust necesita organizations:InviteAccountToOrganization
El modelo de servicio de Frust funciona adquiriendo Savings Plans y Reserved Instances en cuentas de facturación propias y compartiéndolos con la organización del cliente para generar ahorros. Para que AWS permita ese uso compartido, las cuentas de facturación de Frust deben pertenecer a la misma organización AWS que el cliente, al menos temporalmente durante la activación. El permiso organizations:InviteAccountToOrganization permite a Frust iniciar esa invitación desde la cuenta de administración del cliente. El proceso completo es: (1) Frust solicita la invitación desde la MPA del cliente, (2) la cuenta de Frust acepta la invitación, (3) AWS habilita el uso compartido de compromisos entre ambas organizaciones. En ningún momento Frust accede a datos del cliente a través de este flujo — es una operación exclusivamente de membresía organizacional.
La gran mayoría de los permisos son de solo lectura (Describe*, List*, Get*). Como excepción, un conjunto reducido de acciones de escritura existe exclusivamente para la gestión del ciclo de vida de los compromisos cloud (organizations:InviteAccountToOrganization, organizations:AcceptHandshake, organizations:LeaveOrganization) — estas acciones no se ejercen sobre los datos ni recursos del cliente, sino sobre la membresía de la organización AWS de Frust. Fuera de esas excepciones, Frust explícitamente no puede:
La integración de Frust genera un impacto económico mínimo en tu cuenta. A continuación el desglose por recurso:
El único recurso que genera costo es el bucket S3 creado por el FrustCUR Stack para almacenar los reportes de facturación:
El modelo de acceso descrito en este anexo está diseñado para ser compatible con SOC 2 (Criterios de Servicios de Confianza) e ISO 27001. A continuación se presenta un mapeo punto a punto de cómo la integración de Frust aborda los requisitos de cada marco.
Toda actividad de Frust en su cuenta de AWS queda registrada automáticamente en AWS CloudTrail bajo su propia cuenta, sin ninguna configuración adicional. El cliente puede auditar o alertar sobre esta actividad en cualquier momento.
SOC 2 evalúa cinco Criterios de Servicios de Confianza: Seguridad, Disponibilidad, Integridad del Procesamiento, Confidencialidad y Privacidad. Así es como la integración de Frust aborda los criterios relevantes para este modelo de acceso:
ISO 27001 es un estándar internacional para la gestión de la seguridad de la información. Define un conjunto de controles (el catálogo Anexo A) que las organizaciones deben implementar para proteger sus activos de información. Cuando una empresa está certificada en ISO 27001, significa que un auditor independiente ha verificado que esos controles están efectivamente implementados y funcionando. El mapeo a continuación muestra qué controles específicos de ese catálogo aplican a la integración de Frust con su entorno de AWS.