我有一个软件程序(例如:Tradingview(中的许多REST APIs
我希望安全地存储API证书(例如密钥、机密(。
我曾想过把它们放在数据库表中,但我并不完全喜欢把明文放在表中。
我已经知道使用OS Environment Variables
:
[... snip ...]
import os
import sys
import logging
[... snip ...]
LD_API_KEY = os.getenv("BINANCE_APIKEY")
LD_API_SECRET = os.getenv("BINANCE_API_SECRET")
其中密钥存储在一个文件中,但是正如前面提到的,我有许多API密钥。
把它们放在服务器上(明文(——即使文件是隐藏的——我也不太满意
是否有其他存储API密钥的方法?
有很多关于这个主题的文章,可以在网上快速搜索"存储API密钥";将为您带来一些有趣且信息丰富的读物,所以我将在这里谈谈我的经历。
实际上,这完全取决于您的偏好、项目的要求以及您需要的安全级别。我个人已经提出了一些解决方案。以下是我的项目如何随着时间的推移而发展的。
存储在环境变量中的每个键
很简单,只需要对每个键使用os.environ
。这很快就成为了管理层头疼的问题,尤其是在部署到多个环境或为新的项目贡献者设置环境时。
存储在本地文件中的所有密钥
这只是源代码管理之外的一个文件,环境变量指向该文件。我从以下结构的一个简单JSON文件开始。
[
{
"name": "Service Name",
"date": "1970-01-01", // to track rotations
"key": "1234abcd",
"secret_key": "abcd1234"
}
]
这演变成了一个为我访问该文件并返回所需密钥的类,这样我就不必在每个访问API的脚本中重复json.load()
或导入os
。当我开始需要存储OAuth令牌时,这变得有点复杂。
我最终将这个文件移到了一个私有的、加密的(gitsecret(、仅本地的git repo中,这样团队成员也可以在他们的环境中使用密钥。
使用秘密管理服务
对远程工作的推动迫使我创建一个用于远程API密钥访问和管理的系统。我的团队讨论了许多解决方案,但我们最终还是选择了AWS Secrets Manager
。前面提到的自定义类指向的是AWS,而不是本地文件,与仅本地的解决方案相比,我们在安全性和灵活性方面获得了显著提高。
有很多基于云的秘密管理解决方案,但我的项目已经高度集成了AWS,所以考虑到成本和限制,这是最有意义的。这也意味着每个团队成员现在只需要拥有AWS权限,并使用他们的帐户AWS API密钥进行访问。