如何为微服务创build公用密钥存储?
我在Docker环境中实现了一套微服务。 而且这些服务中的每一个都使用JWT令牌相互通信。 当服务A呼叫服务B时
- 服务A,使用他的私钥签署令牌,并传递给服务B.
- 服务B,从公钥存储获取ServiceA的公钥并validation令牌
公钥/私钥生成过程由微服务本身完成,然后将公钥传递给公钥存储。 所以公钥存储唯一要做的事情是,
- 存储由服务发送的公钥
- 根据请求发送正确的公钥给服务
我所要做的与图中所显示的相似。
我从以下图片获得: https : //www.youtube.com/watch?v=dBdZrw2pPvc&t=462s
所以我的问题是,这种公共密钥存储的标准实现吗? 如果是的话,他们是什么?
如果安全性不重要:
- Redis: https : //redis.io/
- 领事: https : //www.consul.io/
- Etcd: https ://coreos.com/etcd
- Zookeeper: https : //zookeeper.apache.org/
如果安全很重要:
- 保险柜: https : //www.vaultproject.io/
- Conjur: https ://www.conjur.com/
- Thycotic: https ://thycotic.com/
- Docker的秘密: https : //docs.docker.com/engine/swarm/secrets/
老实说,还有更多的select,但这些都是DevOps社区最着名和审核的。
披露:我是Conjur的首席技术官。
考虑工作stream程:
- 服务A的容器启动。
- 它会生成一个新的密钥对。
- 它将公钥提交给公钥存储。
- 公钥存储接收公钥。
- 公钥存储将其收到的公钥与身份“service-a”相关联。
- 服务A向服务B签署请求
- 服务B向密钥存储区询问服务A的已知公共密钥。
- 密钥库提供公钥。
- 服务Bvalidation签名与其中一个密钥匹配。
公钥存储必须确保:
- 以防篡改的方式存储公钥。
- 以防篡改的方式将每个公钥与服务标识相关联。
- 为pipe理员提供一些操作密钥存储区的方法(例如,死容器的取消密钥)。
- 保留一切发生的审计logging。
但是还有一点很难。 在步骤(5)中,当密钥存储接收到服务A的密钥时,需要validation密钥实际来自服务A,而不是冒名顶替者。 换句话说,它必须validation请求。
你如何做到这一点取决于你的基础设施的细节。 如果您正在使用原始的Docker(而不是Kubernetes),则可以使用服务器上的代理将容器的IP地址与机器上的容器列表( docker ps
)相关联。 这将告诉你容器的形象,这应该告诉你的服务的身份。
这个问题有很多微妙之处,对于每个容器环境,解决scheme都有所不同。
- 在docker中限制进程的数量
- 是否有可能阻止容器内的RedHat / CentOS Docker主机root访问?
- 在同一主机上控制对多个Docker容器的访问
- 限制访问本地networking中的docker dev环境
- Owasp ZAP在使用“Form-Based-Authentication”进行主动扫描期间不执行身份validationON python项目
- 在同一台主机上安全使用多个docker容器,就像隔离的实例一样
- 如何设置将root用户的所有环境variables复制到另一个特定的用户
- 对于Docker容器,SELinux比AppArmor更安全吗?
- 如何处理Docker镜像中的安全更新?