Skip to content

Commit cd892cc

Browse files
committed
Redis 配置不当致使 root 被提权漏洞
1 parent 860ac6e commit cd892cc

File tree

2 files changed

+93
-211
lines changed

2 files changed

+93
-211
lines changed

README.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
* [如何在工作中提高Ngixn服务器性能?达到高效](https://juejin.im/post/5adb45e96fb9a07ab773c767?utm_source=gold_browser_extension)
1515
* 项目案例 (Project notes)
1616
* [Nginx 同一个IP上配置多个HTTPS主机](https://github.com/Tinywan/lua-nginx-redis/blob/master/Nginx/more-domain-config.md)
17-
* [Nginx 如何配置一个安全的HTTPS网站服务器] (http://www.cnblogs.com/tinywan/p/7542629.html)
17+
* [Nginx 如何配置一个安全的HTTPS网站服务器](http://www.cnblogs.com/tinywan/p/7542629.html)
1818
* [Nginx 配置启用 HTTP/2](http://www.cnblogs.com/tinywan/p/7860774.html)
1919
* 扩展模块 (Third-party module)
2020
* [nginx-vod-module](http://www.cnblogs.com/tinywan/p/7879559.html)
@@ -43,7 +43,7 @@
4343
* [ngx_lua 扩展模块学习](/Openresty/openresty-resty-module.md)
4444
* [lua-resty-upstream-healthcheck使用](/Openresty/lua-resty-upstream-healthcheck.md)
4545
* [Openresty与Nginx_RTMP](/Openresty/openresty-rtmp.md)
46-
* [自己写的一个简单项目lua_project_v0.01] (https://github.com/Tinywan/lua_project_v0.01)
46+
* [自己写的一个简单项目lua_project_v0.01](https://github.com/Tinywan/lua_project_v0.01)
4747

4848
#### PHP 相关
4949
* [PHP脚本运行Redis](#PHP_Run_Redis)

Redis/redis-safety.md

+91-209
Original file line numberDiff line numberDiff line change
@@ -1,212 +1,94 @@
1-
## Redis 简易安装教程
2-
#### 一、编译安装
3-
+ 下载、解压
4-
5-
```javascript
6-
wget http://download.redis.io/releases/redis-3.2.8.tar.gz
7-
tar -zxvf redis-3.2.8.tar.gz
8-
cd redis-3.2.8
9-
```
10-
+ make 编译
11-
+ 编译之前
12-
13-
```lua
14-
00-RELEASENOTES BUGS CONTRIBUTING COPYING deps INSTALL Makefile MANIFESTO README.md redis.conf runtest
15-
runtest-cluster runtest-sentinel sentinel.conf src tests utils
16-
```
17-
+ 编译完成之后,可以看到解压文件redis-3.0.7 中会有对应的src、conf等文件
18-
+ 这和windows下安装解压的文件一样,大部分安装包都会有对应的类文件、配置文件和一些命令文件。
19-
+ 进入src文件夹,执行make install进行Redis安装
20-
21-
```bash
22-
tinywan@tinywan:~/redis-3.2.8/src$ sudo make install
23-
[sudo] tinywan 的密码:
24-
25-
Hint: It's a good idea to run 'make test' ;)
26-
27-
INSTALL install
28-
INSTALL install
29-
INSTALL install
30-
INSTALL install
31-
INSTALL install
32-
```
33-
#### 二、部署文件结构
34-
+ 首先为了方便管理,将Redis文件中的conf配置文件和常用命令移动到统一文件中
35-
+ 创建以下文件目录
36-
37-
```bash
38-
~/redis-3.2.8/src$ sudo mkdir -p /usr/local/redis/bin
39-
~/redis-3.2.8/src$ sudo mkdir -p /usr/local/redis/etc
40-
```
41-
+ 切换到`redis-3.2.8`目录,移动`redis.conf`配置文件:
42-
43-
```javascript
44-
~/redis-3.2.8/src$ cd ..
45-
~/redis-3.2.8$ sudo mv /home/tinywan/redis-3.2.8/redis.conf /usr/local/redis/etc
46-
```
47-
+ 继续进入到`src`目录执行其他文件移动:
48-
49-
```javascript
50-
~/redis-3.2.8$ cd src/
51-
sudo mv mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-rdb redis-cli
52-
redis-sentinel redis-server redis-trib.rb /usr/local/redis/bin
53-
```
54-
#### 三、配置和启动redis服务
55-
+ 编辑`redis.conf`
56-
57-
```
58-
cd /usr/local/redis/etc
59-
vi redis.conf
60-
```
61-
+ 需要修改的参数
62-
63-
```lua
64-
--后台运行
65-
daemonize yes
66-
67-
--端口号
68-
port 63700
69-
70-
--和哪个网卡绑定,和客户端是什么网段没有关系,这里我绑定的是内网网卡,
71-
bind 10.10.101.127
72-
73-
-- AES("https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Redis/redis-install.md") 加密
74-
-- 结果:b6Pbc42gP8hXPNLzZaDnhREijtn1BSVSIYTkhTXw8SuPGpWZvN5kVpVeEVBdEQDw7M/+EZuDS6FxTOtgD2QrPe6014LPEdv2DY+YSUQZ4cE=
75-
76-
requirepass b6Pbc42gP8hXPNLzZaDnhREijtn1BSVSIYTkhTXw8SuPGpWZvN5kVpVeEVBdEQDw7M/+EZuDS6FxTOtgD2QrPe6014LPEdv2DY+YSUQZ4cE=
77-
78-
-- db文件名
79-
dbfilename dump63700.rdb
80-
81-
-- log 日志文件路径
82-
logfile "/usr/local/redis/etc/redis_63700.log"
83-
84-
-- 安全考虑,rename-command 配置以下命令
85-
rename-command FLUSHALL "tinywangithubFLUSHALL"
86-
87-
rename-command CONFIG "tinywangithubCONFIG"
88-
89-
rename-command SHUTDOWN "tinywangithubSHUTDOWN"
90-
91-
rename-command DEBUG "tinywangithubDEBUG"
92-
```
93-
+ 启动redis服务,并指定启动服务配置文件,检测运行端口,为了安全,请不要使用root用户去启动
94-
```java
95-
$ sudo chown -R www:www /usr/local/redis/ //赋予指定该用户组,而非root账号
96-
$ /usr/local/redis/bin/redis-server /usr/local/redis/etc/redis63700.conf
97-
$ ps -aux | grep redis
98-
www 70764 0.6 0.1 38160 0:00 /usr/local/redis/bin/redis-server 127.0.0.1:63700
99-
www 70768 0.0 0.0 15984 0:00 grep --color=auto redis
100-
```
101-
+ redis-cli启动、检测重置命令是否生效(结果:配置文件已经OK
102-
```lua
103-
$ redis-cli -h 127.0.0.1 -p 63700 -a b6Pbc42gP8hXPNLzZaDnhREijtn1BSVSIYTkhTXw8SuPGpWZvN5kVpVeEVBdEQDw7M/+EZuDS6FxTOtgD2QrPe6014LPEdv2DY+YSUQZ4cE=
104-
127.0.0.1:63700> set username tinywan
105-
OK
106-
127.0.0.1:63700> get username
107-
"tinywan"
108-
127.0.0.1:63700> SHUTDOWN
109-
(error) ERR unknown command 'SHUTDOWN'
110-
127.0.0.1:63700> FLUSHALL
111-
(error) ERR unknown command 'FLUSHALL'
112-
127.0.0.1:63700> tinywangithubFLUSHALL
113-
OK
114-
127.0.0.1:63700> get username
115-
(nil)
116-
127.0.0.1:63700>
117-
```
118-
+ 远程链接出现的错误:
119-
+ 错误信息
120-
121-
```lua
122-
DENIED Redis is running in protected mode because protected mode is enabled,
123-
no bind address was specified, no authentication password is requested to clients.......
124-
```
125-
+ 修改配置文件:`protected-mode yes` 修改为`protected-mode no `
126-
+ 查看远程Redis服务器的版本 `redis-cli -h 192.168.1.3 info | grep 'redis_version'`
127-
128-
#### 四、Redis开机启动的方法
129-
+ [Linux中设置Redis开机启动的方法](http://www.jb51.net/article/110286.htm)
130-
+ 环境:`Ubuntu 16.04.2 LTS`
131-
+ 编辑脚本:`vim /etc/init.d/redis `
132-
133-
```javascript
134-
#!/bin/sh
135-
#
136-
# Simple Redis init.d script conceived to work on Linux systems
137-
# as it does use of the /proc filesystem.
138-
### BEGIN INIT INFO
139-
# Provides: redis6379
140-
# Required-Start: $local_fs $network
141-
# Required-Stop: $local_fs
142-
# Default-Start: 2 3 4 5
143-
# Default-Stop: 0 1 6
144-
# Short-Description: redis6379
145-
# Description: penavico redis 6379
146-
### END INIT INFO
147-
148-
REDISPORT=6379 # 【1】修改一
149-
EXEC=/usr/local/bin/redis-server
150-
CLIEXEC=/usr/local/bin/redis-cli
151-
152-
PIDFILE=/var/run/redis_${REDISPORT}.pid
153-
CONF="/usr/local/redis/etc/redis_6379.conf" # 【2】修改二
154-
155-
case "$1" in
156-
start)
157-
if [ -f $PIDFILE ]
158-
then
159-
echo "$PIDFILE exists, process is already running or crashed"
160-
else
161-
echo "Starting Redis server..."
162-
$EXEC $CONF
163-
fi
164-
;;
165-
stop)
166-
if [ ! -f $PIDFILE ]
167-
then
168-
echo "$PIDFILE does not exist, process is not running"
169-
else
170-
PID=$(cat $PIDFILE)
171-
echo "Stopping ..."
172-
$CLIEXEC -p $REDISPORT shutdown
173-
while [ -x /proc/${PID} ]
174-
do
175-
echo "Waiting for Redis to shutdown ..."
176-
sleep 1
177-
done
178-
echo "Redis stopped"
179-
fi
180-
;;
181-
*)
182-
echo "Please use start or stop as first argument"
183-
;;
184-
esac
185-
```
186-
+ 注册事件,开机启动:`update-rc.d redis defaults`
187-
+ 启动服务:`sudo systemctl start redis`
188-
+ 停止服务:`sudo systemctl stop redis`
189-
+ 查看服务是否启动:
190-
191-
```javascript
192-
www@Tinywan:~/redis-4.0.0/utils$ ps -aux | grep redis
193-
root 1722 0.0 0.8 44752 8300 ? Ssl 13:08 0:00 /usr/local/bin/redis-server 127.0.0.1:6379
194-
www 1730 0.0 0.1 14224 1024 pts/0 S+ 13:08 0:00 grep --color=auto redis
195-
196-
```
197-
198-
#### 五、Redis数据迁移
199-
+ 查找RDB文件:
200-
201-
```sudo find / -name dump.rdb```
202-
+ 进行远程拷贝备份文件:
203-
204-
```scp ./dump.rdb [email protected]:/home/www/redis/```
205-
+ 数据迁移步骤如下
206-
+1)关闭目标Redis服务;
207-
+2)将相应的RDB文件或者AOF文件复制过去;
208-
+3)设置REDISDIR或者开启AOF功能;
209-
+4)启动目标REDIS服务;
1+
## Redis 配置不当致使 root 被提权漏洞
2+
3+
#### 问题来源
4+
5+
阿里云报警,提示`Linux系统计划任务配置文件写入行为`,随后立即登录与主机返现redis服务被干掉了
6+
7+
#### 原因分析
8+
9+
自己个人维护的一个项目在提交代码的时候把redis配置也提交到github了
10+
11+
#### 漏洞描述
12+
13+
Redis 服务因配置不当,可被攻击者恶意利用。黑客借助 Redis 内置命令,可将现有数据恶意清空;如果 Redis 以 root 身份运行,黑客可往服务器上写入 SSH 公钥文件,直接登录服务器。
14+
15+
#### 受影响范围
16+
17+
对公网开放,且未启用认证的 Redis 服务器(没有设置密码的redis)
18+
19+
#### 修复方案
20+
21+
注意:以下操作,均需重启 Redis 后才能生效。
22+
23+
##### 绑定需要访问数据库的 IP
24+
25+
将 Redis.conf 中的 bind 127.0.0.1 修改为需要访问此数据库的 IP 地址。
26+
27+
绑定只允许内网可以访问:`bind 172.19.230.35`
28+
29+
##### 设置访问密码
30+
31+
在 Redis.conf 中 requirepass 字段后,设置添加访问密码。
32+
33+
Redis官方建议,由于Redis速度很快,外部用户可以尝试使用对密码箱每秒150k密码。 这意味着你应该使用非常强大的密码,否则将很容易中断。
34+
35+
密码强度最好是64字符以上,可以使用base64获取其他方式生成改密码
36+
37+
如:`requirepass WktjD1QB9xX2W/WktjD1QB9xX/oDZSnH8m283ern8YiFtY=v81xzLNU`
38+
39+
##### 修改 Redis 服务运行账号
40+
41+
以较低权限账号运行 Redis 服务,且禁用该账号的登录权限。
42+
43+
* 当前redis运行账号为:`root`
44+
* 新建较低权限账号`redis`用户:`sudo useradd -s /bin/bash -d /home/redis -m redis -g www -G www`
45+
> dsfds
46+
> fsdfds
47+
48+
* 修改用户组:`sudo usermod -g www redis`
49+
* 设置账号密码:`passwd redis`
50+
* 使用低权限账号` redis` 启动redis服务
51+
```bash
52+
sudo -u redis ../bin/redis-server ./redis.conf
53+
```
54+
* 查看redis启动用户信息
55+
```bash
56+
ps -axu | grep redis
57+
redis 2495 0.0 0.4 38472 4624 ? Ssl May29 0:22 /redis-server *:63009
58+
redis 2510 0.0 0.3 36424 3528 ? Ssl May29 0:22 /redis-server 172.19.230.35:6379
59+
```
60+
> 启动两个服务,一个是通过公网可以访问,而另外一个是和内网绑定的
61+
62+
* 可能会遇到权限问题
63+
提示:`Failed opening the RDB file dump.rdb (in server root dir /home) for saving: Permission denied`,出现上面的问题原因适用于以前使用`root`账号启动服务,现在使用级别较低的`redis`启动服务,导致redis服务没办法加载db文件导致的 ,所以赋予该db文件为redis用户所属:`chown redis:www 63789-dump.rdb`
64+
65+
* redis 参数优化配置
66+
* 编辑 `vim /etc/sysctl.conf`文件,添加内容:`'vm.overcommit_memory = 1'`并且使用root执行`sysctl vm.overcommit_memory=1`是能够生效
67+
* 使用root执行命令:`echo never > /sys/kernel/mm/transparent_hugepage/enabled`
68+
69+
* 禁止`redis`运行账号登录 `passwd -l redis`,这就话的意思是锁定`redis`用户,这样该用户就不能登录了。
70+
71+
##### 参考建议
72+
73+
日志文件和数据库文件最好使用绝对路径
74+
75+
* 日志文件路径:`logfile "/home/redis/log/6379.log"`
76+
* 数据库文件路径:`dir "/home/redis/data"`
77+
78+
#### 使用xshell连接阿里云服务器登陆时密码框为灰色,无法输入密码解决办法
79+
80+
* 使用阿里云`[远程连接]`
81+
* 编辑文件:`vi/etc/ssh/sshd_config`
82+
* 修改最后一项为yes:`PasswordAuthentication yes`
83+
* 保存退出,重启`sshd`服务`systemctl restart sshd.service`然后重新登陆,此时,一切就OK啦
84+
85+
#### 参考文献
86+
* [redis crackit入侵事件总结](https://blog.csdn.net/u012573259/article/details/51803447)
87+
* [Redis 配置不当致使 root 被提权漏洞](https://help.aliyun.com/knowledge_detail/37433.html)
88+
* [linux 新建用户、用户组 以及为新用户分配权限](https://www.cnblogs.com/mingforyou/archive/2012/06/19/2555045.html)
89+
90+
91+
21092

21193

21294

0 commit comments

Comments
 (0)