想在开源项目里用比较正规的流程储存密钥等敏感数据,但是实习经验不多,自己做的过程中还是挺多问题的,有没有大佬讲讲一般商业公司是怎么处理的。想学习一个一般商业公司的还可以的安全管理实现,主要是像大公司或者云平台那种管理咱也没那个成本搞,搞了也用不上。
目前我的操作方法就是注入数据库密码等等把密文写到配置文件里,然后在代码里读取并解码,就还原成真实密码。唯一好处可能是密文和代码分离了,方便管理。但是密文和密钥又都写在一块,解码方式也很明确,感觉还是意义不大。如果说真的是为了对抗网络攻击的话,那代码泄露和配置文件泄露的安全损害级别应该是一样的,对方有能力获取你的代码又怎么会没能力获取配置文件,还不是会导致所有原文泄露?
在用户管理方面,比如 nginx 是 A 用户启动的,业务是 B 用户启动的,给密钥文件夹加上 B 的只读权限也许有用。不过说实在的既然只用 nginx 做路由,业务过于单纯,实在是想不到它有什么潜在风险。毕竟全球运行这么多年了,好像也没听说过哪个 0day 漏洞导致 nginx 本身出问题的。
还有一个处理方案可能是配置文件只存密文,在每次服务启动时管理员手动输入密钥,但是现在服务都做的容器化,每次启动输入既麻烦又不好管理,我觉得应该没有人实际上是这么操作的。
最后我还想知道一般安全设计上是否需要防范内存攻击,我的程序把密码原文读取到内存,需要防止有人把内存 dump 出来做分析吗,这是否意味着相关内存需要尽快被销毁?
1
Inn0Vat10n 172 天前
能直接访问到 db 的机器一般和外部网络是隔离的,不太需要关心 dump 内存攻击这种操作,一般就是 pk/sk 做鉴权,pk 我有见过直接存配置文件里的,也有从统一的配置中心获取的(调用 API 有审计)
|
2
FlyingBackscratc OP @Inn0Vat10n 感觉网络隔离这个在发生权限泄露以后意义不大,感觉从 v 站发帖的观察来看服务器被挂马是常见网安问题,此种情况下内部网络隔离形同虚设。pk/sk 鉴权应该不是单纯用 tls 加密通信这种感觉而是涉及鉴权逻辑吧,不过这种和密码又有啥区别,感觉只是 sk 比密码长一点这样。。。
|
3
GeekGao 172 天前
一般的公司没有˙复杂的处理,1 楼说的是很多公司的处理方法。
我所知的做法是使用像 HashiCorp 的 Vault 这样的工具来管理和存储密钥,然后应用是从环境变量中读取密钥。 |
4
whileFalse 172 天前
云、k8s 和第三方软件有很多加密配置的组件
不过对于很多应用来说,只要不写死在代码里,能够运行时注入就够了。 不用管内存 |
5
wangbin11 172 天前
java 就用 nacos ,现在各种服务解耦,程序员都搞不懂自己的程序和谁连接,不用太耽误密码安全问题,多写点代码就懂了,能跑就行
|
6
jinliming2 172 天前 via iPhone
首先,没有绝对的安全。如果真到了可以到你服务器上进行任意代码执行了,那基本上对你的密码是啥也就没啥兴趣了。都能直接进到你家翻箱倒柜了,也就没有必要知道你家防盗门上的密码了。
安全防护通常是很多层,对密码的保护只是其中一层。 代码是很多人都可以访问到的,比如公司里的程序员,几乎人手一份代码,代码泄漏的风险本身就很高。而密码不放在代码里,那么即便是你泄漏了代码,在不考虑其他漏洞的情况下,生产数据库还是安全的。 当然,即便是保护了密码的安全,生产数据库通常也都是网络隔离不能公网访问的,这是另一道安全防线。但也不能说既然不能公网访问,那就不设置密码了吧? |
7
rekulas 172 天前
裸配置就行了, 很多巨头都这样玩的, 服务器不被黑没啥大问题
我们也有加密配置, 不过是因为要部署在客户的机器上 放置泄露而已 |
8
wanqiangcrack 172 天前
dump?你这担心的也太多了,都拥有你服务器的控制权了,在折腾安全都是没有意义的。 密码能够看到明文的地方进行加密就好了,后端使用时即时解密。
|
9
KylinYou 172 天前 via Android
如果是欧盟的服务,需要遵守 GDPR ,用户对信息有知情权,访问权,删除权等
|
10
fd7917931e 171 天前
Vault
|
11
richcat 171 天前
密码用密钥加密,加密后无所谓放在那里了,密钥有密钥管理服务(参考 AWS KMS),每个用户都可以申请自己的密钥
|
12
RedrumSherlock 170 天前 1
明文存在 Hashicorp 的 Vault 上,然后通过 Vault 的 secret operartor 同步成 k8s 的 secret ,mount 成 pod 的环境变量调用。内存 dump 这种基本不考虑了
|