Redis
了解redis
redis是一種開源、使用c語言撰寫的、支持網路互動的,可基于記憶體也可以持久化的Key-Value資料庫,
資料結構
Redis使用的資料結構如下:String、list、集合、有序集合、哈希,對于key的使用不應太長(盡量不要超過1024位元組),造成消耗過多的記憶體,影響查找的效率,也不應過短影響key的可讀性,對key應有統一的格式,
在使用string時,如果遇到數值操作,redis會將字串型別轉換為數值,
List的底層實作是鏈表,因此在首位插入元素的時間復雜度都是常數級的,list的常用操作為LPUSH、RPUSH、LRANGE,
Redis的集合分為有序集合與無序集合,其區別是有序集合每一個元素都關聯一個序號,通常將無序集合稱為set而有序集合為zset因為有序集合的操作都是以z為開頭,
哈希是從redis-2.0.0版本之后才有的資料結構,存的是字串和字串值之間的映射,比如一個用戶要存盤其全名、姓氏、年齡等等,就很適合使用哈希,
持久化
Redis的持久化分為兩種,分別為RDB(Redis DataBase)和AOF(Append Only File),若不進行持久化則redis將變為純記憶體資料庫,
RDB是一種快照式的持久化,即將某一時刻的資料持久化存入磁盤之中,進行持久化時,會先創建一個行程,建立一個臨時檔案,待持久化完成后再替換上次持久化好的檔案,這種持久化下,每一個快照都是完整可用的,方便隨時備份,缺點是這種方法存的是一個時刻的快照,時刻間均會產生間隔,若間隔太多會產生資源上的浪費,間隔太長出現問題就會流失大量的資料,因此還可以使用AOF持久化,
AOF是將redis經歷過的所有寫的指令記錄下來,是只允許追加不允許改寫的檔案,AOF重寫是會創建一個新的子行程,讀取現有AOF檔案存入臨時檔案,并將新接受的指令存入記憶體緩沖區,在保著原有AOF檔案的同時避免重寫程序出現意外,當重寫結束時會提供給父行程一個信號,將記憶體緩沖區的新指令加入到新檔案,追加結束后,就可以產生新的AOF檔案替代舊檔案,并由新AOF檔案接受新的寫指令,默認的AOF持久化策略是每秒鐘fsync一次,通過一同使用RDB、AOF,即可產生更為可靠的持久化方案,
主從同步
像MySQL一樣,redis是支持主從同步的,而且也支持一主多從以及多級從結構,
主從結構,一是為了純粹的冗余備份,二是為了提升讀性能,比如很消耗性能的SORT就可以由從服務器來承擔,
redis的主從同步是異步進行的,這意味著主從同步不會影響主邏輯,也不會降低redis的處理性能,
主從架構中,可以考慮關閉主服務器的資料持久化功能,只讓從服務器進行持久化,這樣可以提高主服務器的處理性能,
在主從架構中,從服務器通常被設定為只讀模式,這樣可以避免從服務器的資料被誤修改,但是從服務器仍然可以接受CONFIG等指令,所以還是不應該將從服務器直接暴露到不安全的網路環境中,如果必須如此,那可以考慮給重要指令進行重命名,來避免命令被外人誤執行,
從服務器會向主服務器發出SYNC指令,當主服務器接到此命令后,就會呼叫BGSAVE指令來創建一個子行程專門進行資料持久化作業,也就是將主服務器的資料寫入RDB檔案中,在資料持久化期間,主服務器將執行的寫指令都快取在記憶體中,
在BGSAVE指令執行完成后,主服務器會將持久化好的RDB檔案發送給從服務器,從服務器接到此檔案后會將其存盤到磁盤上,然后再將其讀取到記憶體中,這個動作完成后,主服務器會將這段時間快取的寫指令再以redis協議的格式發送給從服務器,
另外,要說的一點是,即使有多個從服務器同時發來SYNC指令,主服務器也只會執行一次BGSAVE,然后把持久化好的RDB檔案發給多個下游,在redis2.8版本之前,如果從服務器與主服務器因某些原因斷開連接的話,都會進行一次主從之間的全量的資料同步;而在2.8版本之后,redis支持了效率更高的增量同步策略,這大大降低了連接斷開的恢復成本,
主服務器會在記憶體中維護一個緩沖區,緩沖區中存盤著將要發給從服務器的內容,從服務器在與主服務器出現網路瞬斷之后,從服務器會嘗試再次與主服務器連接,一旦連接成功,從服務器就會把“希望同步的主服務器ID”和“希望請求的資料的偏移位置(replication offset)”發送出去,主服務器接收到這樣的同步請求后,首先會驗證主服務器ID是否和自己的ID匹配,其次會檢查“請求的偏移位置”是否存在于自己的緩沖區中,如果兩者都滿足的話,主服務器就會向從服務器發送增量內容,
增量同步功能,需要服務器端支持全新的PSYNC指令,這個指令,只有在redis-2.8之后才具有,
事務處理
事務是指“一個完整的動作,要么全部執行,要么什么也沒有做”,Redis的事物處理由4個基礎指令組成:
1.MULTI用來組裝一個事務;
2.EXEC用來執行一個事務;
3.DISCARD用來取消一個事務;
4.WATCH用來監視一些key,一旦這些key在事務執行之前被改變,則取消事務的執行,
Redis的漏洞
未授權漏洞
原理
Redis 默認情況下,會系結在 0.0.0.0:6379,如果沒有進行采用相關的策略,比如添加防火墻規則避免其他非信任來源 ip 訪問等,這樣將會將 Redis 服務暴露到公網上,如果在沒有設定密碼認證(一般為空)的情況下,會導致任意用戶在可以訪問目標服務器的情況下未授權訪問 Redis 以及讀取 Redis 的資料,攻擊者在未授權訪問 Redis 的情況下,利用 Redis 自身的提供的config 命令,可以進行寫檔案操作,攻擊者可以成功將自己的ssh公鑰寫入目標服務器的 /root/.ssh 檔案夾的authotrized_keys 檔案中,進而可以使用對應私鑰直接使用ssh服務登錄目標服務器,
危害
1、攻擊者無需認證訪問到內部資料,可能導致敏感資訊泄露,黑客也可以惡意執行flushall來清空所有資料;
2、攻擊者可通過EVAL執行lua代碼,或通過資料備份功能往磁盤寫入后門檔案;
3、最嚴重的情況,如果Redis以root身份運行,黑客可以給root賬戶寫入SSH公鑰檔案,直接通過SSH登錄受害服務器
防護
- 系結IP的方式來進行控制,
在redis.conf檔案找到如下配置
# If you want you can bind a single interface, if the bind option is not
# specified all the interfaces will listen for incoming connections.
#
# bind 127.0.0.1
把 #bind 127.0.0.1前面的注釋#號去掉,然后把127.0.0.1改成允許訪問redis服務器的ip地址,表示只允許該ip進行訪問,這種情況下,在啟動redis服務器的時候不能再用:redis-server,改為:redis-server path/redis.conf 即在啟動的時候指定需要加載的組態檔,其中path/是上面修改的redis組態檔所在目錄,
2.設定密碼,以提供遠程登陸
打開redis.conf組態檔,找到requirepass,然后修改如下:
requirepass yourpassword
yourpassword就是redis驗證密碼,設定密碼以后發現可以登陸,但是無法執行命令了,
命令如下:
redis-cli -h yourIp -p yourPort//啟動redis客戶端,并連接服務器
keys * //輸出服務器中的所有key
報錯如下
(error) ERR operation not permitted
這時候你可以用授權命令進行授權,就不報錯了
命令如下:
auth youpassword
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/290796.html
標籤:其他
下一篇:BugKu_網站被黑
