在Linux中創(chuàng )建一個(gè)云端加密文件系統
Amazon S3 和 Google Cloud Storage 之類(lèi)的商業(yè)云存儲服務(wù)以能承受的價(jià)格提供了高可用性、可擴展、無(wú)限容量的對象存儲服務(wù)。為了加速這些云產(chǎn)品的廣泛采用,這些提供商為他們的產(chǎn)品通過(guò)明確的 API 和 SDK 培養了一個(gè)良好的開(kāi)發(fā)者生態(tài)系統。而基于云的文件系統便是這些活躍的開(kāi)發(fā)者社區中的典型產(chǎn)品,已經(jīng)有了好幾個(gè)開(kāi)源的實(shí)現。
本文引用地址:http://dyxdggzs.com/article/201609/304232.htmS3QL 便是最流行的開(kāi)源云端文件系統之一。它是一個(gè)基于 FUSE 的文件系統,提供了好幾個(gè)商業(yè)或開(kāi)源的云存儲后端,比如 Amazon S3、Google Cloud Storage、Rackspace CloudFiles,還有 OpenStack。作為一個(gè)功能完整的文件系統,S3QL 擁有不少強大的功能:最大 2T 的文件大小、壓縮、UNIX 屬性、加密、基于寫(xiě)入時(shí)復制的快照、不可變樹(shù)、重復數據刪除,以及軟、硬鏈接支持等等。寫(xiě)入 S3QL 文件系統任何數據都將首先被本地壓縮、加密,之后才會(huì )傳輸到云后端。當你試圖從 S3QL 文件系統中取出內容的時(shí)候,如果它們不在本地緩存中,相應的對象會(huì )從云端下載回來(lái),然后再即時(shí)地解密、解壓縮。

需要明確的是,S3QL 的確也有它的限制。比如,你不能把同一個(gè) S3FS 文件系統在幾個(gè)不同的電腦上同時(shí)掛載,只能有一臺電腦同時(shí)訪(fǎng)問(wèn)它。另外,ACL(訪(fǎng)問(wèn)控制列表)也并沒(méi)有被支持。
在這篇教程中,我將會(huì )描述“如何基于 Amazon S3 用 S3QL 配置一個(gè)加密文件系統”。作為一個(gè)使用范例,我還會(huì )說(shuō)明如何在掛載的 S3QL 文件系統上運行 rsync 備份工具。
準備工作
本教程首先需要你創(chuàng )建一個(gè) Amazon AWS 帳號(注冊是免費的,但是需要一張有效的信用卡)。
然后 創(chuàng )建一個(gè) AWS access key(access key ID 和 secret access key),S3QL 使用這些信息來(lái)訪(fǎng)問(wèn)你的 AWS 帳號。
之后通過(guò) AWS 管理面板訪(fǎng)問(wèn) AWS S3,并為 S3QL 創(chuàng )建一個(gè)新的空 bucket。

為最佳性能考慮,請選擇一個(gè)地理上距離你最近的區域。

在 Linux 上安裝 S3QL
在大多數 Linux 發(fā)行版中都有預先編譯好的 S3QL 軟件包。
對于 Debian、Ubuntu 或 Linux Mint:
$ sudo apt-get install s3ql
對于 Fedora:
$ sudo yum install s3ql
對于 Arch Linux,使用 AUR。
首次配置 S3QL
在 ~/.s3ql 目錄中創(chuàng )建 autoinfo2 文件,它是 S3QL 的一個(gè)默認的配置文件。這個(gè)文件里的信息包括必須的 AWS access key,S3 bucket 名,以及加密口令。這個(gè)加密口令將被用來(lái)加密一個(gè)隨機生成的主密鑰,而主密鑰將被用來(lái)實(shí)際地加密 S3QL 文件系統數據。
$ mkdir ~/.s3ql$ vi ~/.s3ql/authinfo2
[s3]storage-url: s3://[bucket-name]backend-login: [your-access-key-id]backend-password: [your-secret-access-key]fs-passphrase: [your-encryption-passphrase]
指定的 AWS S3 bucket 需要預先通過(guò) AWS 管理面板來(lái)創(chuàng )建。
為了安全起見(jiàn),讓 authinfo2 文件僅對你可訪(fǎng)問(wèn)。
$ chmod 600 ~/.s3ql/authinfo2
創(chuàng )建 S3QL 文件系統
現在你已經(jīng)準備好可以在 AWS S3 上創(chuàng )建一個(gè) S3QL 文件系統了。
使用 mkfs.s3ql 工具來(lái)創(chuàng )建一個(gè)新的 S3QL 文件系統。這個(gè)命令中的 bucket 名應該與 authinfo2 文件中所指定的相符。使用“--ssl”參數將強制使用 SSL 連接到后端存儲服務(wù)器。默認情況下,mkfs.s3ql 命令會(huì )在 S3QL 文件系統中啟用壓縮和加密。
$ mkfs.s3ql s3://[bucket-name] --ssl
你會(huì )被要求輸入一個(gè)加密口令。請輸入你在 ~/.s3ql/autoinfo2 中通過(guò)“fs-passphrase”指定的那個(gè)口令。
如果一個(gè)新文件系統被成功創(chuàng )建,你將會(huì )看到這樣的輸出:

掛載 S3QL 文件系統
當你創(chuàng )建了一個(gè) S3QL 文件系統之后,下一步便是要掛載它。
首先創(chuàng )建一個(gè)本地的掛載點(diǎn),然后使用 mount.s3ql 命令來(lái)掛載 S3QL 文件系統。
$ mkdir ~/mnt_s3ql$ mount.s3ql s3://[bucket-name] ~/mnt_s3ql
掛載一個(gè) S3QL 文件系統不需要特權用戶(hù),只要確定你對該掛載點(diǎn)有寫(xiě)權限即可。
視情況,你可以使用“--compress”參數來(lái)指定一個(gè)壓縮算法(如 lzma、bzip2、zlib)。在不指定的情況下,lzma 將被默認使用。注意如果你指定了一個(gè)自定義的壓縮算法,它將只會(huì )應用到新創(chuàng )建的數據對象上,并不會(huì )影響已經(jīng)存在的數據對象。
$ mount.s3ql --compress bzip2 s3://[bucket-name] ~/mnt_s3ql
因為性能原因,S3QL 文件系統維護了一份本地文件緩存,里面包括了最近訪(fǎng)問(wèn)的(部分或全部的)文件。你可以通過(guò)“--cachesize”和“--max-cache-entries”選項來(lái)自定義文件緩存的大小。
如果想要除你以外的用戶(hù)訪(fǎng)問(wèn)一個(gè)已掛載的 S3QL 文件系統,請使用“--allow-other”選項。
如果你想通過(guò) NFS 導出已掛載的 S3QL 文件系統到其他機器,請使用“--nfs”選項。
運行 mount.s3ql 之后,檢查 S3QL 文件系統是否被成功掛載了:
$ df ~/mnt_s3ql$ mount | grep s3ql

卸載 S3QL 文件系統
想要安全地卸載一個(gè)(可能含有未提交數據的)S3QL 文件系統,請使用 umount.s3ql 命令。它將會(huì )等待所有數據(包括本地文件系統緩存中的部分)成功傳輸到后端服務(wù)器。取決于等待寫(xiě)的數據的多少,這個(gè)過(guò)程可能需要一些時(shí)間。
評論