前言
最近华为云云耀云服务器L实例上新,也搞了一台来玩,期间遇到过MySQL数据库被攻击的情况,数据丢失,还好我有几份备份,没有造成太大的损失。昨天收到华为云的邮箱提醒,我的redis数据库没有设置密码,也就是说只要知道我服务器的ip以及redis的端口就能连上我的redis数据库。我说怎么我的redis里面的数据总是会莫名消失。。。
本篇博客介绍redis连接密码设置以保证redis缓存数据库的安全性,以及查看redis数据库相关情况的命令。
其他相关的华为云云耀云服务器L实例评测文章列表如下:
-
初始化配置SSH连接 & 安装MySQL的docker镜像 & 安装redis以及主从搭建 & 7.2版本redis.conf配置文件
-
安装Java8环境 & 配置环境变量 & spring项目部署 &【!】存在问题未解决
-
部署spring项目端口开放问题的解决 & 服务器项目环境搭建MySQL,Redis,Minio…指南
-
由于自己原因导致MySQL数据库被攻击 & MySQL的binlog日志文件的理解
-
拉取创建canal镜像配置相关参数 & 搭建canal连接MySQL数据库 & spring项目应用canal初步
文章目录
- 前言
- 引出
- 一、redis允许任何人访问的风险
- 1.认识redis未授权访问漏洞
- 2.漏洞的危害
- 二、漏洞的复现
- 1.数据泄密+flush删库跑路
- 三、漏洞的解决
- 1.数据泄密的初步解决---加连接密码
- 四、redis的其他命令学习
- 1.database的设置和切换
- 2.client 相关命令
- 总结
引出
1.redis漏洞—轻微:攻击者知道ip+端口就可以访问redis,所以redis的数据会被泄露,另外,攻击者可以执行flushall命令来清空所有数据;
2.redis漏洞—严重:通过eval命令来执行lua脚本;
3.redis漏洞—危险:如果redis以root身份运行,黑客可以给root账户写入SSH公钥文件,直接通过SSH登陆受害服务器;
一、redis允许任何人访问的风险
1.认识redis未授权访问漏洞
Redis未授权访问漏洞是指,如果Redis服务器没有采取相应的安全策略,如添加防火墙规则阻止非信任来源的IP访问,那么未经授权的用户就可以直接访问和操作Redis服务。
这个漏洞产生的原因主要是Redis默认绑定在0.0.0.0:6379,并未开启认证。所以如果攻击者可以访问目标服务器,那么他们无需授权就可以访问Redis服务,甚至可以读取Redis的数据。
如果一个系统存在这个漏洞,攻击者可能会利用该漏洞进行恶意操作。比如,攻击者可以利用Redis提供的config命令,进行写文件操作,将ssh公钥写入目标服务器的/root/.ssh文件夹中的authorized_keys文件,从而利用ssh服务登录目标服务器。
在我之前的redis设置中,(1)允许任何ip访问;(2)免密码登陆redis服务;因此存在较大风险。
bind 允许任何ip访问
保护模式关闭
2.漏洞的危害
(1)轻微:攻击者知道ip+端口就可以访问redis,所以redis的数据会被泄露,另外,攻击者可以执行flushall命令来清空所有数据;
* FLUSHALL [ASYNC | SYNC]
* 功能:删除所有数据;
* Delete all the keys of all the existing databases
(2)严重:通过eval命令来执行lua脚本;
* EVAL script numkeys [key [key ...]] [arg [arg ...]]
* 功能:执行lua脚本;
* Invoke the execution of a server-side Lua script.
(3)危险:如果redis以root身份运行,黑客可以给root账户写入SSH公钥文件,直接通过SSH登陆受害服务器;
https://www.zoomeye.org/ 用这个网址搜索结果如下:
redis漏洞
二、漏洞的复现
1.数据泄密+flush删库跑路
在windows中安装redis的以cmd的方式运行redis-cli客户端
redis通过监听一个TCP端口或socket的方式接收来自客户端的连接,
当与客户端建立连接后,redis内部会进行如下操作:
- (1)客户端socket会被设置为非阻塞模式,因为redis在网络时间处理上采用的是非阻塞多路复用模型;
- (2)然后为这个socket设置TCP_NODELAY属性,禁用Nagle算法;
- (3)然后创建一个可读的文件事件用于监听这个客户端socket的数据发送。
启动一下之前搭的从,端口6380,在windows上连接,数据泄密,然后flushall删库跑路
D:\Myprogram\redis>redis-cli -h 124.70.138.34 -p 6380
124.70.138.34:6380> keys *
1) "backup3"
2) "backup4"
3) "backup2"
4) "backup1"
124.70.138.34:6380> flushall
(error) READONLY You can't write against a read only replica.
124.70.138.34:6380> slaveof no one
OK
124.70.138.34:6380> flushall
OK
124.70.138.34:6380> keys *
(empty list or set)
124.70.138.34:6380> set pet 123
OK
124.70.138.34:6380> keys *
1) "pet"
通过上述操作,从变成了主,黑白颠倒
三、漏洞的解决
1.数据泄密的初步解决—加连接密码
在redis.cnf中设置连接redis数据库的密码
root@hcss-ecs-52b8:~# docker exec -it redis_6379 bash
root@706d04b2ea4d:/data# redis-cli
127.0.0.1:6379> keys *
(error) NOAUTH Authentication required.
127.0.0.1:6379> auth 设置的密码
OK
127.0.0.1:6379> keys *
1) "backup1"
2) "backup3"
3) "jwt1"
4) "backup4"
5) "backup2"
127.0.0.1:6379> config get requirepass
1) "requirepass"
2) 设置的密码
127.0.0.1:6379>
四、redis的其他命令学习
1.database的设置和切换
在redis.cnf中设置,databases参数,默认是16个数据库
进入redis-cli客户端后利用select 3进行数据库切换
用config get databases可以获得配置的参数
[root@localhost ~]# docker exec -it redis_6379 bash
root@5d04e3abf91f:/data# redis-cli
127.0.0.1:6379> keys *
1) "book"
2) "weather"
3) "stu"
4) "usernames"
5) "tom_bank"
6) "dress"
7) "peter"
8) "username"
9) "goods"
10) "mycar"
127.0.0.1:6379> select 3
OK
127.0.0.1:6379[3]> keys *
(empty array)
127.0.0.1:6379[3]> config get databases
1) "databases"
2) "16"
RedisDesktopManager软件连接时,在超出索引自动退出
2.client 相关命令
- CLIENT LIST获取客户端列表
- CLIENT SETNAME 设置当前连接点redis的名称
- CLIENT GETNAME 查看当前连接的名称
- CLIENT KILL ip:port 杀死指定连接
127.0.0.1:6379> info clients
# Clients
connected_clients:1
cluster_connections:0
maxclients:10000
client_recent_max_input_buffer:8
client_recent_max_output_buffer:0
blocked_clients:0
tracking_clients:0
clients_in_timeout_table:0
total_blocking_keys:0
total_blocking_keys_on_nokey:0
127.0.0.1:6379> config get maxclients
1) "maxclients"
2) "10000"
127.0.0.1:6379> CLIENT LIST
id=12 addr=127.0.0.1:44442 laddr=127.0.0.1:6379 fd=8 name= age=1123 idle=0 flags=N db=0 sub=0 psub=0 ssub=0 multi=-1 qbuf=26 qbuf-free=20448 argv-mem=10 multi-mem=0 rbs=1024 rbp=0 obl=0 oll=0 omem=0 tot-mem=22426 events=r cmd=client|list user=default redir=-1 resp=2 lib-name= lib-ver=
127.0.0.1:6379> CLIENT LIST
id=12 addr=127.0.0.1:44442 laddr=127.0.0.1:6379 fd=8 name= age=2903 idle=0 flags=N db=0 sub=0 psub=0 ssub=0 multi=-1 qbuf=26 qbuf-free=20448 argv-mem=10 multi-mem=0 rbs=1024 rbp=0 obl=0 oll=0 omem=0 tot-mem=22426 events=r cmd=client|list user=default redir=-1 resp=2 lib-name= lib-ver=
id=47 addr=112.21.24.25:19880 laddr=172.18.12.79:6379 fd=9 name= age=604 idle=447 flags=N db=0 sub=0 psub=0 ssub=0 multi=-1 qbuf=0 qbuf-free=0 argv-mem=0 multi-mem=0 rbs=1024 rbp=0 obl=0 oll=0 omem=0 tot-mem=1928 events=r cmd=setex user=default redir=-1 resp=3 lib-name= lib-ver=
127.0.0.1:6379>
总结
1.redis漏洞—轻微:攻击者知道ip+端口就可以访问redis,所以redis的数据会被泄露,另外,攻击者可以执行flushall命令来清空所有数据;
2.redis漏洞—严重:通过eval命令来执行lua脚本;
3.redis漏洞—危险:如果redis以root身份运行,黑客可以给root账户写入SSH公钥文件,直接通过SSH登陆受害服务器;