Sunteți pe pagina 1din 9

Generador de API Keys

1) Generador

El presente documento describe los recursos que se tienen que crear para poder generar el proceso de
autenticacin usando Access Keys.

1.1. Introduccin

1.1.1. API Keys

A los usuarios que se autentiquen a travs de Access Keys, se les generar un API Key. Estas API Keys nos
permitirn:

Identificar al usuario
Poder establecer reglas de throttling
Configurar planes de consumo (usage plans) para limitar el nmero de peticiones que cada usuario puede
efectuar hacia nuestras APIs.

Nota: Se tiene un Soft-Limit para el nmero de API Keys por cuenta, el cual es de 500. Sin embargo, este lmite podr ser
incrementado a travs de un ticket al portal de soporte.

Vamos a poder ver estos API Keys dentro de API Gateway, en la seccin de API Keys.

Imagen 1 - API Keys en API Gateway


1.1.2. Custom Authorizer

En API Gateway, se puede crear una funcin que nos ayude a realizar los procesos de autenticacin que
nosotros necesitemos. De esta manera, podremos adaptar esta funcin de acuerdo a nuestros
requerimientos. Esta es conocida como Custom Authorizer y nos va a estar permitiendo realizar la
autenticacin de los usuarios hacia el API, utilizando tanto el API-Key como un Secret Key, que solo el
usuario deber conocer.

Estos Custom Authorizers se definen a nivel de API, por lo que podramos tener diferentes endpoints para
las APIs y cada uno con un Authorizer diferente.

Imagen 2 - Flujo de Custom Authorizer

1.2. Implementacin

1.2.1. Tabla de Dynamo

Las API Keys sern guardadas en una tabla de Dynamo, de donde se podr consultar la informacin del
usuario.

Esta tabla solo necesitar un campo obligatorio, que es el HashKey que ser utilizado para las bsquedas
cuando el Custom Authorizer requiera validar al usuario que es recibido. Este valor es SecretHash.
Imagen 3 - Creacin de Tabla en Dynamo

Adicionalmente, para ambientes de desarrollo, podemos reducir la capacidad de lectura/escritura de la


tabla de Dynamo, as como el AutoScaling de la tabla. En ambientes de produccin, se recomienda
incrementar sobre todo las lecturas.

Imagen 4 - Ajuste de unidades lecura/escritura

1.2.2. Creacin del rol en Lambda

a) Vamos ahora a permitir a la funcin Lambda, escribir valores en esta tabla. Para ello, necesitamos ir al
servicio de IAM y crear un rol nuevo:

Imagen 5 - Creacin de Rol para Lambda


b) Seleccionamos "LambdaBasicExecutionPolicy", la cual permitir a la funcin de lambda poder enviar logs
de su ejecucin hacia CloudWatch

Imagen 6 - Seleccin de Poltica de Ejecucin

c) Damos un nombre al rol

Imagen 7 - Nombre del Rol

d)
Create Role

e) Ahora, hay que seleccionar el rol nuevamente para poder agregar una Policy. Esto es con el fin de otorgar
permisos al recurso de poder editar la tabla de Dynamo, as como poder generar API Keys en API Gateway.
Para eso, una vez en el rol, seleccionamos Inline Policies

Imagen 8 - Agregando 'Inline Policy' al rol


f) Utilizar la siguiente Policy. Es necesario sustitur las XXXXXXXXXXXX por el nmero de cuenta y ajustar el
nombre de la tabla de Dynamo

{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DynamoApiKeyTable",
"Effect": "Allow",
"Action": [
"dynamodb:PutItem"
],
"Resource": [
"arn:aws:dynamodb:us-east-1:XXXXXXXXXXXX:table/API-Keys-Dev"
]
},
{
"Sid": "ApiGwKeys",
"Action": [
"apigateway:POST"
],
"Effect": "Allow",
"Resource": [
"arn:aws:apigateway:*::/apikeys"
]
}
]
}

1.2.3. Creacin de la funcin Lambda

a) Seleccionamos Create Lambda Function y escogemos Blank Function

b) En Triggers, seleccionamos Next

c) Seleccionamos como Runtime Python 2.7, y en la seccin de cdigo pegamos el que viene en
GenerateClient.py

Imagen 9 - Creando la funcin Lambda


d) Configuramos los parmetros necesarios para ejecutar nuestra funcin, al dar de alta una variable de
ambiente que tendr el nombre de nuestra tabla de Dynamo. Tambin seleccionamos el rol que
previamente habamos creado:

e) Create Function

f) Para probar nuestra funcin, usamos Test. Nos pedir configurar un Test Event. Es en ese evento donde se
podrn definir los parmetros que va a usar la funcin para generar el API Key y su Secret Key. El evento
deber ser definido con la siguiente estructura:

{
"clientName": "Test-Client-Dev",
"clientDescription": "Cliente de prueba"
}

g) Save & Test

h) La funcin Lambda nos regresar un objeto JSON con el Access Key (API-Key) y el Secret Key.
2) Autenticacin

Utilizando el Custom Authorizer, podremos ahora autenticar las peticiones hacia el API, una vez que este
valida las credenciales que se proporcionan con la peticin.

2.1. Custom Authorizer

2.1.1. Creacin del Rol Para Funcin Lamba

Seguimos los pasos de la seccin 1.2.2, solo que, en esta ocasin, esta ser la Inline Policy que
crearemos:

{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DynamoApiKeyTableRead",
"Effect": "Allow",
"Action": [
"dynamodb:GetItem"
],
"Resource": [
"arn:aws:dynamodb:us-east-1:XXXXXXXXXXXX:table/API-Keys-Dev"
]
}
]
}

Tambin es necesario agregar a API Gateway como Trust Relationships para el rol:

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": [
"lambda.amazonaws.com",
"apigateway.amazonaws.com"
]
},
"Action": "sts:AssumeRole"
}
]
}
2.1.2. Funcin Lambda

De nueva cuenta es necesario crear una funcin lambda, que en este caso ser quien validar que el Access
Key y el Secret Key sean un par vlido para proporcionar acceso a la API.

Nota 1: La funcin de Custom Authorizer crea una Policy sobre el API. Esto es, elabora los permisos necesarios para realizar
un Invoke al recurso y mtodo necesarios.

Nota 2: Esta funcin puede adaptarse a los requerimientos de autenticacin para poder proporcionar acceso de manera
granular hacia ciertos recursos y mtodos

Es necesario seguir de nueva cuenta los pasos para definir la funcin de la seccin 1.2.3. En esta ocasin,
seleccionaremos el rol creado en el paso anterior. As mismo, tambin es necesario definir una variable
de ambiente clientTable con el nombre de la tabla. En esta ocasin, utilizaremos el cdigo que viene en la
funcin customAuthKeys.py

2.1.3. Custom Authorizer en API Gateway

Finalmente, en API Gateway habilitaremos la funcin que hemos creado para que nos ayude a autenticar
las peticiones.

a) Dentro de nuestra API, seleccionamos Custom Authorizers y creamos uno nuevo:


b) Llenamos los valores necesarios, donde daremos de alta la funcin lambda as como el rol que previamente
habamos creado

S-ar putea să vă placă și