Hay muchas maneras de construir autenticación en un producto primero API como SparkPost, y la que elegimos desde el principio es el uso de claves API. Inyectar su clave API como un encabezado de autorización en crudo o a través de la autenticación HTTP básica estándar facilita mucho el uso de nuestras APIs. Las claves API como esta son un estándar común para los servicios web, pero ¿qué tan seguro es este sistema?
Los riesgos
Cuando se utiliza cualquier servicio web, si un atacante obtiene su clave API, puede actuar en su nombre y hacer cosas como (en nuestro caso):
enviar su correo electrónico de forma gratuita a través de su cuenta
descargar su lista de destinatarios y alimentarlos a los spammers (si no son spammers ellos mismos)
editar sus plantillas para inyectar enlaces de phishing
enviar spam o phishing en su nombre
Cualquiera de estos resultados podría ser muy perjudicial para su reputación y para su negocio, y en el caso del phishing, potencialmente dañar directamente a sus usuarios finales. Por eso es extremadamente importante asegurarse de que nadie pueda descubrir su clave API.
Las probabilidades
¿Escuché fuerza bruta? Nuestras claves API son cadenas hexadecimales aleatorias de 40 caracteres. Esto hace un total de 1.4615e+48 claves API. Si todas las 3 mil millones de computadoras y teléfonos inteligentes en el mundo estuvieran intentando 100 claves API por segundo, asumiendo que nuestros servidores permitirían eso, pasar por todas las claves API posibles tomaría más de 150,000,000,000,000,000,000,000,000,000 años. Por lo tanto, forzar la clave API simplemente no tiene sentido.
Entonces, ¿cómo puede alguien encontrar su clave API? Debido a que la clave se pasa como un encabezado, puede ser leída con ataques de hombre en el medio, por lo que siempre debe asegurarse de que su cliente esté verificando los certificados SSL al conectarse a nuestras APIs (esta es una de las principales razones por las que requerimos https para conexiones API). Además, si es descuidado con el uso de repositorios de código públicos como github, su clave API puede terminar expuesta en la naturaleza. Este no es un problema académico: hay bots conocidos rastreando github para encontrar claves API, y ha habido ataques exitosos a través de ese vector.
La lista blanca de IP como solución
Cuando crea una clave API, ahora puede especificar una lista de IP autorizadas para usar esta clave. Puede especificar varias IP, así como bloques de IP, utilizando la notación CIDR, por lo que no tiene que enumerar sus servidores individualmente. Cuando se utiliza la clave API, para APIs REST o SMTP, coincidiremos la IP de conexión con esta lista para permitir o denegar el acceso.
Con esta función, incluso si su clave API se encuentra o se roba, solo sus servidores podrán usarla. Dadas las riesgos y lo fácil que es configurarlo, recomendamos encarecidamente a todos nuestros clientes que utilicen esta función.
Últimas palabras
Algunas recomendaciones personales sobre seguridad:
No mantenga sus claves API en el código. Hay muchos beneficios en mantenerlas como variables de entorno, como hace Heroku
Puede crear una cantidad ilimitada de claves API, y es mejor para la seguridad dividir las responsabilidades entre varias claves API, en lugar de tener solo una clave suiza. Esto también le permitiría tener diferentes listas blancas de IP por clave, para una separación de preocupaciones aún mejor
Si trabaja con terceros, no comparta su clave API, sino que cree una nueva para ellos, con solo los permisos necesarios, y vinculada a sus IP
Dado que las claves API solo se pueden crear a través de la interfaz de usuario, habilitar la autenticación de dos factores en su cuenta de SparkPost es imprescindible y solo lleva 2 minutos