1.Redis中线上使用keys *命令,也是非常危险的。因此线上的Redis必须考虑禁用一些危险的命令,或者尽量避免谁都可以使用这些命令,Redis没有完整的管理系统,但是也提供了一些方案。
修改 redis.conf 文件,添加
rename-command FLUSHALL ""
rename-command FLUSHDB ""
rename-command CONFIG ""
rename-command KEYS ""
rename-command SHUTDOWN ""
rename-command DEL ""
rename-command EVAL ""
然后重启redis。 重命名为"" 代表禁用命令,如想保留命令,可以重命名为不可猜测的字符串,如: rename-command FLUSHALL
9741c7fcae9f869d
2.redis内存增长过快,查询哪个key值占用内存
redis是基于内存的KV数据库,内存作为存储介质,关注其内存的使用情况是一个重要指标,解析其内部的存储信息是给出优化方法和维护的最基本要求。
解析内存有二种方法:
第一个是通过scan遍历所有key,针对每个key进行分析(memory usage);
第二个是基于RDB文件进行所有key的分析(redis-rdb-tools)。
本文将介绍如何使用rdbtools工具。
rdbtools工具包括了3个可执行文件:
rdb -- 解析整个rdb文件
redis-memory-for-key -- 解析server里的单个key
redis-profiler --解析rdb文件成html格式
rdb是rdbtools工具包其中之一的工具,也是解析dump.rdb文件的工具:分析内存并将数据导出到JSON,Rdbtools是Redis的dump.rdb文件的解析器,解析器生成类似于xml。rdbtools提供了以下实用程序:
- 生成所有数据库和键中数据的内存报告
- 将转储文件转换为JSON
- 使用标准差异工具比较两个转储文件
安装 rdbtools:
1.安装pip:
yum -y install epel-release python-pip
pip install --upgrade pip
2.安装rdbtools (python-lzf :加快解析速度)
pip install rdbtools python-lzf
安装完后拷贝rdb文件到一台测试机器上,尽量不要在线上运行。
用rdbtools工具生产内存报告,命令是 rdb -c memory,例子:
sudo rdb -c memory ./dump.rdb >test.csv
.报告生成后,结合用linux sort命令排序,根据內存列排序,找出最高的key有哪些。例子:
sudo sort -k4nr -t , test.csv > sort.txt
查看sort.txt的结果,一般能得出类似‘my_ranking_list’开头的集合占用最高,排在了前面。若要查看类似‘my_ranking_list’开头的总共占用了多少内存,可以用命令:
sudo cat sort.txt | grep ‘my_ranking_list’ | awk -F ',' '{sum += $4};END {print sum}'
查询到大key就可以分析为什么会越来越大了。
3.redis开启保护模式。
配置文件没有指定bind和密码,开启该参数后,redis只能本地访问,拒绝外部访问。
redis.conf安全设置: # 打开保护模式 protected-mode yes
禁止监听在公网
Redis监听在0.0.0.0,可能导致服务对外或内网横向移动渗透风险,极易被黑客利用入侵。
在redis的配置文件redis.conf中配置如下: bind 内网IP,然后重启redis
4.root权限
使用root权限去运行网络服务是比较有风险的(nginx和apache都是有独立的work用户,而redis没有)
redis crackit 漏洞就是利用root用户的权限来替换或者增加authorized_keys,来获取root登录权限的
使用root切换到redis用户启动服务
useradd -s /sbin/nolog -M redis
sudo -u redis /<redis-server-path>/redis-server /<configpath>/redis.conf
5.限制redis 配置文件访问权限
因为redis密码明文存储在配置文件中,禁止不相关的用户访问改配置文件是必要的,设置redis配置文件权限为600
chmod 600 /<filepath>/redis.conf
6.修改端口
编辑文件redis的配置文件redis.conf,找到包含port的行,将默认的6379修改为自定义的端口号,然后重启redis