V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
fyooo
V2EX  ›  程序员

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

  •  
  •   fyooo · 2020-12-03 09:02:36 +08:00 · 2771 次点击
    这是一个创建于 1211 天前的主题,其中的信息可能已经有所发展或是发生改变。
    日常工作是做螺丝钉,没有接触过这块,好奇问问。

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

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

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

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

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

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

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

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

    https://www.vaultproject.io/

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

    对于生产环境中,充分考虑到安全因素,敏感信息自然要加一层套(就是 Vault 啦),在 service 调用的时侯这个密码是可以从 Vault 服务来,动态的。
    nnnToTnnn
        20
    nnnToTnnn  
       2020-12-03 12:41:09 +08:00
    @fyooo 我都能渗透到服务器了,写个 dll 注入,或者写个 hook,或者修改调用 redis 的 connect 拿到 connect 直接一顿操作就可以了。
    no1xsyzy
        21
    no1xsyzy  
       2020-12-03 13:40:12 +08:00
    “A 用户不能访问 B 用户的数据之类”……
    你这不是典型的业务逻辑控制么?
    除非你上端对端加密,不然几乎都是你写的程序内进行跨用户访问控制的。
    至于你写了个 proxy 还是写了个 SDK 就不重要了。
    不过如果你做一个后端到数据库的七层代理也不是什么大问题,也确实这东西不叫 proxy (因为 proxy 不应当干预双方交互,不然就叫 mitmproxy 了)。

    @whileFalse 除了环境变量还有动态挂载的文件,docker 有 /run/secrets 专门放这类东西。
    whileFalse
        22
    whileFalse  
       2020-12-03 13:48:26 +08:00
    @no1xsyzy #21 我可没说环境变量是怎么挂进去的……外面看可能是加密的,挂进去内部看全是明文
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   952 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 21:48 · PVG 05:48 · LAX 14:48 · JFK 17:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.