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

2017-05-17 17:45:50 +08:00
 gouchaoer

花了几天时间做了这么一个小玩意儿,动机是我平常用 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 只允许某几个有限的命令或者数据库,就可以放心的用在很多场景了。

2457 次点击
所在节点    分享创造
5 条回复
ixiaohei
2017-05-17 23:55:20 +08:00
然后你们运维没有把那些命令 rename 掉么?
gouchaoer
2017-05-18 10:13:59 +08:00
@ixiaohei 这是 redis 内置的命令,不是 shell 的命令
qieqie
2017-05-18 15:00:48 +08:00
gouchaoer
2017-05-18 15:42:28 +08:00
@qieqie https://help.aliyun.com/knowledge_detail/37447.html
在配置文件里可以禁用这些命令,不过这样别的服务就没法用这些命令了
vbem
2017-07-05 17:12:50 +08:00
star 了,楼主的 idea 很赞。
如果不是 php 的,肯定更火……

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

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

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

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

© 2021 V2EX