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

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

发表评论

电子邮件地址不会被公开。 必填项已用*标注