加密备份解决方案 “家庭偏执版”

作者:Tim Cordova

如何使用 TrueCrypt 和 SpiderOak 保护您的个人数据。

如今,互联网上泄露个人身份信息 (PII) 或任何类型数据的情况数不胜数。本文提供的详细信息可能有助于保护您的税务信息、社会安全号码或密码文件。本文描述的设置将有助于在这个“网络安全”互联的世界中,确保您的个人数据在家中安全无虞。这包括虚拟/物理安全漏洞——唯一真正安全的系统是断开电源并锁在保险库中的系统。此解决方案并非包罗万象,并且存在局限性,但它足以保护个人数据。

第一步是解决安全的物理层面。这是一个关键步骤,因为一些值得注意的安全漏洞是由于有人物理访问系统直接造成的。您应该始终为您的心爱的电子设备可能在任何给定时刻落入他人之手做好准备。这种情况可能发生在火车上、咖啡店、汽车或家中,当数据超出您的控制范围时,您必须假设您的数据已丢失。

本文介绍如何利用全盘加密来降低出色的开源 Linux 操作系统 (Ubuntu 12.10) 带来的一些风险。全盘加密是一个关键因素,特别是考虑到最近发生的与包含数百万社会安全号码的被盗政府笔记本电脑有关的所有事件。

图 1. Ubuntu 初始操作系统安装期间加密主目录的设置屏幕。

保护您个人信息的下一个关键步骤是在初始安装期间加密主目录,从而增加另一层安全保障(图 1)。您可能是唯一使用此系统的人;但是,如果其他人在系统运行时能够访问您的系统,这可能会减缓他们尝试访问主目录中包含的信息的速度。

您将需要运行命令


sudo apt-get install ecryptfs-utils cryptsetup

使用支持高级软件包工具的发行版。这将安装加密主目录所需的加密实用程序。

下一步是登录或创建另一个具有 root 权限的用户帐户,以便在用户的主目录上运行以下命令(图 2)


sudo ecryptfs-migrate-home -u your-user-name

然后,您需要在重新启动计算机之前登录到加密的主目录帐户(如重要提示屏幕中所述),以便在加密过程中发生任何意外复杂情况时提供回滚机会。

使用 encryptfs-unwrap-passphrase 记录您随机生成的挂载密码。请妥善保管此密码,因为您可能需要它来恢复您的加密文件。此外,请确保您重新启动系统并删除未加密的备份文件夹(图 3)。

图 2. 如果在初始安装期间错过了加密您的主文件夹,请使用 encryptft-utils 加密您的主目录。

图 3. 这是重要的反馈信息“尽快记录密码”,它将从 encryptfs-migrate-home 命令生成。

过程中的第三步是利用一个出色的开源应用程序 TrueCrypt 来提供加密容器以存储个人信息。这个简单的过程包括访问 TrueCrypt 网站 http://www.truecrypt.org/downloads 下载最新的软件包(truecrypt-7.1a-linux-x86.tar.gz,在撰写本文时),并运行以下命令和脚本


tar -xvf truecrypt-7.1a-linux-x86.tar.gz
sudo ./truecrypt-7.1a-linux-x86
select ? Install TrueCrypt at the gui menu. 

图 4. TrueCrypt 安装按钮

下一步是创建一个加密容器。此容器将存储个人身份信息 (PII) 或您想要在本地计算机上安全保存的任何文件,并且它将创建另一层安全保障。创建基本容器的过程是在初始安装期间选择默认选项(图 4)。安装软件后,可以使用命令 truecrypt & 或通过 GUI 菜单系统选择创建卷按钮轻松启动应用程序。

图 5. TrueCrypt 创建卷按钮屏幕

图 6. 选择创建卷按钮后,您将看到两个选项,用于创建加密文件容器或在分区/驱动器中创建卷。

创建卷时有两个选项:选择加密文件容器或分区/驱动器内的卷(图 5 和 6)。您还可以选择使用标准 TrueCrypt 卷或隐藏的 TrueCrypt 卷(图 7)。隐藏容器背后的想法是显示外部容器密码,以及您的 隐藏在外部容器内加密的隐藏容器

图 7. 下一个菜单项为您提供了创建标准卷或隐藏卷的选项。

在下一个菜单中,只需选择加密算法、哈希算法和容器大小。许多书籍和论文提供了关于这些算法和哈希之间差异的具体信息(AES,具有 256/14 轮和 Sha-512 默认哈希函数)。容器的大小取决于您要保护的信息量(图 8)。

图 8. 选择标准卷后,接下来的选项是选择加密和哈希算法以及卷的大小。

下一步是选择您首选的文件系统类型(ext3、ext4 等)。卷创建过程完成后,使用 TrueCrypt 应用程序挂载您的卷,并开始将您的私有文件保存到此加密容器中。

图 9. 选择新创建的标准卷以挂载可访问的未加密共享。

为您新创建的加密容器提供安全可靠的在线存储位置对于在云中备份数据至关重要。有几个在线存储位置可供选择,例如 Dropbox、Evernote、AWS 和 SpiderOak。安全云存储的最终选择是 SpiderOak 公司,这基于该公司“零知识”隐私政策,其中声明:“我们从不了解您的密码,也无法检索或重置它,即使在紧急情况下也是如此。这是我们确保客户数据始终完全安全(甚至对我们也是如此)的方式!”

该公司还提供双因素身份验证,以进一步保护,需要用户名、密码和令牌。每当您需要登录网站或移动设备时,令牌将发送到您的手机。大多数知名供应商都提供双因素身份验证,因为传统的密码/密码短语不能提供足够的保护。鉴于此解决方案部署在专用桌面上并需要令牌进行身份验证,因此它提供了真正的双通道身份验证解决方案。当然,使用双因素身份验证并不能保证安全,但它确实要求攻击者使用复杂的方法,而攻击者通常很懒惰,会寻找容易的目标。

对于所有 Debian 用户来说,安装 SpiderOak 非常简单。它包括从 https://spideroak.com/opendownload 下载并安装 spideroak_4.8.4_i386.deb 包,并使用 sudo dpkg -i spideroak_4.8.4_i386.deb 在您最喜欢的 Ubuntu 平台上安装此软件包。

将本地上传文件夹标识为 TrueCrypt 容器的暂存点。拥有将托管 TrueCrypt 容器的共享位置后,只需打开 SpiderOak 应用程序并选择备份选项卡。然后,向下钻取,直到找到您的 TrueCrypt 容器位置,例如 home/username/SpiderO/Upload。

下一步是使用概览选项卡并选择更改按钮来配置您的备份频率(图 10 和 11)。

图 10. SpiderOak 应用程序中的备份选项卡允许您选择您的加密卷。

图 11. SpiderOak 应用程序状态和备份菜单提供了一种在指定时间间隔自动备份加密卷的方法。

使用此界面可以进行许多其他配置选项。对于本示例,仅使用这两个选项进行安全云备份。

此加密备份解决方案的最后几个步骤是将 TrueCrypt 容器从工作位置移动到指定的 SpiderOak 导出文件夹,并创建一个 cron 作业来运行脚本。

我创建了一个 Python 脚本来完成复制功能,但我本可以创建任何类型的脚本。此脚本用于确保 TrueCrypt 应用程序未运行,验证容器是否发生更改,然后在发生更改时复制容器。此脚本需要一个名为 FolderandFileLoc 的配置文件才能运行,以及 Python 脚本 BackupScript.py。配置文件参数为 SpiderOakPath、TrueCryptPath 和 LogFilepath,一个运行日志用于验证复制是否成功,以及 Safefile 文件名。

列表 1. SpiderOak/TrueCrypt 备份脚本

#!/usr/bin/python 
''' 
SpiderOak, TrueCrypt, dis-mount, Backup Script 
@author: Tim 
''' 
import os 
import string 
import datetime 
import hashlib 
FolderandFileLoc = "FolderandFileLoc" 
SpiderOakPath = " " 
TrueCryptPath = " " 
LogFilepath = " " 
safefile = " " 

def readconfigfile(SpiderOakPath,TrueCryptPath,LogFilepath,safefile, 
 ↪Setupfileopen): 
    # This will read the configuration and assign path location 
    now = datetime.datetime.now() 
    holdstr = ""  
    for line in Setupfileopen: 
        holdstr = str.split(line) 
        if string.find(line,"SpiderOakPath") > -1: 
            SpiderOakPath = holdstr[1] 
        elif string.find(line,"TrueCryptPath") > - 1: 
            TrueCryptPath = holdstr[1] 
        elif string.find(line, "LogFilepath") > -1: 
            LogFilepath = holdstr[1] 
        elif string.find(line,"safefile") > -1: 
            safefile = holdstr[1] 
            
    fo = open(LogFilepath,"a")  
    try:        
        fo = open(LogFilepath,"a") 
        fo.write (str(now) + "- Path Variable SpiderOakPath 
         ↪used -> " + SpiderOakPath + "\n") 
        fo.write (str(now) + "- Path Variable TrueCryptPath 
         ↪used -> " + TrueCryptPath + "\n") 
        fo.write (str(now) + "- Path Variable LogFilepath 
         ↪used -> " + LogFilepath + "\n") 
        fo.write (str(now) + "- Path Variable hold 
         ↪used -> " + safefile + "\n") 
    except: fo.error   
    shutdowntruecrypt(fo,now) 
    copycontainer(fo,SpiderOakPath,TrueCryptPath,
    ↪LogFilepath,safefile,now) 
    fo.close    
    
    
def shutdowntruecrypt(fo,now): 
    # Test to see if the truecypt is running 
    # If not then Shut it down 
    foundstring = 0    
    try: 
        f = os.popen( "ps ax" ) 
    except: os.error 
    
    for line in f: 
        if string.find(line, 'truecrypt') > -1: 
            foundstring = 1 
            break             
    
    if foundstring == 1: 
        try: 
            dismount = os.system("truecrypt -d") 
            if dismount == 0: 
                fo.write (str(now) + "- True Crypt0service found 
                 ↪and the volume is dis-mounted \n"); 
            else: 
                fo.write (str(now) + "- Failed to 
                 ↪dismount service \n "); 
        except: os.error 
    else: 
        fo.write (str(now) + "- mount was not open \n "); 
     
def copycontainer(fo,SpiderOakPath,TrueCryptPath,
↪LogFilepath,safefile,now): 
    #Set Destination and Copy to new location 
         
    Holddestfilesum = TrueCryptPath + safefile 
    Holdorigfilesum = SpiderOakPath + "/" + safefile 
    checksumdest = md5filecheck(Holddestfilesum) 
    checksumorig = md5filecheck(Holdorigfilesum) 
    
    
    runstring = "cp "  # This will only copy over updates 
                       # to this file 
    runstring += TrueCryptPath 
    runstring += safefile       
    runstring += "  " 
    runstring += SpiderOakPath  # This will only send over any 
                                # updates to this file 
    testdiff = os.system("diff " + Holddestfilesum + " 
     ↪" + Holdorigfilesum) 
 
    
    if testdiff !=0: 
        try: 
            os.system(runstring) 
            testdiff = os.system("diff " + Holddestfilesum + " 
             ↪" + Holdorigfilesum) 
            if testdiff != 0 :	    
                fo.write (str(now) + TrueCryptPath + safefile +  
                 ↪" File Copied to " + SpiderOakPath + "\n") 
                fo.write(str(now) +  " ---- Processing Complete ----") 
            else: 
                fo.write(str(now) + TrueCryptPath + safefile + 
                 ↪"File failed to copy " + SpiderOakPath + "\n") 
        except: os.error 
         
    else: 
        fo.write (str(now) + " File has not been changed 
         ↪no copy was performed\n") 
        
       
         
Setupfileopen = open(FolderandFileLoc,"r") 
readconfigfile(SpiderOakPath,TrueCryptPath,LogFilepath,safefile, 
 ↪Setupfileopen) 
Setupfileopen.close() 

最后一步是创建一个 cron 作业来调用 Python 脚本


0 5 * * * cd /home/t/workspace/BackupScript/src; /usr/bin/python
/home/t/workspace/BackupScript/src/BackupScript.py

这种个人加密解决方案非常适合在家中日常使用。互联网上有许多应用程序可用于管理密码和数据,但此解决方案易于实施并提供多层加密。我相信使用所描述的加密容器和存储位置为私人个人数据提供了足够的安全性,但对于拥有各种监管机构的企业来说,它可能不是理想的解决方案。使用所描述的方法需要您自担风险,并确保您的密码或密码短语得到妥善保管,因为一旦忘记密码,您的数据将会丢失。

加载 Disqus 评论