爱意满满的作品展示区。
gouchaoer

restricted-redis-proxy:一个命令收到限制的 redis 代理

  •  
  •   gouchaoer · May 17, 2017 · 3175 views
    This topic created in 3321 days ago, the information mentioned may be changed or developed.

    花了几天时间做了这么一个小玩意儿,动机是我平常用 redis 的场合挺多的,但是 redis 本身缺乏用户权限控制导致很多情况下没法用。我们知道 redis 作为一个缓存,只支持简单的密码验证,所有用户都在任意数据库执行任何命令。我总结了几个用 redis 比较困扰的场景:

    1、团队的很多服务都依赖同一个 redis,很多时候免不了误操作,比如队友不小心 flushall 了,或者 flushdb 了,或者你不想让别人用专门分配给你的某个数据库,或者你不想开放某些危险命令比如 CONFIG 给客户端。

    2、我们用一般 etcd/consul 来做配置服务器或者服务发现,但是很多时候觉得 etcd/consul 的分布式太复杂依赖太重,我只需要一个单节点的 redis (或者说类似阿里云双热备 redis )就够了,redis 做简单的配置服务器或者服务发现也没啥问题。

    3、爬虫工程师们做分布式爬虫任务的时候,很多时候需要用 redis 作为一个调度和状态中心,分布式的爬虫每个都需要知道 redis 密码才行,但是这样不太安全(你的爬虫跑在很多地方),于是只能在 redis 前面包装一层 api。我们知道 redis 可以保持 tcp 长连接很多时候很好用,包装成 api 又特别麻烦。

    4、and so on.

    针对这些场景下的困扰,我自己动手写了一个 tcp 层的 redis 代理,这个代理会解析从 redis 客户端发过来的 redis 命令,如果 redis 命令合法的话就放行,不合法的话就出错关闭连接。由于我对 php 比较熟悉所以就用 php 写的,基于 Workerman 这个异步的 tcp 事件库,逻辑非常简单直观。

    repo 地址: https://github.com/gouchaoer/restricted-redis-proxy 欢迎 star 和 PR

    有了这个代理的话,通过搭建一个限制命令的 redis 代理,然后只提供这个代理地址给别人,就可以解决上面的几个场景的困扰了。比如阿里云的热双备 redis 外网访问的话只能自己搭代理转发,如果用这个 restricted-redis-proxy 只允许某几个有限的命令或者数据库,就可以放心的用在很多场景了。

    5 replies    2017-07-05 17:12:50 +08:00
    ixiaohei
        1
    ixiaohei  
       May 17, 2017
    然后你们运维没有把那些命令 rename 掉么?
    gouchaoer
        2
    gouchaoer  
    OP
       May 18, 2017
    @ixiaohei 这是 redis 内置的命令,不是 shell 的命令
    gouchaoer
        4
    gouchaoer  
    OP
       May 18, 2017
    @qieqie https://help.aliyun.com/knowledge_detail/37447.html
    在配置文件里可以禁用这些命令,不过这样别的服务就没法用这些命令了
    vbem
        5
    vbem  
       Jul 5, 2017
    star 了,楼主的 idea 很赞。
    如果不是 php 的,肯定更火……
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2656 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 48ms · UTC 07:10 · PVG 15:10 · LAX 00:10 · JFK 03:10
    ♥ Do have faith in what you're doing.