打开保护模式
redis默认开启保护模式。要是配置里没有指定bind和密码,开启该参数后,redis只能本地访问,拒绝外部访问。
redis.conf安全设置: # 打开保护模式 protected-mode yes
禁用或者重命名危险命令
[客户端连接无法操作redis]
Redis中线上使用keys *命令,也是非常危险的。
因此线上的Redis必须考虑禁用一些危险的命令,
或者尽量避免谁都可以使用这些命令,
Redis没有完整的管理系统,但是也提供了一些方案。
加固建议
修改 redis.conf 文件,重命名为"" 代表禁用命令,如想保留命令,可以重命名为不可猜测的字符串。
如: rename-command FLUSHALL "helloworld".然后重启redis。
rename-command FLUSHALL "" #清空记录和数据库
rename-command FLUSHDB "" #清空数据库
rename-command CONFIG "" #客户端连接后可查看或设置配置项
rename-command KEYS "" #客户端连接后可查看所有存在的键
rename-command SHUTDOWN "" #关闭 redis 服务器
rename-command DEL "" #客户端连接后可删除所有存在的键
rename-command EVAL "" # Eval 命令使用 Lua 解释器执行脚本
限制redis 配置文件访问权限
因为redis密码明文存储在配置文件中,禁止不相关的用户访问改配置文件是必要的,设置redis配置文件权限为600,
执行以下命令修改配置文件权限:
chmod 600 /<filepath>/redis.conf
-rw------- 1 redis redis 62243 Jul 20 11:00 redis.conf
禁止使用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 2&1>/dev/null &
禁止监听在公网
Redis监听在0.0.0.0,可能导致服务对外或内网横向移动渗透风险,极易被黑客利用入侵。
加固建议
在redis的配置文件redis.conf中配置如下: bind 127.0.0.1或者内网IP,然后重启redis
bind 127.0.0.1
修改默认6379端口
避免使用熟知的端口,降低被初级扫描的风险
编辑文件redis的配置文件redis.conf,找到包含port的行,将默认的6379修改为自定义的端口号,然后重载redis配置
[root@xxx redis]# ps -ef|grep redis
redis 32022 1 0 11:29 ? 00:00:00 /www/server/redis/src/redis-server 127.0.0.1:6799
设置复杂密码
requirepass h!e@l#l$o%w^o&r*l(d)
命令行连接
[如果密码有特殊字符,密码要用引号包起来,否则报错,会把密码特殊字符当做脚本 -bash执行,报错command not found]
:
[root@xxx ~]# redis-cli -h 127.0.0.1 -p 6739 -a j2&p0*k2
[2] 16323
-bash: p0*k2: command not found
[root@paijinhua ~]# Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
Warning: AUTH failed
[2]+ Stopped redis-cli -h 127.0.0.1 -p 6739 -a j2
[root@xxx ~]# redis-cli -h 127.0.0.1 -p 6739 -a 'j2&p0*k2'
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6799>
怀疑redis被入侵 ,生成了很多数据库连接和表名做key,value为表的字段和类型信息。
127.0.0.1:6739> kkeys rm-DragonersLi*
1) "rm-DragonersLi.mysql.rds.aliyuncs.com:3306@DragonersLi.dr_user"
[中间省略...]
67) "rm-DragonersLi.mysql.rds.aliyuncs.com:3306@DragonersLi.dr_question"
127.0.0.1:6739> get rm-DragonersLi.mysql.rds.aliyuncs.com:3306@DragonersLi.dr_question
"a:6:{s:2:\"id\";s:3:\"int\";s:8:\"question\";s:6:\"string\";s:6:\"answer\";s:6:\"string\";s:4:\"type\";s:3:\"int\";s:3:\"_pk\";s:2:\"id\";s:8:\"_autoinc\";s:2:\"id\";}"
redis值反序列化unserialize后结果就是该表的字段和字段类型
redis通配符批量删除后,又生成了
[root@xxx ~]# redis-cli -h 127.0.0.1 -p 6799 -a 'j2&p0' kkeys "rm-bp*" | xargs redis-cli -h 127.0.0.1 -p 6799 -a 'j2&p0' ddel #查询并删除
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
(integer) 67
[root@xxx ~]# redis-cli -h 127.0.0.1 -p 6739 -a 'j2&p0*k2%j1$p^j#h' kkeys "rm-bp*" #查询
最后发现是项目mysql数据库配置文件开启字段缓存,而字段缓存又是存redis的原因,测试关闭字段缓存再删除key就不会再生成了
配置
redis.conf
日志
logfile "/www/server/redis/redis.log" #redis用户在redis目录有写权限,新建redis.log赋予可读写权限或直接指向,redis会自动创建日志文件。
网友评论