• CentOS7.X安装Redis-4.0.8以及Redis集群搭建


    安装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 -zxzf 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
      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.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
  • 相关阅读:
    # 20172307 2017-2018-2 《程序设计与数据结构》实验4报告
    20172307 2017-2018-2 《程序设计与数据结构》实验3报告
    20172307 2017-2018-2 《程序设计与数据结构》第10周学习总结
    软件工程之美40讲——最佳实践:小团队如何应用软件工程?
    软件工程之美39讲——项目总结:做好项目复盘,把经验变成能力
    软件工程之美38讲——日志管理:如何借助工具快速发现和定位产品问题 ?
    软件工程之美37讲——遇到线上故障,你和高手的差距在哪里?
    软件工程之美35讲——版本发布:软件上线只是新的开始
    软件工程之美36讲——DevOps工程师到底要做什么事情?
    20172330 2018-2019-1 《程序设计与数据结构》实验一报告
  • 原文地址:https://www.cnblogs.com/telwanggs/p/9513639.html
Copyright © 2020-2023  润新知