如何进行至少最低限度安全的自动化 API 调用?

信息安全 密码管理 Python 电源外壳
2021-09-11 02:10:18

如何在 Powershell(甚至可能是 Python)中编写脚本(用于自动化),以帮助我访问 API,同时将凭证信息保持在脚本中和/或脚本之外(如果从外部存储和检索)的安全

最初,我曾想过使用 Lastpass,就像我对网络浏览器所做的那样,并以某种安全的方式检索凭据,但他们不支持任何此类事情。

然后我研究了 Windows 数据保护 API,用于加密密码的密钥是特定于用户和运行代码的机器的,但是由于我部署和设置虚拟机和容器很多,需要作为设置过程的一部分访问某些 API,我无法使用该方法。

那么我应该怎么做呢?

我听说我们可以使用 keepass 或类似的工具,但是在为 API 调用检索它们的同时,您将如何使用它们来保证您的凭据对您的代码安全?

我该怎么办?

2个回答

正如安德斯指出的那样,有重复,它不能很好地涵盖你的情况,不同之处在于它不是加密的密钥,而是 API 的密码。

您可以使用另一个提供一次性密码的 Web 服务,它可以这样工作:

  1. 您来自服务器 A 的 Python 脚本连接到服务器 B,即“密码服务器”
  2. 您将凭据发送到密码服务器以授权自己
  3. 您检索 API 的一次性密码(或 1 天密码)
  4. 您从服务器 A 连接到 API 所在的服务器 C,然后发送您的一次性或 1 天密码
  5. API 服务器 C 与服务器 B 核对是否可以使用此密码
  6. 如果它们的键匹配,您会从服务器 C (API) 到服务器 A (Python 客户端) 获得肯定响应。

您应该对所有连接使用 SSL (TLS),并验证证书是否可以防止 MITM 攻击。您还可以使用用户证书和密码来授权自己。

您可以通过多种方式扩展此类系统的安全性,例如,将一次性密码限制为 Python 脚本 IP 地址。

此外,您的 API 服务器 C 可以缓存密码,因此每次您进行 API 调用(最好在 RAM 中)时,它都不会从服务器 B 中检索密码。

安全性的好处是您对服务器 C 进行了全面审核,并且没有永久密码,因此您无需更改它们。

有很多方法可以解决这个问题。一个简短的清单包括:

  • 网页服务)
  • 加密的本地存储
  • 虚拟机/容器之间共享的加密可访问存储

虽然其中一些具有许多高级功能(审计、完全控制、更好的安全性),但它们通常都需要某种设置。因此,既然您提到可以部署容器,那么让我们采用一种冻结的、难以访问的方法中间路线。


最佳图像

由于您可以轻松部署容器,因此此选项是拥有一个容器,其唯一目的是为脚本发送加密的身份验证方法并在死亡之前返回,该容器只能从您的 VPL(虚拟专用局域网)中的容器的 LAN 访问这样它就永远不会与外界交流。此时,脚本容器上的所有内容都是解密密钥。仅凭您在偏远地区的内部容器和 docker 机器,就没有人能听到这一点。这意味着您的脚本将具有解密密钥,并且只能在本地访问。如果它被泄露,上传 2 个新的容器图像,你就完成了。

优点:

  • 已使用您正在部署的模型
  • 仅限局域网。在控制器上使用保留的内部 IP(172.XXX 范围)与此 docker 通信
  • 多点安全意味着如果受到威胁,可以在新制作的干净 docker 镜像中上传新凭据
  • 非常难以妥协(不是同一台机器,不同的代码,必须妥协两端才能使其值得)
  • 易于保护(谁需要在容器上使用 SSH,对吗?)
  • 精确的端口控制(不要使用常见的,仅使用一个非常晦涩的端口)
  • 还有很多

缺点:

  • 两个容器与加密片段和解密片段共同维护
  • 哦不,两个上传

由于这永远不会通过网络传播出去,因此网络之外的任何人都无法获取数据包并尝试通过传递来发现它。由于它是一个容器映像,因此专家列表肯定比设置它所需的少量工作量要大。只需上传新代码,完成。

现在您不必担心将密码存储在带有脚本的容器或带有解密密钥的容器上,您可以放心,在静止状态下它几乎是不可能破解的。特别是如果您将 TLS 与证书固定一起使用。现在,即使容器以某种方式最终位于同一主机上,您也必须做到最好。

在这一点上,唯一能破解这个问题的人就是你,其他任何人都知道它是如何设置的。然而,这是因为网络安全链中最危险的环节是人。