Seguridad, automatización y tranquilidad con AWS Secrets Manager

Recientemente, AWS ha presentado AWS Secrets Manager. Este nuevo servicio permite proteger los datos confidenciales necesarios para acceder a tus aplicaciones, servicios y recursos de TI. También podremos rotar, administrar y recuperar fácilmente credenciales de bases de datos, claves de API y otros datos confidenciales durante todo su ciclo de vida. Además, nos permite controlar el acceso a los datos confidenciales mediante permisos específicos. Finalmente, permite auditar la rotación de datos confidenciales, de manera centralizada, para recursos de la nube de AWS, servicios de terceros y recursos locales.

Uno de los problemas más comunes identificados por las herramientas de análisis de código es la presencia de contraseñas escritas directamente en los archivos de configuración. De ahí pueden aparecer ataques de seguridad o incluso intrusiones en el sistema.

Como dijo Werner Vogels, CTO de AWS, durante el Summit de San Francisco,

con este nuevo servicio nunca más tendrás que poner un secreto en tu código

¿Qué puedo hacer con AWS Secrets Manager?

¿Qué puedo almacenar con AWS Secrets Manager?

5 pasos básicos:

AWS Secrets Manager - CAPSiDE

  1. Se crean las credenciales de la base de datos.
  2. Se almacena el secreto en SM y se activa la rotación como best practice de seguridad.
  3. La aplicación consulta a SM el secreto.
  4. SM devuelve el secreto a través de un canal seguro y lo desencripta.
  5. MyCustomApp puede conectarse a la base de datos.

Ventajas y funcionalidades de AWS Secrets Manager

Gracias a AWS Secrets Manager ya no es necesario almacenar los secretos en el propio código de la aplicación o en ficheros de configuración. Los usuarios y las aplicaciones recuperan datos confidenciales mediante llamadas a la API de AWS Secrets Manager. Así, se elimina la necesidad de incluir esta información en el mismo código.

Una de las opciones más interesantes de este nuevo servicio es que ya no tendrás que cambiar el secreto manualmente ni actualizarlo en todos los clientes. Una función de AWS Lamba realizará todos los pasos para rotar tus secretos de forma automática.

Además, una colección de servicios conocidos de AWS hace que este nuevo servicio sea más completo y seguro todavía:

AWS Secrets Manager - CAPSiDE

¿Qué diferencias hay con parameter store?

¿Cuánto cuesta?

A nivel de precio, los costes son los siguientes:

Por ejemplo, supongamos que tenemos dos secretos que almacenar: una contraseña de una base de datos y una clave de una API de un servicio de un tercero. Únicamente pagarás por secreto almacenado y por el número de peticiones que hagas a la API.

Es algo a tener en cuenta a la hora del diseño de tu aplicación para no incurrir en gastos adicionales. No es lo mismo una aplicación PHP, que consulta la BD por cada petición, que, por ejemplo, una aplicación en un tomcat con un pool de conexiones establecidas.

AWS Secrets Manager - CAPSiDE

AWS Secrets Manager – Hands on lab:

 

1. El secreto: tipo, nombre de usuario, password y recurso al que tendrá acceso

AWS Secrets Manager - CAPSiDE

2. Nombre y descripción del secreto

AWS Secrets Manager - CAPSiDE

3. Configurar rotación automática

AWS Secrets Manager - CAPSiDE

4. Confirmación y código para recuperar secreto en la aplicación

AWS Secrets Manager - CAPSiDE

 

AWS Secrets Manager - CAPSiDE

Como resultado de usar AWS Secrets Manager, ya no será necesario tener en el código el usuario y el password para conectarse a la base de datos. A través del siguiente script, escrito en Python (compatible con versiones 2.x), somos capaces de conectarnos a la base de datos. Allí, podremos leer los datos de la base de datos usando las credenciales que almacenamos en AWS Secrets Manager.

# Use this code snippet in your app.
import boto3
from botocore.exceptions import ClientError
import json
import MySQLdb


def get_secret():
    secret_name = "test/RDS"
    endpoint_url = "https://secretsmanager.eu-west-1.amazonaws.com"
    region_name = "eu-west-1"
    session = boto3.session.Session()
    client = session.client(
        service_name='secretsmanager',
        region_name=region_name,
        endpoint_url=endpoint_url
    )

    try:
        get_secret_value_response = client.get_secret_value(
            SecretId=secret_name
        )
    except ClientError as e:
        if e.response['Error']['Code'] == 'ResourceNotFoundException':
            print("The requested secret " + secret_name + " was not found")
        elif e.response['Error']['Code'] == 'InvalidRequestException':
            print("The request was invalid due to:", e)
        elif e.response['Error']['Code'] == 'InvalidParameterException':
            print("The request had invalid params:", e)
    else:
        # Decrypted secret using the associated KMS CMK
        # Depending on whether the secret was a string or binary, one of these fields will be populated
        if 'SecretString' in get_secret_value_response:
            secret = get_secret_value_response['SecretString']
            print "El secreto completo en JSON es",secret
            # Get the user name, password, and database connection information from a config file.
            database = json.loads(secret)['dbname']
            user_name = json.loads(secret)['username']
            password = json.loads(secret)['password']
            host = json.loads(secret)['host']

            # Use the user name, password, and database connection information to connect to the database
            db = MySQLdb.connect(host, user_name, password, database)
            cursor = db.cursor()
            cursor.execute("Select * from MyGuests limit 1")
            print "En la DB hay un total de ",cursor.rowcount," registro, que son :"
            for row in cursor.fetchall():
               print row
            db.close()
        else:
            binary_secret_data = get_secret_value_response['SecretBinary']
        # Your code goes here.
get_secret()

Además, recuerda que para que una instancia EC2 pueda tener acceso a AWS Secrets Manager, ¡esta deberá tener el rol necesario!

Para este ejemplo, hemos pedido que nos muestre la siguiente información: usuario, password, host, puerto, nombre de la base de datos y por último los registros almacenados en ella. En este caso: nombre, apellido y mail de un “empleado” de CAPSiDE.

AWS Secrets Manager - CAPSiDE

Estoy seguro que en los últimos meses has oído hablar del nuevo reglamento general de protección de datos. Afortunadamente, AWS Secrets Manager te puede ayudar también a cumplir los requisitos de GDPR a nivel de contraseñas. Por otro lado, ¿por qué esperar a asegurar tus aplicaciones una vez estén hechas si puedes hacerlo desde el principio?

Nunca guardar un secreto fue tan barato y seguro. ¿A qué esperas para usar AWS Secrets Manager? Desde CAPSiDE te ayudamos a configurarlo y a añadir una capa más de seguridad y de automatización.

TAGS: API, aws, AWS CLI, AWS SDK, AWS Secrets Manager, GDPR, password, secreto

speech-bubble-13-icon Created with Sketch.
Comentarios

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*
*