4.3 數據庫技術新動態
當前數據庫技術的新動態有鍵值對存儲Redis、列存儲Hbase和文檔數據庫存儲MongoDB等。
4.3.1 鍵值對存儲Redis
遠程字典服務(Remote Dictionary Server,Redis)是一個開源的使用ANSI C語言編寫、支持網絡、可基于內存亦可持久化的日志型Key-Value數據庫,并提供多種語言的API。從2010年3月15日起,Redis的開發工作由VMware主持。從2013年5月開始,Redis的開發由Pivotal贊助。
Redis是一個Key-Value存儲系統。和Memcached類似,Redis支持存儲的value類型相對更多,包括string(字符串)、list(鏈表)、set(集合)、zset(sorted set有序集合)和hash(哈希類型)。這些數據類型都支持push/pop,add/remove,取交集、并集、差集,以及更豐富的操作,而且這些操作都是原子性的。在此基礎上,Redis支持各種不同方式的排序。與Memcached一樣,為了保證效率,數據都緩存在內存中。區別是Redis會周期性地把更新的數據寫入磁盤或把修改操作寫入追加的記錄文件,并且在此基礎上實現了master-slave(主從)同步。
Redis是一個高性能的Key-Value數據庫。Redis的出現,很大程度補償了Memcached這類Key/Value存儲的不足,在部分場合可以對關系數據庫起到很好的補充作用。它提供了Java、C/C++、C#、PHP、JavaScript、Perl、Object-C、Python、Ruby和Erlang等客戶端,使用很方便。
Redis安全加固主要涉及以下幾個方面。
(1)網絡加固
如果僅為本地通信,確保Redis監聽在本地。具體設置為在/etc/redis/redis.conf中配置如下:

(2)防火墻設置
如果需要其他機器訪問,或設置了Master-Slave模式,需添加防火墻設置,具體配置如下:

(3)添加認證
默認情況下,Redis未開啟密碼認證。若要開啟認證模式,具體配置如下。
打開/etc/redis/redis.conf,找到requirepass參數,設置密碼后,保存redis.conf文件,最后重啟Redis服務。

(4)設置單獨賬戶
可設置一個單獨的Redis賬戶。創建Redis賬戶,通過該賬戶啟動Redis服務,具體配置如下:

(5)限制Redis文件目錄訪問權限
設置Redis的主目錄權限為700;如果Redis配置文件獨立于Redis主目錄,權限修改為600,因為Redis密碼明文存儲在配置文件中。具體配置如下:

4.3.2 列存儲Hbase
HBase是一個分布式的、面向列的開源數據庫,該技術來源于Fay Chang所撰寫的論文“Bigtable:一個結構化數據的分布式存儲系統”。就像Bigtable利用了Google文件系統(File System)所提供的分布式數據存儲一樣,HBase在Hadoop之上提供了類似于Bigtable的能力。HBase是Apache的Hadoop項目的子項目。HBase不同于一般的關系數據庫,它是一個適合于非結構化數據存儲的數據庫。另一個不同之處是HBase是基于列的而不是基于行的模式。
HBase-Hadoop Database,是一個高可靠性、高性能、面向列和可伸縮的分布式存儲系統,利用HBase技術可在廉價PC服務器上搭建起大規模結構化存儲集群。
與商用大數據產品不同,HBase是Google Bigtable的開源實現,類似Google Bigtable利用GFS作為其文件存儲系統,HBase利用Hadoop HDFS作為其文件存儲系統;Google運行MapReduce來處理Bigtable中的海量數據,HBase同樣利用Hadoop MapReduce來處理HBase中的海量數據;Google Bigtable利用Chubby作為協同服務,HBase利用Zookeeper作為協同服務。
Hbase安全加固主要涉及以下幾個方面。
(1)集群的模式配置
Hbase集群的模式,對于單機模式,值為false;對于偽分布式和完全分布式模式,值為true。如果設置成false,將在同一個JVM中運行所有HBase和Zookeeper守護進程。
建議:將hbase.cluster.distributed值配置為true,其默認值為false。

(2)HBase認證
建議:將hbase.security.authentication配置為kerberos,其默認值為空。
將以下內容添加到每個客戶端上的hbase-site.xml文件中:

(3)Hbase授權
建議:將hbase.security.authorization配置為true,其默認值為false。

4.3.3 文檔數據庫存儲MongoDB
MongoDB是一個基于分布式文件存儲的數據庫,由C++語言編寫,旨在為Web應用提供可擴展的高性能數據存儲解決方案。
MongoDB是一個介于關系數據庫和非關系數據庫之間的產品,是非關系數據庫中功能最豐富、最像關系數據庫的。它支持的數據結構非常松散,類似JSON的BSON格式,因此可以存儲比較復雜的數據類型。Mongo最大的特點是它支持的查詢語言非常強大,其語法類似于面向對象的查詢語言,可以實現類似關系數據庫單表查詢的絕大部分功能,而且還支持對數據建立索引。
文檔是MongoDB中數據的基本單位,類似于關系數據庫中的行(但是比行復雜)。多個鍵及其關聯的值有序地放在一起就構成了文檔。
MongoDB安全加固主要涉及以下幾個方面。
1)啟用auth,即使在可信賴網絡中部署MongoDB服務器,也應該啟用auth,當網絡受到攻擊時它能夠提供深層防御。編輯配置文件來啟用auth。代碼為auth=true。
2)限制對數據庫的物理訪問是確保安全性的重要措施。如果沒有必要,就不要把開發環境的數據庫暴露在Internet上。如果攻擊者不能物理地連接到MongoDB服務器,那么效果就會大打折扣,數據就會更安全。例如,服務部署在亞馬遜Web服務(AWS)上,那么應當把數據庫部署在虛擬私有云(VPC)的私有子網中。
3)使用防火墻。防火墻的使用可以限制允許哪些實體連接MongoDB服務器。最佳的措施是僅允許自己的應用服務器訪問數據庫。如果服務部署在不支持防火墻功能的提供商的主機上,那么可以使用“iptables”對服務器進行簡單的配置。
4)使用key文件建立復制服務器集群。指定共享的key文件,啟用復制集群的MongoDB實例之間的通信。如給配置文件中增加keyfile參數,復制集群中所有機器上這個文件的內容必須相同。代碼為keyFile=/srv/mongodb/keyfile。
5)禁止REST接口在產線環境下建議不要啟用MongoDB的REST接口。REST接口不支持任何認證,默認情況下此接口是關閉的。如果“rest”配置選項打開了此接口,那么應該在產線系統中將其關閉。代碼為rest=false。
6)要在MongoDB部署中使用TLS/SSL。將mongod和mongos中包含的配置選項net.ssl模式設置為requireSSL,該設置限制每個服務器只能使用TLS/SSL加密連接。還可以指定值allowSSL或preferSSL來設置端口上混合TLS/SSL模式的使用。