花了几天时间做了这么一个小玩意儿,动机是我平常用 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 只允许某几个有限的命令或者数据库,就可以放心的用在很多场景了。
1
ixiaohei 2017-05-17 23:55:20 +08:00
然后你们运维没有把那些命令 rename 掉么?
|
3
qieqie 2017-05-18 15:00:48 +08:00 1
|
4
gouchaoer OP |
5
vbem 2017-07-05 17:12:50 +08:00
star 了,楼主的 idea 很赞。
如果不是 php 的,肯定更火…… |