淺談Redis安全策略
Redis 提供了諸多安全策略,比如為了保證數(shù)據(jù)安全,提供了設(shè)置密碼的功能。Redis 密碼設(shè)置主要有兩種方式:一種是使用CINFIG命令來設(shè)置密碼;另外一種則是手動(dòng)修改 Redis 的配置文件。雖然看似前者更為簡(jiǎn)單,其實(shí)兩種方式各有特點(diǎn)。本節(jié)將對(duì)它們進(jìn)行介紹。
命令配置密碼
通過執(zhí)行以下命令查看是否設(shè)置了密碼驗(yàn)證:
127.0.0.1:6379> CONFIG get requirepass 1) "requirepass" 2) ""
在默認(rèn)情況下 requirepass 參數(shù)值為空的,表示無需通過密碼驗(yàn)證就可以連接到 Redis 服務(wù)。
下面執(zhí)行以下命令設(shè)置密碼。如下所示:
127.0.0.1:6379> CONFIG set requirepass "www.jb51.net" OK 127.0.0.1:6379> CONFIG get requirepass 1) "requirepass" 2) "www.jb51.net"
執(zhí)行完上述操作后,客戶端要連接到 Redis 服務(wù)就需要密碼驗(yàn)證,如果不驗(yàn)證就無法操作 Redis 數(shù)據(jù)庫。如下所示:
127.0.0.1:6379> set key name www.biancheng.net #報(bào)錯(cuò)無法操作 (error) NOAUTH Authentication required.
使用AUTH命令驗(yàn)證密碼:
127.0.0.1:6379> AUTH www.jb51.net OK #執(zhí)行命令成功 127.0.0.1:6379> SET name www.jb51.net OK 127.0.0.1:6379> GET name www.jb51.net
注意:通過命令行設(shè)置的密碼并非永久有效,當(dāng)您重啟服務(wù)后密碼就會(huì)失效,所以一般不采用這種方式。下面介紹一種永久有效的修改方式,也就是手動(dòng)配置密碼。
手動(dòng)配置密碼
手動(dòng)修改配置密碼也非常的簡(jiǎn)單,首先,您要在 Redis 的安裝目錄中找到 redis.windows.conf 配置文件,然后打開該文件,并使用 Ctrl+F 搜索 requirepass 關(guān)鍵字,找到配置項(xiàng)并配置密碼,如下所示:
# requirepass foobared requirepass www.jb51.net //配置自己的密碼
然后使用更改后的配置文件重啟服務(wù)器,依次執(zhí)行以下命令:
#首先停止服務(wù): C:\Users\Administrator>redis-server.exe --service-stop #重啟服務(wù)器 C:\Users\Administrator>redis-server.exe --service-start #重新登陸 C:\Users\Administrator>redis-cli.exe -h 127.0.0.1 -p 6379 -a www.jb51.net Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. #命令執(zhí)行成功 127.0.0.1:6379>config get requirepass 1)"requirepass" 2)"www.jb51.net"
手動(dòng)配置無須驗(yàn)證密碼,只需要重新啟動(dòng) Redis 服務(wù)器。這種配置方式,密碼永遠(yuǎn)有效。如果想取消密碼設(shè)置,您需要將配置文件更改回原來的狀態(tài),然后再次重啟服務(wù)器,即可取消。
除了需要為 Redis 配置密碼外,我們?cè)谑褂?Redis 時(shí)也需要注意一些常見的安全風(fēng)險(xiǎn)以及防范措施,從而避免數(shù)據(jù)泄露和丟失,以及人為操作失誤等。
指令安全
Redis 有一些非常危險(xiǎn)的命令,這些命令會(huì)對(duì) Redis 的穩(wěn)定以及數(shù)據(jù)安全造成非常嚴(yán)重的影響。比如 keys 指令會(huì)導(dǎo)致 Redis 卡頓,而 flushdb 和 flushall 會(huì)讓 Redis 的所有數(shù)據(jù)全部清空。那么如何避免這些操作失誤帶來的災(zāi)難性后果呢?
Redis 在配置文件中提供了 rename-command 指令用于將某些危險(xiǎn)的指令修改成特別的名稱,用來避免人為誤操作。比如在配置文件的 security 模塊增加以下內(nèi)容:
rename-command keys 123keys123
如果您還想執(zhí)行 keys 命令,那就需要在命令行輸入123keys123。 當(dāng)然也可以將指令 rename 成空字符串,這樣就無法通過字符串來執(zhí)行 keys 命令了。
rename-command flushall ""
端口安全
Redis 默認(rèn)監(jiān)聽*:6379,如果當(dāng)前的服務(wù)器主機(jī)有外網(wǎng)地址,那么 Redis 的服務(wù)將會(huì)直接暴露在公網(wǎng)上,別有用心的人使用適當(dāng)?shù)奶綔y(cè)工具就可以對(duì) IP 地址進(jìn)行端口掃描,從而威脅您的系統(tǒng)安全。
如果 Redis 的服務(wù)地址一旦可以被外網(wǎng)直接訪問,其內(nèi)部數(shù)據(jù)就徹底喪失了安全性。黑客們可以通過 Redis 執(zhí)行 Lua 腳本拿到服務(wù)器權(quán)限,然后清空您的 Redis 數(shù)據(jù)庫。因此務(wù)必在 Redis 的配置文件中綁定要監(jiān)聽的 IP 地址,避免類似的情況發(fā)生。如下所示:
bind 193.168.1.1 #綁定外網(wǎng)ip地址
不僅如此,還可以增加 Redis 的密碼訪問限制,客戶端必須使用 auth 命令傳入正確的密碼才可以訪問 Redis。
requirepass yourspassword
這樣即使地址暴露出去了,普通黑客也無法對(duì) Redis 服務(wù)器進(jìn)行任何指令操作。
密碼配置也會(huì)影響到主從復(fù)制。要求從機(jī)必須配置與主服務(wù)相同的密碼才可以進(jìn)行主從復(fù)制。
masterauth yourspassword
SSH代理
Redis 不支持 SSL 鏈接,這意味著客戶端和服務(wù)器交互的數(shù)據(jù)不應(yīng)該在公網(wǎng)上傳輸,否則會(huì)有被竊聽的風(fēng)險(xiǎn)。如果必須要在公網(wǎng)上,可以考慮使用 SSL 代理。SSL 代理比較常見的有 ssh。Redis 官方也推薦了一種代理工具,也就是 spiped (點(diǎn)擊了解)。 其功能雖然單一,但使用起來比較簡(jiǎn)單,易于理解。
補(bǔ)充:
1. 開啟redis密碼認(rèn)證,并設(shè)置高復(fù)雜度密碼
redis在redis.conf配置文件中,設(shè)置配置項(xiàng)requirepass, 開戶密碼認(rèn)證。
打開redis.conf,找到requirepass所在的地方,修改為指定的密碼,密碼應(yīng)符合復(fù)雜性要求:
1、長(zhǎng)度8位以上
2、包含以下四類字符中的三類字符:
英文大寫字母(A 到 Z)
英文小寫字母(a 到 z)
10 個(gè)基本數(shù)字(0 到 9)
非字母字符(例如 !、$、#、%、@、^、&)
3、避免使用已公開的弱密碼,如:abcd.1234 、admin@123等
再去掉前面的#號(hào)注釋符,然后重啟redis
2. 禁止監(jiān)聽在公網(wǎng)
Redis監(jiān)聽在0.0.0.0,可能導(dǎo)致服務(wù)對(duì)外或內(nèi)網(wǎng)橫向移動(dòng)滲透風(fēng)險(xiǎn),極易被黑客利用入侵。
在redis的配置文件redis.conf中配置如下:
bind 127.0.0.1或者內(nèi)網(wǎng)IP,然后重啟redis
3. 禁止使用root用戶啟動(dòng)
使用root權(quán)限去運(yùn)行網(wǎng)絡(luò)服務(wù)是比較有風(fēng)險(xiǎn)的(nginx和apache都是有獨(dú)立的work用戶,而redis沒有)。redis crackit 漏洞就是利用root用戶的權(quán)限來替換或者增加authorized_keys,來獲取root登錄權(quán)限的
使用root切換到redis用戶啟動(dòng)服務(wù): useradd -s /sbin/nolog -M redis sudo -u redis /<redis-server-path>/redis-server /<configpath>/redis.conf
4. 限制redis 配置文件訪問權(quán)限
因?yàn)閞edis密碼明文存儲(chǔ)在配置文件中,禁止不相關(guān)的用戶訪問改配置文件是必要的,設(shè)置redis配置文件權(quán)限為600,
chmod 600 /<filepath>/redis.conf
5. 修改默認(rèn)6379端口
避免使用熟知的端口,降低被初級(jí)掃描的風(fēng)險(xiǎn)
編輯文件redis的配置文件redis.conf,找到包含port的行,將默認(rèn)的6379修改為自定義的端口號(hào),然后重啟redis
6. 禁用或者重命名危險(xiǎn)命令
Redis中線上使用keys *命令,也是非常危險(xiǎn)的。因此線上的Redis必須考慮禁用一些危險(xiǎn)的命令,或者盡量避免誰都可以使用這些命令,Redis沒有完整的管理系統(tǒng),但是也提供了一些方案。
修改 redis.conf 文件,添加 rename-command FLUSHALL "" rename-command FLUSHDB "" rename-command CONFIG "" rename-command KEYS "" rename-command SHUTDOWN "" rename-command DEL "" rename-command EVAL "" 然后重啟redis。 重命名為"" 代表禁用命令,如想保留命令,可以重命名為不可猜測(cè)的字符串,如: `rename-command FLUSHALL joYAPNXRPmcarcR4ZDgC`
7. 打開保護(hù)模式
redis默認(rèn)開啟保護(hù)模式。要是配置里沒有指定bind和密碼,開啟該參數(shù)后,redis只能本地訪問,拒絕外部訪問。
redis.conf安全設(shè)置: # 打開保護(hù)模式 protected-mode yes
8. redis集群設(shè)置密碼
1,如果是使用redis-trib.rb工具構(gòu)建集群,集群構(gòu)建完成前不要配置密碼,集群構(gòu)建完畢再通過config set + config rewrite命令逐個(gè)機(jī)器設(shè)置密碼
2,如果對(duì)集群設(shè)置密碼,那么requirepass和masterauth都需要設(shè)置,否則發(fā)生主從切換時(shí),就會(huì)遇到授權(quán)問題,可以模擬并觀察日志
3,各個(gè)節(jié)點(diǎn)的密碼都必須一致,否則Redirected就會(huì)失敗
# redis-cli -c -p 7004 127.0.0.1:7004> config set masterauth frank OK 127.0.0.1:7004> config set requirepass frank OK 127.0.0.1:7004> CONFIG REWRITE (error) NOAUTH Authentication required. 127.0.0.1:7004> auth frank OK 127.0.0.1:7004> config rewrite OK 127.0.0.1:7004> exit [root@iZj6c7eeosj2t5vjw8rf4xZ redis_cluster]# redis-cli -c -p 7004 -a frank
4,設(shè)置密碼之后如果需要使用redis-trib.rb的各種命令報(bào)錯(cuò)問題
如:
# redis-trib.rb check 47.52.41.245:7003 [ERR] Sorry, can't connect to node 47.52.41.245:7003
解決辦法:
找到建立集群時(shí)執(zhí)行g(shù)em install redis命令生成的client.rb文件,如果不知道該文件在哪可以通過下面命令查找
# find / -name client.rb -print /tmp/frank/ruby/ruby-2.2.8/lib/xmlrpc/client.rb /usr/local/lib/ruby/gems/2.2.0/gems/redis-4.0.0/lib/redis/client.rb /usr/local/lib/ruby/2.2.0/xmlrpc/client.rb
我這邊的那個(gè)文件是/usr/local/lib/ruby/gems/2.2.0/gems/redis-4.0.0/lib/redis/client.rb
然后修改該文件
# vim /usr/local/lib/ruby/gems/2.2.0/gems/redis-4.0.0/lib/redis/client.rb
修改password對(duì)應(yīng)的值然后保存,就可以了
require_relative "errors" require "socket" require "cgi" class Redis class Client DEFAULTS = { :url => lambda { ENV["REDIS_URL"] }, :scheme => "redis", :host => "127.0.0.1", :port => 6379, :path => nil, :timeout => 5.0, :password => "frank", :db => 0, :driver => nil, :id => nil, :tcp_keepalive => 0, :reconnect_attempts => 1, :inherit_socket => false } attr_reader :options
重新運(yùn)行redis-trib.rb命令
redis-trib.rb check 47.52.41.245:7003 >>> Performing Cluster Check (using node 47.52.41.245:7003) S: cc86a24f3896ad7530e2687cf52582912f74b661 47.52.41.245:7003 slots: (0 slots) slave replicates 908430b2bf63669898e9eaef79dd6c1b33c8c57a M: 668397aba571ece85532b1eb1fccb42e4e33b1f2 116.196.65.198:7001
9. 使用Redis5.0版本創(chuàng)建的集群設(shè)置密碼
直接一步到位,在創(chuàng)建集群前,在配置文件中設(shè)置好密碼(所有配置文件的密碼保持一致),然后使用命令創(chuàng)建集群時(shí)在后面加上-a password參數(shù)。
這樣一來,生成的集群進(jìn)行訪問時(shí)已經(jīng)包含訪問密碼了,不用再事后設(shè)置了。
到此這篇關(guān)于淺談Redis安全策略的文章就介紹到這了,更多相關(guān)Redis安全策略內(nèi)容請(qǐng)搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!
版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。