
在像 SparkPost 这样的 API 为先的产品中,有很多种构建身份验证的方法,而我们早期选择的方法是使用 API 密钥。将 API 密钥作为原始授权标头或通过标准 HTTP Basic Auth 注入,使得使用我们的 API 变得非常简单。这种 API 密钥是网络服务的常见标准,但这种系统的安全性如何?
在像 SparkPost 这样的 API 优先产品中构建身份验证有很多方法,而我们早期选择的是使用 API 密钥。将您的 API 密钥作为原始 Authorization 标头或通过标准 HTTP Basic Auth 注入,使我们的 API 非常易于使用。像这样的 API 密钥是网络服务的常见标准,但这个系统有多安全呢?
风险
使用任何网络服务时,如果攻击者获取了您的API密钥,他们可以代表您采取行动,并执行以下操作(在我们的情况下):
通过您的账户免费发送他们的电子邮件
下载您的收件人列表并提供给垃圾邮件发送者(如果他们自己不是垃圾邮件发送者)
编辑您的模板以注入钓鱼链接
代表您发送垃圾邮件或钓鱼邮件
这些结果中的任何一个都可能对您的声誉和您的业务造成严重损害,并且在钓鱼的情况下可能直接损害您的最终用户。这就是为什么确保没有人可以发现您的API密钥是极其重要的。
The odds
IP 白名单拯救
当您创建一个API密钥时,您现在可以指定一个被授权使用该密钥的IP列表。您可以使用CIDR表示法指定多个IP以及IP块,因此您不必单独列出您的服务器。当API密钥被用于REST API或SMTP时,我们将匹配连接的IP与此列表来允许或拒绝访问。
有了这个功能,即使您的API密钥被发现或被盗,只有您的服务器才能使用它。鉴于风险以及设置的简易性,我们强烈建议所有客户使用此功能。
最后的话
关于安全的一些个人建议:
不要在代码中保存你的API密钥。将它们保存在环境变量中有很多好处,比如 Heroku 所做的那样。
你可以创建无限数量的API密钥,为了安全,最好在多个API密钥间分配职责,而不是只使用一个万能密钥。这也允许你为每个密钥设置不同的IP白名单,以实现更好的问题分离。
如果你与第三方合作,不要共享你的API密钥,而是为他们创建一个新的密钥,只授予所需的权限,并与他们的IP绑定。
由于API密钥只能通过UI创建,在你的SparkPost账户上启用双因素身份验证 是必须的,只需花费2分钟。