王杰


摘要:目前隨著互聯網的發展,NoSQL數據庫得到飛速發展,鍵值數據庫Redis得到了廣泛應用,但與此同時,安全性風險急劇增加。文章詳細分析了Redis數據庫的安全風險點,分析Redis.conf配置文件的重要性,提出了幾種相應的解決辦法,有助于提高Redis數據庫安全性。
關鍵詞:數據庫;安全;NoSQL;非關系型數據庫;Redis;Redis.conf
中圖分類號:TP311? ? ? ? 文獻標識碼:A
文章編號:1009-3044(2022)30-0060-03
開放科學(資源服務)標識碼(OSID):
隨著互聯網Web2.0網站的興起,傳統的關系數據庫在處理超大規模數據和高并發動態網站已經顯得力不從心,出現了很多難以克服的問題,而非關系型的數據庫則由于其本身的特點和優勢得到了非常迅速的發展。
NoSQL(Not Only SQL或Non-relational Databases),通常是指非關系型的數據庫系統,是為了解決大規模數據集合和多重數據種類帶來的挑戰。NoSQL數據庫具有數據存儲結構靈活、可擴展性高、支持數據的最終一致性、大數量、高性能等優點。常用的NoSQL數據庫類型有:Key-Value鍵值存儲數據庫、文檔存儲數據庫、列存儲數據庫、圖存儲數據庫及其他類型存儲數據庫。
Redis(Remote Dictionary Server ),即遠程字典服務,是一個開源的使用ANSI C語言編寫、支持網絡、可基于內存亦可持久化的日志型、Key-Value鍵值數據庫,并提供多種語言的API。
Redis是一個Key-Value存儲系統,支持存儲的value類型包括:string(字符串類型)、list(列表類型)、set(集合類型)、zset(有序集合類型)、hash(哈希類型)、stream(流類型)、geo(地理位置)等。為了保證效率,Redis數據都是緩存在內存中,因此也可以稱Redis為內存數據庫。為了保證數據的安全性Redis會周期性地把更新的數據寫入磁盤或者把修改操作寫入追加的記錄文件中。
Redis提供了Java、C/C++、Python、C#、PHP、JavaScript、Perl、Object-C、Rub等客戶端,使用非常方便。截至2022年3月,在www.db-engines.com網站,DB-Engines Ranking數據庫排行榜上,Redis位列所有數據庫管理系統排名第六位,非關系型數據庫管理系統排名第二位(僅次于MongoDB),Key-Value鍵值數據庫管理系統排名第一位。
目前Redis數據庫系統得到了廣泛應用,但和大型關系數據管理系統相比,Redis安全性需要提高,例如Redis默認管理員密碼為空,缺少用戶管理機制,沒有用戶權限管理機制,不支持為每個數據庫設置不同的訪問密碼等。國內外已經發生過許多起大規模針對Redis服務器的入侵事件和Redis安全事件,因此在應用中需要對Redis數據庫系統安全性高度重視。
1 Redis版本的選擇
Redis數據庫服務器主要運行在Linux操作系統中,可以訪問Redis官方網站https://www.Redis.io,下載最新版本軟件。Redis軟件版本有穩定版本(Stable)、不穩定版本(Unstable)、候選版本(Release-Candidate)、容器版本(Docker Hub)、云計算版本(In the Cloud)等,在生產環境中,一定要選擇穩定版本(Stable)安裝與使用。
Redis官方不支持Windows操作系統,但許多開發愛好者和軟件公司在Github上發布了Redis Windows版本,可以下載使用,但僅限用于學習,不能用于生產環境中。
2 Redis配置文件Redis.conf
在Redis數據庫系統中,Redis.conf是一個非常重要的配置文件(在Windows操作系統,文件名為Redis.windows.conf和Redis.windows-service.conf),這個文件中存儲著數據庫管理員密碼、網絡地址、端口號等一些非常重要的參數,對Redis數據庫系統的安全設置也通常是通過配置這個文件來實現。
在Linux操作系統中一定要注意對Redis主目錄和Redis.conf文件的權限設置,將Redis主目錄權限設置為700,將Redis.conf文件獨立于主目錄,權限設置為600,保證Redis.conf文件不被非法讀寫執行訪問。
Redis提供了一個輕量級的認證方式,設置后,每一個客戶端連接在操作數據之前需要進行認證,密碼在Redis.conf配置文件中明文設置。同時,在使用中密碼也是明文傳輸的,由于Redis訪問速度非常快,為了安全,數據庫管理員密碼一般較長且復雜,防止暴力攻擊。
3 對Redis.conf安全管理
3.1設置管理員密碼
Redis數據庫服務器安裝完成后,默認情況下數據庫管理員密碼是空的,意味著用戶無須通過密碼驗證就可以連接到 Redis 服務器,這存在著重大安全隱患,因此必須為Redis服務器設置管理員密碼,讓Redis服務器運行更安全。
方法一:修改Redis.conf配置文件,增加一行。
Requirepass? beijing2022? ? #beijing2022是新設置的數據庫管理員密碼
然后需要重新啟動Redis服務器,管理員密碼才能發揮作用。
方法二:使用命令客戶端,為當前Redis服務器設置密碼,命令格式如下:
#設置密碼為beijing2022
127.0.0.1:6379> CONFIG? set? requirepass? beijing2022
#將密碼寫入Redis.conf文件中
127.0.0.1:6379> CONFIG? rewrite
使用命令行客戶端設置密碼成功后,需要使用命令CONFIG rewrite將密碼寫入到Redis.conf文件中,否則密碼只對服務器本次開啟時段有效,重啟后繼續使用原來配置文件的密碼。
設置密碼后,客戶端連接 Redis 服務器就需要密碼驗證,否則無法執行命令,客戶端密碼驗證語法:
127.0.0.1:6379> AUTH? beijing2022
和傳統關系數據庫相比,由于Redis服務器查詢速度非常快,外部用戶可以每秒試探150K以上個密碼,必須使用非常強大的密碼,否則很容易被破解。因此在設置密碼一方面要提高密碼的復雜程度,使用“字母+數字+特殊字符”組成,另一方面提高密碼長度,生產環境中的Redis數據庫管理員密碼設置建議32位以上長度。
設置好管理員密碼,客戶端連接格式如下:
Redis-cli.exe? -p? 6379? -a? myPassWord
3.2限制對Redis服務器訪問
在Redis.conf文件中有Bind參數,可以設置綁定本機網卡IP地址[8]。
通常Redis服務器都有多塊網卡,每一塊網卡對應一個IP地址,例如IP1和IP2,IP1和IP2都是本機的IP地址。在配置文件中增加一行Bind? IP1,表示只能通過IP1來訪問連接和管理Redis服務器;如果通過IP2來訪問Redis服務器,就會連不上Redis服務器。
如果指定了Bind,則說明只允許來自指定服務器網卡的Redis請求;如果沒有指定,就說明可以接受來自任意一塊服務器網卡的Redis請求,而不是Redis允許來自其他計算機的IP地址。
方法一:限定本機才可以訪問Redis服務器
打開Redis.conf配置文件,增加一行:
Bind 127.01.1
方法二:限定指定計算機訪問Redis服務器
限定只有指定的主機可以連接到Redis服務器,可以通過防火墻來控制,而不能通過Redis.conf文件中的Bind參數來限制。
3.3修改Redis服務器端口號
不同的數據庫使用不同的端口號來遠程管理數據庫,例如MySQL默認端口號是3306,SQL Server默認端口號是1433,Oracle默認端口號是1521,Redis數據庫默認端口號是6379,為了防止非法用戶掃描Redis服務器庫,可以將端口號修改。
修改Redis.conf文件中 Port? 6379 修改為 Port? 6380。
修改Redis端口后,訪問方法也需要修改:
Redis-cli.exe? -h? 192.168.1.99? -p? 6380
3.4高級語言訪問Redis服務器方法
當修改了Redis管理員密碼、端口號后,高級語言訪問Redis服務器連接字符串要修改,以Python語言為例。
Import Redis
Client =Redis.Redis(host=192.168.1.99,port=6380,password=myPassword)
4 危險命令禁用和重命名
在Redis數據庫中有一些權限高、非常危險的命令,這些命令破壞性極強,會對Redis庫服務器運行及數據庫安全造成非常嚴重的影響,一旦操作失誤使用這些命令,會導致災難性的后果。
因此如何避免非法入侵者和人為操作失誤使用這些命令,導致災難性的后果是Redis數據庫安全管理特別需要關注的內容。
例如FLUSHDB清空當前數據庫的所有key,相當于關系數據庫語言SQL中的Drop Database命令;Flushall清空整個Redis服務器中所有數據庫的所有key,在關系數據庫語言SQL中還沒有破壞性如此之強的命令,相當于Linux操作系統中的 rm -rf /* 命令。常用的Redis危險命令如表2所示。
對Redis危險命令,可以將命令進行分級管理,將危險性強的命令禁用,危險性一般的命令重命名。主要方法是通過修改Redis.conf配置文件,在SECURITY 區域,對危險命令進行禁用和重命名,從而降低Redis數據庫系統的風險性。
在Redis.conf配置文件中提供了 rename-command 指令用于將某些危險的命令禁用或重命令,提高系統的安全性。
指令格式:rename-command keys ******
方法一:禁用命令
rename-command FLUSHDB? ""
rename-command FLUSHALL ""
rename-command EVAL? ? ?""
rename-command DEBUG? ? ""
方法二:重命名命令
rename-command CONFIG? ? ?"XXXX"
rename-command SHUTDOWN? ?"XXXX"
rename-command INFO? ? ? ?"XXXX"
上面的XXXX是危險命令的新命令名稱,新命令名稱要盡可能長一些,或者用隨機字符串代替。經過以上的設置之后,重啟Redis服務器,就需要用新命令來執行操作,否則服務器會報錯(error)ERR unknown command。
對于FLUSHALL命令禁用或重命名后,同時需要在Redis.conf配置文件中設置參數appendonly no,否則服務器無法啟動。
需要注意的是,在Redis數據庫系統中,有些命令是可以正常使用,但是如果使用不當,也會造成服務器資源耗盡,造成系統堵塞卡頓,例如Keys * 、Save、Monitor等命令。因此在生產數據庫系統中,數據庫管理員和開發人員應當謹慎或禁止使用這些命令。
5 小結
隨著Redis數據庫系統在數據高并發讀寫、海量數據讀寫等業務場景使用越來越廣泛,應用于緩存系統(熱點數據,高頻讀、低頻寫)、計數器、消息隊列系統、排行榜、社交網絡和實時系統等,對系統的安全性要求更高,必須采取有效措施來保證Redis數據庫服務器的安全性。
參考文獻:
[1] 黃健宏.Redis設計與實現[M].北京:機械工業出版社,2014.
[2] 張云河,王碩.Redis 6開發與實戰[M].北京:人民郵電出版社,2021.
[3] 李燚,顧乃杰,黃增士,等.Redis集群可靠性的研究與優化[J].計算機工程,2018,44(5):40-46.
[4] 劉建臣.簡單技巧提高Redis的安全性[J].網絡安全和信息化,2020(8):132-133.
[5] 曾云青.Oracle數據庫安全問題探析與應對策略研究[J].中國設備工程,2021(16):18-19.
[6] 蔣睿.MySQL數據庫安全研究[J].電腦知識與技術,2020,16(9):3-4,21.
[7] 丁志堅.基于Redis的云數據庫的研究與實現[D].成都:電子科技大學,2021.
[8] 賀桂英,周杰,王旅.數據庫安全技術[M].北京:人民郵電出版社,2018.
[9] 曾金燕.高性能Redis數據庫安全手冊[J].計算機與網絡,2015,41(6):44-45.
[10] 李建華,夏汛,羅明全.基于ThinkPHP和Redis的高并發微信公眾號開發的研究與實現[J].計算機應用與軟件,2019,36(2):108-112.
[11] solid IT.DB-Engines Ranking[EB/OL].https://db-engines.com/en/ranking.
[12] 楊璐潔.基于Redis存儲安全的網絡安全知識在線培訓系統的設計與實現[D].北京:北京郵電大學,2019.
[13] 施瑤.互聯網+背景下數據庫安全保障對策研究[J].數字通信世界,2021(4):241-242.
[14] 張勝昌,張艷,趙良昆.SQL Server數據庫安全影響因素及優化設計措施分析[J].電腦編程技巧與維護,2022(1):83-84,98.
[15] 陳越,寇紅召,費曉飛.數據庫安全[M].北京:國防工業出版社,2011.
[16] 劉瑜,劉勝松.NoSQL數據庫入門與實踐基于MongoDB、Redis[M].北京:中國水利水電出版社,2018.
[17] 謝乾坤.左手MongoDB,右手Redis 從入門到商業實戰[M].北京:電子工業出版社,2019.
【通聯編輯:王力】