我正在设置一个NodeJS后端,该后端需要持有一些API密钥才能与其他Firebase联系以对用户进行身份验证。
我已经能够发布后端,并成功地从其上的API端点获取HTTP答复。我使用Express运行NodeJS API。
现在,我希望NodeJS API充当我的用户和数据库接触点。但是我不确定在哪里可以安全地存储该项目的API密钥。因为我对这种类型的安全性还比较陌生。
因此,我到处搜索Google,发现人们说.env文件不是存储API密钥的安全位置。然而,在DigitalOcean文档中,它显示以下内容:
环境变量是存储敏感信息(例如API密钥)或需要从应用程序中的任何位置全局访问的信息(例如版本号或硬编码路径)的绝佳场所。
所以我的问题是,当有许多其他来源认为不是这样时,DigitalOcean会说将API密钥安全存储在环境变量中的原因是什么?这是因为危险在于文件的可访问性,然后DigitalOcean以某种方式保护了文件?我注意到他们有一个“秘密”布尔框可以勾选,它表示它将使其不会出现在控制台中。但是对于一般人来说,它也将完全无法访问吗?
我主要关心的是防止黑客或恶意用户访问API密钥。我并不担心拥有合法访问权限的人会滥用它,只有没有合法访问权限的人才会滥用它。
期待您的见解。
我将按照以下顺序(从不太安全到最安全)对存储机密的安全性进行排名:
Point 2
points 2 and 3
如果您的系统受损,两者之间的区别将变得晦涩难懂。在这种情况下,如果攻击者具有root用户访问权限,则他/她可以读取/写入/删除/更改所有内容,因此point 3
将失败。对于point 2
,攻击者可以通过3种方法访问环境变量:
根据@phmmmer在这篇文章中
流程的运行环境流程运行时,可以通过>>访问该流程的环境变量
/proc/$PID/environ
。但是,只有拥有该进程或root的用户才能访问该文件。环境变量的来源如果您使用的是初始化脚本,并且变量存储在该初始化脚本中,则当然可以通过读取该脚本来获取变量。
或者,如果环境变量来自其他地方,那么无论在哪里。
- “ 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```
您可以将机密作为对象存储在对象存储中,并在部署期间或引导期间下载它们。大多数对象库都提供日志记录功能,因此您还可以监视秘密的使用方式以及谁在使用它们。注意:如果且仅当您正确配置IAM权限时,此属性Point 4
才是好。否则,尽管现在您是从远程位置获取文件,但与现在没有区别。Point 2
您的应用程序可以使用所有机密管理器的API来使用机密。您的机密不会存储在本地任何地方(内存中除外)。是的。您还可以加密内存,并且可以在这篇文章中阅读更多内容
IAM或身份和访问管理用于在正确的时间向正确的人/用户/应用程序授予对正确的资源的正确访问。它不是秘密存储,但可用于管理对秘密存储的访问。
"Environment variables are excellent places to store sensitive information"
可能是DO的高估。但是,它们确实提供了更多功能,而不仅仅是将您的敏感信息存储在环境变量中并将它们保留在那里。
在问题中提到的文档的下一篇文章 "How to Use Environment Variables in App Platform"
中,DO确实提供了有关环境变量的某些级别的访问控制和加密:
因此,当人们说使用环境变量存储敏感信息并不安全时,大多数人都在谈论没有访问控制和加密的原始环境变量。在这种情况下,将API密钥存储在那里绝对是不安全的。普通的原始环境变量应用于存储端口号,生产环境或其他非敏感信息之类的信息。
我将一些帖子用作此答案的参考:
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句