Il existe plusieurs façons de construire l'authentification dans un produit axé sur l'API comme SparkPost, et celle que nous avons choisie dès le début est l'utilisation de clés API. Injecter votre clé API en tant qu'en-tête d'autorisation brut ou via l'authentification de base HTTP standard facilite grandement l'utilisation de nos API. Les clés API comme celle-ci sont une norme courante pour les services web, mais à quel point ce système est-il sécurisé ?
Les risques
Lors de l'utilisation de tout service web, si un attaquant obtient votre clé API, il peut agir en votre nom et faire des choses comme (dans notre cas) :
envoyer leur e-mail gratuitement via votre compte
télécharger votre liste de destinataires et les alimenter en spammeurs (s'ils ne sont pas eux-mêmes des spammeurs)
modifier vos modèles pour injecter des liens de phishing
envoyer du spam ou du phishing en votre nom
Chacune de ces issues pourrait être très dommageable pour votre réputation et votre entreprise, et dans le cas du phishing, pourrait potentiellement nuire directement à vos utilisateurs finaux. C'est pourquoi il est extrêmement important de s'assurer que personne ne peut découvrir votre clé API.
Les chances
Ai-je entendu force brute ? Nos clés API sont des chaînes hexadécimales de 40 caractères générées aléatoirement. Cela fait un total de 1.4615e+48 clés API. Si les 3 milliards d'ordinateurs et de smartphones dans le monde essayaient 100 clés API par seconde, en supposant que nos serveurs permettraient cela, passer en revue toutes les clés API possibles prendrait plus de 150 000 000 000 000 000 000 000 000 000 ans. Donc, forcer la clé API n'a tout simplement pas de sens.
Alors, comment quelqu'un peut-il trouver votre clé API ? Comme la clé est passée en tant qu'en-tête, elle peut être lue lors d'attaques de type homme du milieu, donc vous devez toujours vous assurer que votre client vérifie les certificats SSL lors de la connexion à nos API (c'est une des raisons majeures pour lesquelles nous exigeons https pour les connexions API). De plus, si vous êtes imprudent dans votre utilisation de dépôts de code publics comme GitHub, votre clé API peut facilement se retrouver exposée dans la nature. Ce n'est pas un problème académique : il existe des bots connus qui parcourent GitHub pour trouver des clés API, et il y a eu des attaques réussies via ce vecteur.
Le filtrage par IP à la rescousse
Lorsque vous créez une clé API, vous pouvez désormais spécifier une liste d'IPs autorisées à utiliser cette clé. Vous pouvez spécifier plusieurs IP, ainsi que des blocs IP, en utilisant la notation CIDR, donc vous n'avez pas à lister vos serveurs individuellement. Lorsque la clé API est utilisée, pour les API REST ou SMTP, nous vérifierons l'IP de connexion par rapport à cette liste pour autoriser ou refuser l'accès.
Avec cette fonctionnalité, même si votre clé API est trouvée ou volée, seuls vos serveurs pourront l'utiliser. Compte tenu des risques et de la facilité de mise en place, nous recommandons fortement à tous nos clients d'utiliser cette fonctionnalité.
Derniers mots
Quelques recommandations personnelles concernant la sécurité :
Ne conservez pas vos clés API dans le code. Il y a beaucoup d'avantages à les garder en tant que variables d'environnement, comme le fait Heroku
Vous pouvez créer un nombre illimité de clés API, et il est préférable pour la sécurité de répartir les responsabilités entre plusieurs clés API, plutôt que d'avoir une seule clé multifonction. Cela vous permettrait également d'avoir différentes listes blanches d'IP par clé, pour une séparation des préoccupations encore meilleure
Si vous travaillez avec des tiers, ne partagez pas votre clé API mais créez-en une nouvelle pour eux, avec seulement les autorisations nécessaires, et attachée à leurs IP
Comme les clés API ne peuvent être créées que via l'interface utilisateur, activer l'authentification à deux facteurs sur votre compte SparkPost est indispensable et ne prend que 2 minutes