在云存儲上疊加加密文件系統(tǒng)
目標很簡單。云存儲上很多文件都挺私人的,直接放著很嚇人。雖說云存儲采用各種方法來保證你的安全,但是世界上沒有絕對的安全。萬一密碼泄漏,或者更糟糕,云存儲泄漏。此時你的各種文件就在網絡上裸奔了。
最簡單的解決方法是什么?在底層存儲上套一層加密唄。不過由于是云存儲,所以基于塊設備的加密方案不能用,例如LUKS。否則你同步到云上的就是一個超級巨大的塊文件,然后每次修改,云存儲客戶端都要找到差別上傳。這太蛋疼了。正解是每個文件分別加密上傳。但即便如此,對于超大文件進行加密后依然會影響上傳效率,請?zhí)崆翱紤]一下這個問題。
同時又要注意,云存儲用的加密文件系統(tǒng)和普通的加密文件系統(tǒng)還有點差別。很多加密文件系統(tǒng)的daemon會認為自己是唯一一個會訪問加密內容的進程,而云存儲可能隨時接收來自遠程的修改。所以這會造成一些問題。
備選方案
我對比了四種方案,EncFS,CryFS,GoCryptFS,eCryptFS。對比的方法是用這四種分別建立一個加密目錄,然后用不同的方法做寫入測試,看他的各種參數(shù)。順便說一句,如果你要看的話,其實看這份表格就好。我只是在自己的機器上復現(xiàn)了一下,順便了解一下各家特點。
測試語句:
- time dd if=/dev/zero of=test bs=1048576 count=1024
- time dd if=/dev/zero of=test bs=1024 count=1048576
- time tar xf linux-4.13.12.tar.xz
其中,在裸盤上直接解壓內核源碼耗時7.568s,空間使用870M。
數(shù)據對比
- +---------+-------+-----+-------+-----+-------+-----+--------------+
- | |time1 |size1|time2 |size2|time3 |size3|comment |
- +---------+-------+-----+-------+-----+-------+-----+--------------+
- |EncFS |13.210s|1.1G |39.039s|1.1G |26.496s|894M | |
- +---------+-------+-----+-------+-----+-------+-----+--------------+
- |CryFS |9.327s |1.1G |21.230s|1.1G |42.918s|2.5G |刪除耗時2.804s|
- +---------+-------+-----+-------+-----+-------+-----+--------------+
- |GoCryptFS|3.515s |1.1G |28.180s|1.1G |19.874s|918M | |
- +---------+-------+-----+-------+-----+-------+-----+--------------+
- |eCryptFS |3.132s |1.1G |10.218s|1.1G |9.448s |1.4G | |
- +---------+-------+-----+-------+-----+-------+-----+--------------+
解讀
首先說怎么解讀。time1是連續(xù)寫入性能,time2是離散寫入性能,time3是小文件寫入性能,size3是大量小文件膨脹系統(tǒng)。size1和size2沒啥用。
下面先看性能。從性能上看,最優(yōu)秀的是eCryptFS。這是理所當然,因為這是唯一一個內核態(tài)而且和內核整合的系統(tǒng)。GoCryptFS次之。EncFS要慢上好多。至于CryFS,一開始寫小文件就原型畢露了。何況這是唯一一個刪除大文件時間超過1s的,達到2.8s。你看我其他系統(tǒng)測試里都沒寫。
然后是膨脹率。EncFS膨脹2.75%,CryFS膨脹近三倍,GoCryptFS膨脹5.52%,eCryptFS膨脹65%。相比起來,EncFS膨脹率最小,GoCryptFS次之,CryFS最糟糕。
安全性
下面是同一個人出的三份審計報告:
根據報告可以得到這么幾個意見。
- EncFS有安全性隱患,目前未解決。主要隱患來自于文件塊加密模式上。如果攻擊者有機會獲得多份密文副本,那么就是不安全的。
- GoCryptFS有一定安全問題,目前未解決。下面細說。
- eCryptFS需要進一步審計,目前可視為安全。
綜敘
可能出乎大家意料,我首先排除了encfs和ecryptfs。encfs是因為有安全性隱患。ecryptfs是因為不便于使用和不兼容云存儲模式。ecryptfs在每次掛載時都需要獨立輸入所有參數(shù),這樣使用起來比較不方便。更糟糕的是,ecryptfs并不支持同時有人訪問加密數(shù)據本身。這樣會造成競爭問題。對于一個內核級的東西來說,這有極大的危險性。同時,這貨的膨脹率有點高。
然后在CryFS和GoCryptFS里,我選擇GoCryptFS。雖然CryFS是唯一一個明確聲明自己兼容云存儲的,但是其膨脹率實在太高了。雖然是云存儲,但是畢竟要考慮性價比的。
那么GoCryptFS的安全問題是什么呢?主要隱患來自和云存儲混用時,攻擊者雖然對文件內容一無所知,但是可以修改文件內容。例如將其他加密文件復制過來,或者將部分內容嫁接過來。審計報告里提供了一系列的POC來說明這一風險。這一風險對于特定情況的用戶來說是非常危險的,例如在加密區(qū)域存儲多個可信身份/帳號身份文件的人。
很幸運,我對這方面沒要求。GoCryptFS的膨脹率不大,僅高于EncFS,完全可以接受。性能也不錯,僅次于eCryptFS。使用非常方便,同時還能提供過得去的安全特性。因此綜合上面所有情況,我選擇GoCryptFS作為云存儲上疊加的加密文件系統(tǒng)。