使用“应用程序平台”时,为什么将API密钥安全地存储在DigitalOceans API的“环境变量”选项中?

Doh09

我正在设置一个NodeJS后端,该后端需要持有一些API密钥才能与其他Firebase联系以对用户进行身份验证。

我已经能够发布后端,并成功地从其上的API端点获取HTTP答复。我使用Express运行NodeJS API。

现在,我希望NodeJS API充当我的用户和数据库接触点。但是我不确定在哪里可以安全地存储该项目的API密钥。因为我对这种类型的安全性还比较陌生。

因此,我到处搜索Google,发现人们说.env文件不是存储API密钥的安全位置。然而,在DigitalOcean文档中,它显示以下内容:

环境变量是存储敏感信息(例如API密钥)或需要从应用程序中的任何位置全局访问的信息(例如版本号或硬编码路径)的绝佳场所。

所以我的问题是,当有许多其他来源认为不是这样时,DigitalOcean会说将API密钥安全存储在环境变量中的原因是什么?这是因为危险在于文件的可访问性,然后DigitalOcean以某种方式保护了文件?我注意到他们有一个“秘密”布尔框可以勾选,它表示它将使其不会出现在控制台中。但是对于一般人来说,它也将完全无法访问吗?

我主要关心的是防止黑客或恶意用户访问API密钥。我并不担心拥有合法访问权限的人会滥用它,只有没有合法访问权限的人才会滥用它。

期待您的见解。

罗维

我将按照以下顺序(从不太安全到最安全)对存储机密的安全性进行排名:

  1. 将它们直接存储在您的代码中(真的,真的很糟糕)
  2. 将它们存储在环境变量中
  3. 将它们存储在磁盘上的文件中
    • 可以设置访问权限,例如谁可以读取它
    • 如果将内容加载到env vars中,则与 Point 2
  4. 将它们存储在对象存储中(AWS S3,Google Cloud Storage)
  5. 使用机密管理器(AWS,GCP机密管理器)存储它们
  6. 使用IAM(实际上不是存储机密信息的地方,而是一种使用上述方法控制谁可以访问机密信息的方法)。

泛化:

第2点和第3点:

points 2 and 3如果您的系统受损,两者之间的区别将变得晦涩难懂。在这种情况下,如果攻击者具有root用户访问权限,则他/她可以读取/写入/删除/更改所有内容,因此point 3将失败。对于point 2,攻击者可以通过3种方法访问环境变量:

根据@phmmmer在这篇文章中

  1. 流程的运行环境流程运行时,可以通过>>访问该流程的环境变量/proc/$PID/environ但是,只有拥有该进程或root的用户才能访问该文件。

  2. 环境变量的来源如果您使用的是初始化脚本,并且变量存储在该初始化脚本中,则当然可以通过读取该脚本来获取变量。

或者,如果环境变量来自其他地方,那么无论在哪里。

  1. “ ps”输出是的,我知道我说过2,在任何体面的系统中,它将是2。但是,如果管理员不知道他在做什么,则有可能开辟第三条道路。

如果该进程是通过类似的启动的sh -c 'cd /foo/bar; POP=tart /my/executable',那么该sh进程将以ps的形式显示:如果该进程是通过某种启动的sh -c 'cd /foo/bar; POP=tart /my/executable',那么该sh进程将以ps的形式显示:


$ ps ax | grep POP phemmer   3085  14   5  0.0  0.0 SN         00:00
sh -c cd /; POP=tart sleep 10```

第4点:

您可以将机密作为对象存储在对象存储中,并在部署期间或引导期间下载它们。大多数对象库都提供日志记录功能,因此您还可以监视秘密的使用方式以及谁在使用它们。注意:如果且仅当您正确配置IAM权限时,此属性Point 4才是好否则,尽管现在您是从远程位置获取文件,但与现在没有区别Point 2

第5点:

您的应用程序可以使用所有机密管理器的API来使用机密。您的机密不会存储在本地任何地方(内存中除外)。是的。您还可以加密内存,并且可以在这篇文章中阅读更多内容

第6点:

IAM或身份和访问管理用于在正确的时间向正确的人/用户/应用程序授予对正确的资源正确访问它不是秘密存储,但可用于管理对秘密存储的访问。

因此,回答您的问题:

"Environment variables are excellent places to store sensitive information"可能是DO的高估。但是,它们确实提供了更多功能,而不仅仅是将您的敏感信息存储在环境变量中并将它们保留在那里。

问题中提到的文档下一篇文章 "How to Use Environment Variables in App Platform"中,DO确实提供了有关环境变量的某些级别的访问控制和加密:

  1. 运行时变量
    • 在应用创建过程中
    • 创建应用后
  2. 建立时间变量
  3. 环境变量中的可绑定变量
    • 应用范围变量
    • 特定于组件的变量

因此,当人们说使用环境变量存储敏感信息并不安全时,大多数人都在谈论没有访问控制和加密的原始环境变量。在这种情况下,将API密钥存储在那里绝对是不安全的。普通的原始环境变量应用于存储端口号,生产环境或其他非敏感信息之类的信息。

我将一些帖子用作此答案的参考:

  1. 5种管理无服务器机密的方法,排名从高到低
  2. 有关管理Terraform代码中机密的全面指南
  3. DigitalOcean:如何在App Platform中使用环境变量

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

Related 相关文章

热门标签

归档