Construyendo APIs Seguras y Escalables

41
© 2016, Amazon Web Services, Inc. or its Affiliates. All rights reserved. Construyendo APIs Seguras y Escalables Demostración usando Amazon API Gateway y AWS Lambda Mauricio Muñoz Enterprise Solutions Architect, LATAM Abril, 2016

Transcript of Construyendo APIs Seguras y Escalables

Page 1: Construyendo APIs Seguras y Escalables

© 2016, Amazon Web Services, Inc. or its Affiliates. All rights reserved.

Construyendo APIs Seguras y Escalables

Demostración usando Amazon API Gateway y AWS Lambda

Mauricio MuñozEnterprise Solutions Architect, LATAM

Abril, 2016

Page 2: Construyendo APIs Seguras y Escalables

¿Qué vamos a ver en esta sesión?

1. Nuevo modelo de desarrollo: Completamente gerenciado

2. Declarar APIs con Amazon API Gateway3. Lógica de la aplicación en AWS Lambda4. APIs de Login y Registro, utilizando Amazon Cognito5. Autorización utilizando AWS IAM (STS)6. Generación de SDK para cliente

Page 3: Construyendo APIs Seguras y Escalables

Totalmente Gerenciado

API: Modelo Totalmente gerenciado

InternetMobile appsFunciones

AWS Lambda

AWS

API Gateway cache

Endpoints en Amazon EC2

Cualquier otro endpoint público

Amazon CloudWatch

Amazon CloudFront

API Gateway

API Gateway

Otros Servicios

AWS

FuncionesAWS Lambda

Page 4: Construyendo APIs Seguras y Escalables

Puntos Principales

AWS Lambda + Amazon API Gateway =

0 (cero) infraestructura para administrar

Seguridad = Prioridad:

Aproveche la integración con AWS Identity and Access Management

Swagger + client SDK = Automatización de workflows

Page 5: Construyendo APIs Seguras y Escalables

Servicios que vamos a utilizar

Amazon API Gateway AWS Lambda Amazon Cognito Amazon DynamoDB

Publica las APIs y enruta las llamadas

Ejecuta: Lógica de autenticación y lógica

de la aplicación

Gerencia de identidades y entrega

credenciales AWS

Almacén de datos:Usuarios y Mascotas

Page 6: Construyendo APIs Seguras y Escalables

Arquitectura de la aplicación:Mascotas

Page 7: Construyendo APIs Seguras y Escalables

No-Autenticadas

Flujo de las llamadas

Mobile apps AWS Lambda lambdaHandler

Register (/user-POST)

Login (/login-POST)API Gateway

Autenticadas

Mobile apps AWS Lambda lambdaHandler

ListPets (/pets – GET)

GetPet (/pets/{petId}-GET

API Gateway

Assume Role

CreatePet (/pets – POST)

Sigv4Usando las

credenciales AWSInvoca con las

credenciales AWS Autorizado por IAM

Recibe credenciales AWS

APIs:/user/login

APIs:/pets

/pets/{petId}

Table: petstoreapp-users

IdentityPool: PetStoreApp

Table: petstoreapp-pets

Page 8: Construyendo APIs Seguras y Escalables

¿Qué tiene de diferente este modelo?

“Serverless” – La aplicación puede usar muchos servidores, pero no necesito administrar ninguno.

Autorización: Realizada por AWS, basada en Roles

Definición e implementación de APIs usando Swagger

Page 9: Construyendo APIs Seguras y Escalables

Parte I: APIs – Definición y Publicación

Page 10: Construyendo APIs Seguras y Escalables

Amazon API Gateway - Conceptos

Gerenciamiento de implementaciones – múltiples versiones y ambientes (stages)

Definición y Publicación de APIs

Usa las credenciales de AWS IAM para el control de

acceso a sus recursos (Como si fueran servicios

AWS)

Aprovecha los mecanismos de Autorización de AWS

Gestión de tráfico de red

Protección DDoS y “Throttling”

Page 11: Construyendo APIs Seguras y Escalables

Modelo de API: Recursos, Métodos e Integraciónrest-api-id

resource-id

ARN

Page 12: Construyendo APIs Seguras y Escalables

Recursos y Métodos• POST – Recibe usuario y

contraseña; registra (crea) el nuevo usuario en DynamoDB

/users

• POST – Recibe usuario y contraseña; autentica; solicita credenciales AWS a cognito y las retorna a la App

/login

• POST – Recibe los datos de la mascota;los guarda en DynamoDB

• GET – Retorna una lista de mascotas desde DynamoDB

/pets

• GET – Retorna la información de la mascota, a partir de su petID/pets/{petId}

No Autenticado

Autenticado

Page 13: Construyendo APIs Seguras y Escalables

rest-api-idresource-id

ARN

Usando Swagger para automatizar el proceso

Page 14: Construyendo APIs Seguras y Escalables

Method Response

Integration (Req. & Resp)

Method Request

Method

Usando Swagger para automatizar el proceso

/users: post: summary: Registers a new user consumes: - application/json produces: - application/json parameters: - name: NewUser in: body schema: $ref: '#/definitions/User’ x-amazon-apigateway-integration: type: aws uri: arn:aws:apigateway:us-east-1:lambda:path/2015-03-31... credentials: arn:aws:iam::964405213927:role/pet_store_lambda_invoke ... responses: 200: schema: $ref: '#/definitions/RegisterUserResponse'

Page 15: Construyendo APIs Seguras y Escalables

Usando Swagger para automatizar el proceso

Usando AWS CLIaws apigateway import-rest-api --body file://swagger.yaml

Usando la Consola

Page 16: Construyendo APIs Seguras y Escalables

Beneficios de usar Swagger

• Las definiciones de las API permanecen en su repositorio, con el resto del código de la aplicación.

• Pueden ser usadas en conjunto con otras utilidades de Swagger (por ejemplo, generación de documentación).

• Las APIs pueden ser importadas e implementadas en su propio script.

Page 17: Construyendo APIs Seguras y Escalables

Parte II: Ejecución de la lógica de la aplicación (Back-End)

Page 18: Construyendo APIs Seguras y Escalables

Escalabilidad y Alto desempeño; Eficiente y Económica

No hay infraestructura para administrar

Pague solo por lo que use: Lambda adecúa automáticamente la

capacidad para responder a los volúmenes de solicitudes.

Use su propio código

Funciones Lambda : Ejecución de código basada en eventos, Stateless

Ejecute su código en una variedad de lenguajes estándar. Use threads,

procesos, archivos y shell scripts, de la forma usual.

Enfóquese en su lógica de negocio. Cargue su código y AWS Lambda se

encarga del resto.

AWS Lambda - Conceptos

Page 19: Construyendo APIs Seguras y Escalables

Lambda handler.

lambdaHandler (en el código

Java)

Acción: Register

Acción: Login

Acción:Create Pet

Acción:Get Pet

Gestión de identidades

Pet store database

Amazon API Gateway

Integration request

Userdatabase

Page 20: Construyendo APIs Seguras y Escalables

Excepciones mapeadas a HTTP Status.Register action

Login action

Create Pet action

Get Pet action

BadRequestExceptionBAD_REQUEST +

Stack Trace

InternalErrorExceptionINTERNAL_ERROR +

Stack TracelambdaHandler (en el código

Java)

Amazon API Gateway

responses: "default": statusCode: "200" "BAD.*": statusCode: "400" "INT.*": statusCode: "500"

Page 21: Construyendo APIs Seguras y Escalables

Mapping Template es una herramienta poderosa

Encuentre más acerca de nuestros ”mapping templates”:

http://amzn.to/1L1hSF5

Page 22: Construyendo APIs Seguras y Escalables

Parte III: Gerenciando identidades y autorizando accesos

Page 23: Construyendo APIs Seguras y Escalables

Amazon Cognito - Conceptos

Gestión de usuarios autenticados e invitados,

entre diferentes proveedores de identidad

Gestión de Identidad

Sincroniza datos de los usuarios entre dispositivos

y plataformas, via nube

Sincronización de datos

Facilita el acceso seguro a servicios AWS desde

plataformas y dispositivos móviles

Acceso seguro a recursos AWS

Page 24: Construyendo APIs Seguras y Escalables

Definición de las APIs (No Autenticadas)• POST

• Recibe un usuario y contraseña• Encripta la contraseña (con salt) y registra la

cuenta del usuario en DynamoDB• Hace una llamada a Cognito, para registrar

el usuario y generar las credenciales• Retorna las informaciones de usuario y

credenciales temporales

/users

• POST• Recibe un usuario y contraseña• Autentica el usuario (contra la información

en DynamoDB)• Si la autenticación es exitosa, hace una

llamada a Cognito para generar credenciales• Retorna las credenciales temporales

/login

Page 25: Construyendo APIs Seguras y Escalables

Recibiendo las credenciales temporales.

Llamada a la API login

(sin autenticación)

Cliente API Gateway

Backend

/login Login action

BD Usuarios

Credenciales OK Solicita OIDC

Obtiene el token OpenID

Recibe las credenciales

AWS para firmar las llamadas API

Usando el token OIDC, solicita

credenciales AWSGenera las

credenciales AWS

Access key + secret key +

session token

/login

1.

2.

3.

Page 26: Construyendo APIs Seguras y Escalables

Roles (AuthZ) en Cognito

Page 27: Construyendo APIs Seguras y Escalables

Autorización de las llamadas API

Page 28: Construyendo APIs Seguras y Escalables

APIs /pets (necesitan AuthN y AuthZ)• POST

• Recibe información de la mascota (nombre, tipo)

• Graba en DynamoDB• Retorna el petID creado

• GET• Retorna la lista de mascotas almacenada

en DynamoDB (incluyendo el petID)

/pets

• GET• Recibe (en el path) el petID• Usando mapping templates, se pasa el

parámetro petID a la función Lambda• Busca la información de la mascota en

DynamoDB• Retorna la información de la mascota

/pets/{petId}

Page 29: Construyendo APIs Seguras y Escalables

API Gateway protege las llamadas APIrest-api-id

resource-id

ARN

Page 30: Construyendo APIs Seguras y Escalables

API Gateway repasa las autorizaciones

credentials:

arn:aws:iam::*:user/*

En la consola En el archivo Swagger

Page 31: Construyendo APIs Seguras y Escalables

El Rol IAM define la autorización{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "dynamodb:GetItem", "dynamodb:PutItem", "dynamodb:Scan", "lambda:InvokeFunction", "execute-api:invoke" ], "Resource": [ "arn:aws:dynamodb:us-east-1:xxxxxx:table/test_pets", "arn:aws:lambda:us-east-1:xxxxx:function:PetStore”, "arn:aws:execute-api:us-east-1:xxxx:API_ID/*/POST/pets" ] } ]}

En este ejemplo, el rol permite accesos a:• DynamoDB• API Gateway• Lambda

Y permite definir acceso solamente a recursos específicos en esos servicios

Page 32: Construyendo APIs Seguras y Escalables

Y todavía hay más: Fine-grained access permissions

InternetCliente

API Gateway

Funciones AWS Lambda

Amazon CloudFront

DynamoDB

CognitoId2

…"Condition": { "ForAllValues:StringEquals": { "dynamodb:LeadingKeys": [”${cognito-identity.amazonaws.com:sub}"], "dynamodb:Attributes": [ "UserId","GameTitle","Wins","Losses", "TopScore","TopScoreDateTime” ] }, "StringEqualsIfExists": { "dynamodb:Select": "SPECIFIC_ATTRIBUTES” }}…

Ejecuta con el rol definido

UserID Wins Losses

cognitoId1 3 2

cognitoId2 5 8

cognitoId3 2 3

Informaciones de contexto (Cognito ID) son repasadas …

Con eso, AWS Lambda & DynamoDB seguirán coherentemente la política de acceso

Page 33: Construyendo APIs Seguras y Escalables

Flujo autenticado completo

Mobile apps AWS Lambda lambdaHandlerAPI Gateway

Sigv4

Usa los mismos permisos de las credenciales de

usuario

Llamadas a los servicios son autorizadas

usando un rol IAM

Documentación acerca de FGAC:

http://amzn.to/1YkxcjR

DynamoDB

Page 34: Construyendo APIs Seguras y Escalables

Beneficios de usar AWS IAM (AuthN & AuthZ)

• Separación de funciones – la estrategia de autorización se delega a un servicio dedicado

• Gestión centralizada de acceso, a través de un conjunto único de políticas

• Credenciales y Roles pueden ser modificadas o deshabilitadas con una llamada API

Page 35: Construyendo APIs Seguras y Escalables

Parte IV: Manejo de credenciales AWS en el cliente

Page 36: Construyendo APIs Seguras y Escalables

Generación de SDK desde la consola (1-click)

rest-api-id

Page 37: Construyendo APIs Seguras y Escalables

El SDK de cliente declara todos los métodos

Page 38: Construyendo APIs Seguras y Escalables

AWSCredentialsProvider.Implementación de AWSCredentialsProvider

El método refresh() es llamado cuando el cliente necesite nuevas credenciales

Page 39: Construyendo APIs Seguras y Escalables

Beneficios del SDK generado

El SDK de cliente contiene la lógica para:

• Firmar las llamadas API usando sigv4

• Manejar respuestas reguladas (throttled)

• Marshal/unmarshal solicitudes y respuestas en objetos

Page 40: Construyendo APIs Seguras y Escalables

AWS Lambda + Amazon API Gateway =

0 (cero) infraestructura para administrar

Seguridad = Prioridad:

Aproveche la integración con AWS Identity and Access Management

Swagger + client SDK = Automatización de workflows

¿Qué vimos hoy?

Este ejemplo está disponible en la cuenta GitHub AWSLabshttps://github.com/awslabs/api-gateway-secure-pet-store

Page 41: Construyendo APIs Seguras y Escalables

¡Gracias !Este ejemplo está disponible en la cuenta GitHub AWSLabs

https://github.com/awslabs/api-gateway-secure-pet-store