Programar borrado de Access keys con EventBridge y Lambda
Tags: aws
Published: 2022-05-16 21:47:08

Cuando estamos desarrollando casi siempre usamos nuestras Access Keys para utilizar los servicios de AWS, la recomendación es siempre utilizarlas en un equipo seguro, sin embargo hay ocasiones en las que debemos compartir equipo y se nos olvida eliminar las Access Key para que la persona que use el equipo no vaya a utilizarlas. Con el fin de tener un control adicional, en este post vamos a crear una regla en **EventBridge** para que llame una función **Lambda** y borre las Access Keys cada cierto tiempo.

Servicios a utilizar:

*IAM
*Lambda
*EventBridge

Para comenzar vamos a crear algunos usuarios de prueba utilizando la CLI. Vamos a adicionarles un _path_ para poder diferenciarlos y no borrar las Access Keys de los usuarios que tengamos en nuestra cuenta.

```
aws iam create-user \
--path "/blogtest/" \
--user-name "blogtest1"

aws iam create-access-key --user-name blogtest1

aws iam create-user \
--path "/blogtest/" \
--user-name "blogtest2"

aws iam create-access-key --user-name blogtest2

aws iam create-user \
--path "/otro/" \
--user-name "blogtest3"

aws iam create-access-key --user-name blogtest3
```
Ahora que tenemos creados nuestros usuarios con sus respectivas Access Keys, vamos a crear la función **Lambda** con el código necesario para eliminar las Access Keys de los usuarios que acabamos de crear.

Vamos a la pantalla principal de **Lambda** y damos click en _Create function_

![Create Function]
(https://github.com/cecamilo00/posts/blob/circleci-project-setup/delete%20keys/create%20function.png?raw=true)

Con nuestra función creada vamos a copiar el siguiente código y damos click en el botón _Deploy_:

```
import json
import boto3

client = boto3.client('iam')


def getUsers(path):
    users =[]
    for user in client.list_users(PathPrefix = path)["Users"]:
        users.append(user["UserName"])
    
    return users
    
def deleteAccessKeys(user):
    for key in client.list_access_keys(UserName = user)["AccessKeyMetadata"]:
        client.delete_access_key(UserName=user,AccessKeyId=key["AccessKeyId"])
        

def lambda_handler(event, context):
   for user in getUsers("/blogtest/"):
       deleteAccessKeys(user)
 ```
Al método _getUsers_  le estamos enviando como parámetro _/blogtest/_ que es el path con el cual se crearon nuestros usuarios. El _path únicamente se puede definir desde la _CLI_ o el _SDK_ por lo que todos los usuarios que creamos por la consola quedan con el path _/_. Si queremos que se borren las Access Key de todos los usuarios debemos pasar al método _getUsers_ el valor _/_.

Como ya sabemos es necesario agregar los políticas necesarias al rol de la función **Lambda** para que se pueda ejecutar. Para este vamos a Configuration-Permissions y damos click en el nombre del rol.

![Modify Rol]
(https://github.com/cecamilo00/posts/blob/circleci-project-setup/delete%20keys/modify%20role.png?raw=true)

Damos click en _Create inline policy_

![Modify Rol]
(https://github.com/cecamilo00/posts/blob/circleci-project-setup/delete%20keys/create%20inline%20policy.png?raw=true)

En la pestaña JSON agregamos la siguiente política y damos click en el botón _Review Policy_:

 ```
{
  "Version": "2012-10-17",
  "Statement": {
    "Effect": "Allow",
    "Action": "iam:*",
    "Resource": "*"
  }
}
```

![Modify Rol]
(https://github.com/cecamilo00/posts/blob/circleci-project-setup/delete%20keys/review%20policy.png?raw=true)

Le damos un nombre (access_keey_users) y damos click en el botón _Create policy_. 

![Modify Rol]
(https://github.com/cecamilo00/posts/blob/circleci-project-setup/delete%20keys/create%20policy.png?raw=true)

Hasta el momento creamos la función **Lambda** y le dimos permisos para eliminar las llaves de los usuarios que tengan un _path_ especifico.

El siguiente paso es crear una regla en **EventBridge** para que nuestra función se ejecute cada cierto periodo de tiempo.

Vamos al buscador de servicios y colocamos EventBridge. Ya en la pantalla principal damos click en _Create Rule_

![Modify Rol]
(https://github.com/cecamilo00/posts/blob/circleci-project-setup/delete%20keys/create%20rule.png?raw=true)

Debemos definir el nombre de la regla y su tipo, para este caso definimos una regla de tipo Schedule (se ejecuta periódicamente)

![Define Rule]
(https://github.com/cecamilo00/posts/blob/circleci-project-setup/delete%20keys/define%20rule.png?raw=true)

Definimos la periodicidad con la cual queremos que se ejecute la función **Lambda**, para efectos de prueba, la vamos a dejar en 5 minutos.

![Periodicidad]
(https://github.com/cecamilo00/posts/blob/circleci-project-setup/delete%20keys/periodicidad.png?raw=true)

Debemos seleccionar la función Lambda que creamos y damos click en _Next_.

![Select Target]
(https://github.com/cecamilo00/posts/blob/circleci-project-setup/delete%20keys/select%20target.png?raw=true)

En la sección Tags la dejamos vació y da click en _Next_.

![Tag]
(https://github.com/cecamilo00/posts/blob/circleci-project-setup/delete%20keys/tag.png?raw=true)

Revisamos la configuración realizada y damos click en _Create rule_.

![Create Rule Final]
(https://github.com/cecamilo00/posts/blob/circleci-project-setup/delete%20keys/create%20rule%20final.png?raw=true)

![Create Rule Final]
(https://github.com/cecamilo00/posts/blob/circleci-project-setup/delete%20keys/list%20rules.png?raw=true)

Después de unos minutos podemos dar click en el nombre de la regla e ir a la pestaña _Monitoring_ para ver como ha sido su ejecución.

![Monitoring Rule]
(https://github.com/cecamilo00/posts/blob/circleci-project-setup/delete%20keys/monitoring%20rule.png?raw=true)


Los invito a comprobar que las _Access Key_ fueron borradas ingresando a IAM-Users-Seleccionar el usuario _blogtest1_ e ir a la pestaña _Security Credentials_ y modificar el código para que se borren las _Access Key_ del usuario _blogtest3_


Me pueden encontrar en:

[Camilo Cabrales](https://www.linkedin.com/in/camilo-cabrales-31a0bb53/)

# Referencias

[IAM Path](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html)

[IAM Boto3](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/iam.html#IAM.Client.list_access_keys)