微服务中采用开源 NoSQL 的一般怎么监权?

2020-12-03 09:02:36 +08:00
 fyooo
日常工作是做螺丝钉,没有接触过这块,好奇问问。

比如我要用 redis 之类的 NoSQL 存放数据,怎么防止非授权的访问?

我的一个想法是做一个 proxy,即部署了 Redis 的服务器,通过 iptables 之类的技术限制只有 proxy 可以访问其 IP 。把监权的逻辑放到 proxy 中,比如某数据的 Redis 只允许部分白名单的微服务访问之类,又或者校验来源微服务的票据,检查票据对应的 Reids 中的数据是否对应(比如 A 用户不能访问 B 用户的数据之类)

对后台不太熟悉,是否 envoy 就是做这样的事情的?
2921 次点击
所在节点    程序员
22 条回复
hotcool100
2020-12-03 09:06:04 +08:00
你会把 mysql 端口映射到外网?同理,nosql 也一样。
fyooo
2020-12-03 09:07:53 +08:00
@hotcool100 肯定不会映射到外网哈,我的意思是在怎么做内网层面的防御?比如有商业间谍入职,负责其他非核心微服务模块的开发,又或者万一某个对外服务被入侵导致作为内网跳板,怎么防御这块?
tabris17
2020-12-03 09:11:13 +08:00
内鬼也得是 dba 层级的,跟你说,这种完全挡不住,想想斯诺登
cheng6563
2020-12-03 09:11:37 +08:00
套个双向验证的 tls
tabris17
2020-12-03 09:13:00 +08:00
如果你们公司任一员工都能访问到生产环境数据,那说明你们公司管理非常混乱
whileFalse
2020-12-03 09:13:37 +08:00
@fyooo #2 很简单,你关系型数据库怎么防御?
还不是靠用户名密码防御。然后很多微服务的用户名密码要么是直接写在环境变量里面,要么是存储在配置中心里,然后配置中心的用户名密码地址写在环境变量里面。人家要是都进了你的微服务为所欲为了,关系型数据库的用户名密码能防得住?
所以 Redis 这种呢,你高兴就配个密码,然后它的安全性就和关系数据库一样了,是不是很令人安心?
dayeye2006199
2020-12-03 09:15:55 +08:00
配置数据库允许的访问来源,禁掉非生产环境,非目标应用的访问。
labulaka521
2020-12-03 09:25:45 +08:00
监听本地 搭建 ssh 隧道
yzbythesea
2020-12-03 09:28:58 +08:00
envoy 是 reverse-proxy,不做授权。

一般首先生产数据的 redis 在自己的 VPC 网络;第二 redis 连接是 mutual TLS,你没有授权连不进去。
zy445566
2020-12-03 09:34:50 +08:00
你的微服务接口进行封装 redis,外部直接调用你微服务的接口不就好了,你想怎么鉴权就怎么鉴权
laminux29
2020-12-03 09:55:35 +08:00
用 docker 或虚机来跑 redis,每个容器跑一个库。

再用 docker 或虚机建立跳板机,redis 设置 ip 只允许跳板机与中间件或 web server 直连。

需要连接 redis 的员工,从跳板机给权限并做访问 log 。
gadsavesme
2020-12-03 10:09:04 +08:00
这种内网的东西防人就行了
way2explore2
2020-12-03 11:18:28 +08:00
我没觉着你说的有问题。

只是我觉着这个不叫 proxy 这个叫 gateway.
onehao28
2020-12-03 11:25:44 +08:00
微服务之间调用一般有 APIGateWay, 如果是 nosql 之间的话 得看具体是哪个了。 当前中间件有很多鉴权方式,有普通的密码建群,TLS 、OAuth2 、kerberos 、JWT 还有 scram 认证
onehao28
2020-12-03 11:26:07 +08:00
微服务之间调用一般有 APIGateWay, 如果是 nosql 之间的话 得看具体是哪个了。 当前中间件有很多鉴权方式,有普通的密码建群,TLS 、OAuth2 、kerberos 、JWT 还有 scram 认证
@onehao28 打错了 密码鉴权
hantsy
2020-12-03 11:38:17 +08:00
@onehao28 这种都是应用层面的。

对于数据库,一般生产环境如果对安全要求很高,单纯的 user/password 不够,除了安全证书使用外,要用到一些专业的安全方案,比如 Vault 之类的。

https://www.vaultproject.io/

@whileFalse 密码写进环境变量也太夸张了。当然一般内网,没有外部访问,问题不大。
hantsy
2020-12-03 11:45:10 +08:00
从 Vault 网站页看,基本上所有最流行的 Cloud Infrastructure (包括 AliCloud )和数据库都支持了。Vault 应该是目前云环境中支持最广泛的方案之一。
whileFalse
2020-12-03 12:04:53 +08:00
@hantsy
密码进环境变量一点不夸张,微服务容器环境下多正常啊。
镜像都是一样的。在哪个环境运行就注入哪个环境的环境变量。如果有配置中心就写入配置中心,并在环境变量中写入配置中心的链接方式。没有配置中心全写入环境变量也能行,只是环境变量有最大容量限制。
不然微服务环境里,这些环境相关的信息放哪儿?打到 jar 包里吗?那不是最佳实践。打 jar 包里意味着构建系统需要为每个环境单独运行构建,意味着镜像不能共享,并且难以追踪镜像之间差异,维护起来也麻烦。
hantsy
2020-12-03 12:22:24 +08:00
这些开发人员都是清楚的,环境变量,ConfigMap,对于一般配置没问题。

对于生产环境中,充分考虑到安全因素,敏感信息自然要加一层套(就是 Vault 啦),在 service 调用的时侯这个密码是可以从 Vault 服务来,动态的。
nnnToTnnn
2020-12-03 12:41:09 +08:00
@fyooo 我都能渗透到服务器了,写个 dll 注入,或者写个 hook,或者修改调用 redis 的 connect 拿到 connect 直接一顿操作就可以了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/731600

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX