|
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)设置REDIS的DIR或者开启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 | + |
210 | 92 |
|
211 | 93 |
|
212 | 94 |
|
|
0 commit comments