編者按:Redis存儲系統(tǒng)在數(shù)據(jù)結(jié)構(gòu)服務(wù)方面為用戶提供了極大便利,但也存在安全隱患,這些安全問題很容易被用戶忽視。本文簡要介紹如何通過一些技巧來提升Redis的安全性。
Redis是開源BSD許可的高級Key-Value存儲系統(tǒng),可存儲字符串、哈希結(jié)構(gòu)、鏈表和集合等,常用來提供數(shù)據(jù)結(jié)構(gòu)服務(wù)。
同Memcached等數(shù)據(jù)庫相比,Redis可以用來做存儲,而Memcached只是用來做緩存,這使Redis可以實(shí)現(xiàn)數(shù)據(jù)的持久化存儲,即可以周期性的將更新的數(shù)據(jù)寫入到磁盤中,以及將修改的操作記錄追加到文件中保存起來。Redis不僅具有豐富的數(shù)據(jù)結(jié)構(gòu),而且支持主從同步。Redis在一定程度上彌補(bǔ)了Memcached這類Key-Value內(nèi)存緩存服務(wù)的不足,對關(guān)系型數(shù)據(jù)庫啟動很好的補(bǔ)充作用,因此,Redis在實(shí)際中得到了廣泛的應(yīng)用。
但是Redis的安全卻很容易被使用者忽視。因?yàn)樵赗edis中并沒有用戶的概念,客戶端可以很輕松的連接上來。而且Redis并發(fā)能力很強(qiáng),運(yùn)行速度很快,對于一臺配置不錯(cuò)的Redis服務(wù)器來說,外部的用戶可以在1 s內(nèi)執(zhí)行15萬次的密碼嘗試,如果不配置密碼或者密碼設(shè)計(jì)的比較簡單的話,惡意用戶可以毫不費(fèi)力的盜取和破壞數(shù)據(jù)庫中信息。因此,從安全的角度考慮,需要為Redis配置長度盡可能長的復(fù)雜密碼來防止暴力破解。
執(zhí)行“vim redis.conf”命令,打開Redis的配置文件,找 到“# requirepass foobared”行,可以看到其默認(rèn)的密碼認(rèn)證功能是被注釋掉的,將該行中的“#”刪除,將原來的“foobared”密碼更換為盡可能復(fù)雜的密碼。
之后執(zhí)行“./bin/redisserver ./redis.conf”命令,來重新啟動Redis服務(wù),當(dāng)然具體的Redis安裝路徑需要根據(jù)實(shí)際情況而定。這里在本地測試,執(zhí)行“./bin/redis-cli”命令,和本地的Redis服務(wù)建立連接。如果不輸入連接密碼的話,雖然可以顯示操作提示符,但是卻無法進(jìn)行任何操作。例如執(zhí)行“set key1 value1”命 令,Redis會顯示“(error) NOAUTH Authentication required”的提示,說明權(quán)限不足需要安全認(rèn)證。在提示符下執(zhí)行“auth xxxxxx”命令,執(zhí)行密碼認(rèn)證,其中的“xxxxxx”為預(yù)設(shè)的密碼,如果密碼正確Redis會顯示“OK”字樣,之后就可以順利執(zhí)行各種操作了。
除了使用上述交互式的登錄認(rèn)證外,也可以執(zhí)行“redis-cli -a xxxxxx”命令,來執(zhí)行進(jìn)行安全認(rèn)證。如果想連接遠(yuǎn)程主機(jī)上的Redis服務(wù),可以執(zhí)行“./bin/redis-cli -h xxx.xxx.xxx.xxx -a xxxxxx -p 6379”,其 中“xxx.xxx.xxx.xxx”為遠(yuǎn)程主機(jī)IP,6379為默認(rèn)端口號。
如果只是臨時(shí)為Redis設(shè)置密碼,可以在Redis連接提示符下執(zhí)行“config set requirepass xxxxxx”命令,為其設(shè)置所需的密碼。執(zhí)行“config get require pass”命令,會顯示該密碼。當(dāng)然如果重啟Redis服務(wù),該臨時(shí)密碼就會消失。
熟悉MySQL數(shù)據(jù)庫的用戶都知道,在MySQL中管理員可以使用Grant命令對數(shù)據(jù)庫進(jìn)行授權(quán),讓不同的用戶只能執(zhí)行規(guī)定的操作,可以有效保護(hù)數(shù)據(jù)庫的安全。在Redis中則可以通過對特定的命令更名或者禁用的方法,來防止使用者隨意操作指定的命令,這也可以在一定程度上保護(hù)數(shù)據(jù)庫的安全。
例如,打開Redis的配置文件,在其中添加“renamecommand set ""”一行,就可以禁用Set命令。當(dāng)連接到Redis服務(wù)器后,執(zhí)行諸如“set key1 value1”等命令時(shí),Redis會提示“(error)ERR unknown command'set'”,說明找不到該命令。
當(dāng)然,為了便于自己使用,可以將特定的命令進(jìn)行更名。這樣,就可以自己使用該命令,而別人因?yàn)椴恢烂畹男旅Q,自然就無法使用了。例如,打開Redis配置文件,在其中添加“rename-command CONFIG xxxxxx”命 令,將“CONFIG”命令更改為新的名稱,這里為“xxxxxx”。按照同樣的方法,可以為各種具有潛在風(fēng)險(xiǎn)的命令進(jìn)行更名,可以有效防止外部用戶隨意使用。即使別人破解了密碼,連接到了Redis及服務(wù)器,因?yàn)椴恢佬碌拿蠲Q,也無法對數(shù)據(jù)庫造成威脅。
在默認(rèn)情況下,Redis會接受來自任何地址發(fā)送來的請求,在很多情況下我們只是在本機(jī)上操作Redis,無需接收來自公網(wǎng)IP的訪問。為此可以打開Redis配置文件,在其中修改bind參數(shù),只允許特定的IP進(jìn)行連接,比如將其修改為“bind 127.0.0.1”,這樣就只能在本機(jī)上連接Redis服務(wù)端了。
當(dāng)然,為了進(jìn)一步提高Redis的安全性,防止惡意用戶利用潛在的Redis漏洞對系統(tǒng)進(jìn)行攻擊,較好的方法是較低權(quán)限賬號運(yùn)行Redis服務(wù),且禁用該賬號的登錄權(quán)限,這樣可以限制攻擊者往磁盤寫入文件。例如,可以執(zhí)行“su -m nobody -c ./bin/redis-server”命令,以Nobody用戶身份啟動Redis服務(wù)等。還可針對Redis連接配置防火墻IPTables策略,僅允許指定的IP來訪問Redis服務(wù),將無關(guān)的網(wǎng)絡(luò)連接屏蔽,可以有效地提高Redis的安全性。