Snebu –简单的网络加密备份实用程序

2020-12-27 22:05:37

Snebu是用于Linux的高性能快照式备份系统,支持压缩,重复数据删除和可选的公共密钥加密。它可以通过SSH在单主机模式,推模式(客户端将数据推到服务器)或拉模式(服务器从客户端拉数据)下运行。在拉模式下,客户端上不需要任何代理(使用加密时,程序tarcrypt将需要在客户端上)。

备份是快照样式的,因此仅将最少必需的文件传输到备份服务器以完成备份集。这样可以使存储和带宽利用率降至最低。

服务器端通过SSH访问,支持多个同时运行的客户端,并在文件系统,客户端和备份集之间对备份文件进行重复数据删除。服务器访问支持每个帐户的多用户细化权限(即,可以授予一个帐户备份访问权限,但禁止删除访问权限-用于防止恶意软件攻击)。

这将创建一个名为" snebu"的用户和组,将snebu二进制文件作为SUID安装到用户" snebu"。缺省情况下,配置文件/etc/sneub.conf将文件库放置在/ var / lib / snebu / vault中,将备份目录数据库放置在/ var / lib / snebu / catalog中。保管库目录是备份文件的存储位置,目录目录包含备份目录数据库(SQLite格式)。

您可以在/ var / lib / snebu上挂载外部存储设备(确保挂载后snebu用户/组拥有该目录-如果没有,则在安装驱动器后用chown snebu:snebu / var / lib / snebu /)。但是,如果存储设备的查找时间很慢,则许多2.5&#;情况就是如此。 USB驱动的机械硬盘驱动器,然后将机械驱动器安装在/ var / lib / snebu / vault下,并在/ var / lib / snebu / catalog(或在/etc/snebu.conf。或者,如果将目录目录保留在本地系统驱动器上,则请确保在备份会话结束后,将目录目录的内容分别复制到外部存储设备上。

您将需要为访问snebu二进制文件的任何用户ID设置用户权限。要为root用户设置权限,请运行以下命令:

如果非root用户需要运行snebu,则需要将其添加到snebu组。

这里需要sudo,以允许snebu-client读取主机上的所有文件。如果用户仅备份自己的目录,则不需要sudo,并且可以向他们授予snebu命令的更细化的权限-请参见手册页snebu-permissions(1)。

这将备份所有已挂载的基于磁盘的文件系统(自动跳过tmpfs,procfs,sysfs和其他&nodev挂载点)。备份名称默认为客户端的主机名,但是可以使用--name参数覆盖。您还可以在命令后加上文件或路径列表。例如:

第一个命令提供了已备份的所有主机的列表。与" -v"标记,它还将提供属于每个备份主机的所有备份集。备份集由序列号标识,序列号是创建备份的时间/日期,以Unix time_t格式表示(即,自1970年1月1日以来的秒数)。

第二个命令将列出属于主机和备份集的文件,将输出限制为给定的文件规范。

在第三个命令中,将启动此备份集的还原。客户端更改为" / tmp"目录,因此还原的所有内容都是相对于此目录的(或指定-C /以还原到原始位置)。指定--graft参数以重写文件路径的一部分-在这种情况下,它将替换目录" / home / bigboss /"。与“ bigboss恢复的”"。将其放在一起的最终还原路径文件位于/tmp/bigobss-restored/BudgetProposal2021.doc中。

请注意,上面的备份是"每日"备份-这是分配给该备份集的保留计划。默认情况下,周日至Friaday运行的备份是每日备份,周六是每周备份,每月第一天是每月备份。

如果snebu安装在名为bkupsvr1的远程备份服务器中,并且本地主机上具有snebu-client脚本,则可以在上述命令中添加参数--backup-server bkupsvr1和--backup-user svc-bosshost1。确保在远程主机上创建服务用户帐户svc-bosshost1(或组织实践指定的任何用户帐户名),并将该帐户添加到snebu组。为无人参与的备份设置基于ssh密钥的身份验证,然后在远程备份服务器上为此服务用户创建适当的权限:

请注意,您可能希望授予更多的细化权限,例如" backup&#34 ;、" listbackups"和"还原"在上面的snebu权限命令中。如果要破坏客户端,这将防止客户端删除备份服务器上的备份。有关详细的命令用法,请参见snebu-permissions手册页。

如果您需要更多保护,则可以撤消该过程,并使用远程备份服务器" pull"来自客户端的备份:

这将以服务用户svs-backup的身份访问bosshost1,然后以sudo的身份进入root来拉取数据。确保在snebu @ bkupsvr1和svs-backup @ bosshost1之间设置ssh密钥认证。如果取消--sudo标志,那么将通过ssh直接访问用户root(要求root @ bosshost1拥有ssh密钥授权)

$ sudo snebu到期-a 14 -r每天$ sudo snebu exipre -a 42 -r每周$ sudo snebu到期-a 365 -r每月$ sudo snebu清除

这会使所有超过2周的每日备份,超过6周的每周备份以及超过一年的每月备份失效。备份期满只会删除元数据,并且需要很短的时间。清除会从Vault中永久删除数据,并且可能需要更长的时间(取决于需要删除的文件数量)。

在以上示例中,命令在用户ID snebu下运行,该用户ID拥有存储库并具有所有权限。同样,您可以授予特定的用户权限以运行expire和purge命令,以限制访问主用户帐户的需要(请参阅snebu-permissions(1)文档)。

Snebu支持客户端公共密钥加密。这要求在客户端上安装程序tarcrypt。在客户机上,运行命令tarcrypt genkey -f outputfile,并确保它具有适当的权限和所有权。

系统将提示您输入密码以保护存储在.key文件中的私钥。然后,在任何备份命令变体中,添加参数--encryption-key /etc/snebu-backup.key:

请注意,您可以重复--encryption-key参数以使用多个密钥进行加密-在这种情况下,还原时,可以使用任何一个密钥的密码短语来解码备份。

还原加密备份时,请根据需要指定snebu-client restore --decrypt以及其他参数。未指定密钥文件,因为所有密钥数据都与备份安全地存储在一起。还原时,系统会提示您输入其中一个密钥的私钥密码。

Snebu备份系统由一个后端进程snebu组成,该进程在/etc/snebu.conf文件中指定的目录中的SQLite数据库snebu-catalog.db中维护一个备份目录。该数据库有许多表,其中包含备份的每个主机的条目以及备份集,所有文件元数据和备份集详细信息,这些信息将给定备份集快照的内容与文件详细信息表中的文件相关联。压缩单个文件内容并计算文件哈希。文件存储在文件名中,该文件名反映了Vault目录中的文件哈希(同样在配置文件中指定)。存储以文件内容的哈希命名的文件将直接导致目录和主机之间的文件级重复数据删除。

启动备份时,将要备份的系统文件清单发送到snebu,此清单由文件名和所有相关元数据(所有权,权限,大小,修改时间等)组成。这表示备份文件集的完整快照。将处理此清单,以确定备份服务器上已存在哪些文件。新文件和修改文件的名称(由任何元数据字段中的更改确定)将返回给客户端,然后将其传递给tar命令以处理和创建备份。

然后,snebu后端进程会吸收tar的输出,该过程提取文件名和元数据,然后将每个文件的内容压缩为Vault位置中的临时登台文件。计算完文件的sha1哈希后,该文件将重命名为此哈希并放置在Vault中的目标位置。

snebu客户端程序充当snebu的前端。从技术上讲是没有必要的,但是您需要手动生成清单(使用find和-printf说明符的特定列表-查阅手册页snebu-newbackup(1)了解详细信息),并将其发送到snebu --newbackup ,捕获返回清单以用于生成tar文件,最后将其发送到snebu --submitfiles中。

请注意,某些子命令在snebu和snebu-client之间共享相同的名称。在某些情况下,例如列表备份,snebu-client提供了更多的前端处理。在其他情况下(例如还原),操作是不同的。 snebu restore在标准输出上合成tar文件,而snebu-client restore执行snebu restore并调用本地tar命令以提取文件。

由于snebu使用tar作为备份数据的序列化格式,因此创建了tarcrypt命令以充当tar管道中的过滤器,以添加加密功能。 tarcrypt使用的密钥包含一个RSA公共密钥,该密钥用于加密每个文件的随机会话密钥。它还包含用于签名的HMAC秘密密钥。备份中的每个文件都带有确定性哈希。 HMAC密钥是结合使用RSA公钥和用于保护RSA私钥的密码来计算的。这样,它不仅可以在还原操作期间可靠地重新生成(因为用户需要输入相同的密码来解密备份),而且还可以直接与RSA密钥和密码组合结合在一起。由于HMAC密钥被认为是敏感的,因此应使用适当的受限所有权和权限来存储.key文件,以防止攻击者伪造备份文件的内容(尽管受到破坏的HMAC密钥仍不允许攻击者解密备份)。

由于备用服务器无法得知原始文件的哈希值,并且由于加密时使用了随机会话密钥,因此这意味着接收到的文件中的密钥不能用于重复数据删除目的。但是,由于HMAC签名是确定性的,因此此签名用于重复数据删除目的,可在共享同一密钥文件的所有主机之间进行重复数据删除。 (在加密过程中使用多个密钥时,将使用所有HMAC密钥的哈希来命名文件)。

如果生成了新密钥,则后续备份将包括用旧密钥和新密钥加密的文件(由于备份基于快照,因此只有新的/修改的文件被发送到备份服务器并用新密钥加密)。 tarcrypt命令可以很好地处理此问题-全局头包含与还原集中的文件相关的所有已使用的加密密钥,因此将提示操作员输入每个密钥的密码。作为一种易于使用的操作,如果在多个按键上使用相同的密码,则只需输入一次即可。它将自动针对所有按键进行测试。

您还可以通过指定--force-full参数(snebu-)来强制执行完全备份,如果您不想处理多个密钥,则可以将客户端上的所有文件重新发送到备份服务器。客户端备份-强制完整...)。

如果snebu二进制文件的suid位置1,则安装它的用户(默认情况下为snebu用户)将拥有备份目录数据库和数据保险库。通过使用snebuPermissions子命令,可以授予系统上的其他用户访问特定功能的权限,这些功能仅限于指定的主机。例如,您可以授予用户访问其主机的权限,但不能还原。或者,您可以限制其过期备份的能力ability —授予主机仅使其自己的备份过期的权限,或将过期选项限制为单独的锁定帐户。如果主机受到威胁,这对于防止攻击者删除所有备份非常有用。

snebu-client是snebu的客户端前端。使用它可以轻松地将本地或远程主机备份到本地存储设备或远程备份服务器。与以下子命令之一一起使用。

列出备份的主机,主机内的备份集或备份集内的文件。 snebu-client备份[-n备份名称] [-d日期戳] [-r日程表] [文件列表] 启动系统备份。默认情况下,它将备份本地主机到本地snebu安装。您还可以使用此命令备份到远程备份服务器,将远程主机备份到本地snebu安装或备份。 将远程主机连接到另一台远程备份服务器,具体取决于选择的选项。 此备份集的日期戳。 格式为intime_t格式,与" date +%s"的输出相同。 命令。 打开加密,并指定加密密钥位置。 可以多次指定以使用多个密钥加密。 程序" tarcrypt" 该选项需要出现在客户端上。 密钥是使用以下命令生成的: 远程主机的主机名/ IP地址。 用于将远程主机备份到本地备份服务器。

远程远程客户端的初始登录用户ID。此ID使用sudo一次登录即可切换到远程用户。

指定可选的插件脚本。通常用于为安装了DB的系统执行特定于数据库的操作(例如启用热备份模式)。

如果未指定任何参数,则" listbackups"将返回备份目录中包含的所有系统的列表。否则,当指定-n参数时,将返回该主机的备份集列表。

此备份集的日期戳。格式为time_t格式,与" date +%s"的输出相同。命令。

比较给定的备份会话的内容,该会话由" -n"标识。和-d"参数,取决于客户端上的内容。使用" listbackups"子命令以获取可用备份会话的列表。

此备份集的日期戳。格式为intime_t格式,与" date +%s"的输出相同。命令。

打开解密。需要" tarcrypt"来吸引客户在还原过程中将提示密码。

远程主机的主机名/ IP地址。 用于将远程主机备份到本地备份服务器。 远程远程客户端的初始登录用户ID。此ID使用sudo登录后即可切换到远程用户。 恢复由" -n"标识的给定备份会话 和" d参数。 使用" listbackups" 子命令以获取可用备份会话的列表。 此备份集的日期戳。 格式为intime_t格式,与" date +%s"的输出相同。 命令。 打开解密。 需要" tarcrypt" 来吸引客户 在还原过程中将提示密码。 远程主机的主机名/ IP地址。 用于将远程主机备份到本地备份服务器。 远程远程客户端的初始登录用户ID。此ID使用sudo登录后即可切换到远程用户。

sneub-client.conf用于为snebu-client指定许多默认参数,例如默认的include / exclude规范。内容由snebu-client读取并作为shell脚本命令执行,因此,除了指定参数外,还可以包括标准的shell脚本逻辑。这也意味着指定的参数名称和值之间不能有空格。

指定要包括在备份中的目录。默认情况下,包括所有已安装的基于存储的文件系统,即类型为" NODEV"的文件系统。 (其中包括虚拟文件系统,例如/ proc,/ sys,以及任何以" tmpdir"挂载的文件系统)。

另请注意,文件系统边界不会自动越界。例如,如果" / home"是与" /"分开的安装点那么您将需要同时指定" /"和" / home"。明确指定了挂载点,以防止无意中包含虚拟文件系统(即" / proc")。

与EXCLUDE类似,但是可用于与给定模式匹配的文件(处理外壳通配符扩展)。请注意,需要用引号引起来以防止通配符扩展仅匹配当前目录中的文件。

如果从备份服务器运行备份,则默认情况下该参数将应用于所有客户端。要将特定客户机的参数作为目标,可以将它们包装在shell脚本条件语句中(if-then-else或case语句)。

在备份多个客户端的服务器上-排除所有数据库" .dbf"仅在数据库服务器" erp-database"上的文件包括以下内容:

在执行snebu-client备份操作时指定--plugin参数将导致将指定的插件脚本合并到备份过程中。插件脚本定义了至少两个Shell脚本函数--fBpluginpre(),它们在备份之前执行,而pluginpost()\ R,在备份完成之后执行。

这允许执行操作,例如在备份之前安装文件系统快照,然后再删除快照,或者在备份开始时将数据库置于热备份模式。在备份数据库的情况下,通常,备份需要分多个阶段完成–将数据库置于热备份模式下,收集数据库文件列表,进行备份,使数据库退出热备份模式,收集包含在备份过程中创建的事务日志的文件列表,最后备份这些文件。

为了简化这些备份步骤,pluginpre函数可以保存文件内容的包含/排除变量INCLUDE,EXCLUDE和EXCLUDEMATCH。然后设置变量bkrepeat = 1,并设置插件脚本中使用的所有其他内部管理变量。一旦完成了最后一个阶段,它就可以还原包含/排除变量,让其余的备份过程继续进行,然后将bkrepeat = 0设置为完成备份。

设置bkrepeat = 1以修改包含/排除列表来重复备份。每次重复备份,都会用新文件集修改备份集。

以下是备份包含数据库的服务器时可以使用的模板。在这种情况下,包含/排除列表最初包含用于备份整个服务器的文件。因此,该脚本首先对数据库进行热备份,然后将最初备份的dbf文件添加到排除列表,然后再备份系统的其余部分。

由于这些函数会在不同时间从snebu-client脚本调用,因此各种代码片段的顺序可能会有些混乱。注意"(步骤x)"每个片段中实际执行顺序的标签。

###数据库的Snebu备份插件模板#初始化内部管家变量#(步骤0)dbstage = 0#定义预备份脚本pluginpre(){#阶段0 =>如果[" $ {dbstage}" = 0],然后#(步骤1)#保存当前的include / exclude li

......