我创建了一个有点笨拙的解决方案,我真的不喜欢它,我想改进它。问题是这样的:
我有一个无头服务器,它维护一个存储在其中的数据库/root/.local/somedir
,我希望将该文件保存到远程服务器。我遇到的主要问题是它是根帐户。
我当前的解决方案:
在根目录下:
- 每个时间段*执行 cron 作业,对文件进行哈希处理并将其保存到日志中
- 相同的 cron 作业
rsync
将文件(如果哈希已更改)发送到同一台计算机上的用户帐户
在用户帐户下:
- 每隔一段时间执行 cron 作业并将
rsync
文件发送到远程计算机
* 测试时,时间段设置为每 2 分钟一次,稍后将更改为每天或 6 小时或其他时间段
根计划任务:
#!/bin/sh
dt=$(date '+%Y-%m-%d %H:%M');
d2=$(date '+%Y-%m-%d-%H-%M');
fn='/root/hash.log'
bk='/root/.local/share/file-to-backup'
b2="file-to-backup.$d2.bk"
hash_last=$(tail -1 hash.log | awk '{split($0,a," "); print a[3]}')
hash_now=$(md5sum $bk | awk '{split($0,a," "); print a[1]}')
if [ "$hash_now" != "$hash_last" ]; then
echo "$dt $hash_now" >> $fn
rsync -og --chown=user:user $bk /home/user/$b2
elif [ "$1" = "force" ]; then
rsync -og --chown=user:user $bk /home/user/$b2
fi
用户 cron:
(用户有 SSH 密钥设置)
#!/bin/bash
rsync --remove-source-files file-to* server:.
我所看到的问题是:
这可行,但对我来说似乎很笨拙。
理想情况下,我想在文件实际所在的根用户帐户下进行远程备份。
我认为问题是我有一个位于 root 帐户下的文件,我想与远程服务器进行无密码同步,我思考我不应该为根帐户创建私钥/公钥。
我不确定应该如何最好地处理此备份。
答案1
我认为我不应该为根帐户创建私钥/公钥。
问问自己,为什么这是在 root 帐户下?传统服务器上的几乎所有守护进程都以非 root 用户身份运行。如果您对创建一个客户为 root 用户提供证书(请注意,这与允许证书登录到盒子中完全不同,即使您确实将其保存在默认位置),您应该更加担心以 root 身份运行您的任何内容。
让我们跳过这个问题(尽管我确实敦促你考虑一下),然后直接讨论这个:确实没有理由不是生成客户端 ssh 证书并将文件直接 rsync 到备份服务器root
。您可以将 rsa 密钥保存为您喜欢的任何名称;您可以在运行 rsync 时指定它们。您不会授予额外的访问权限进入服务器(当然你已经同意了,因为它是无头的);相反,您将允许存储密钥在服务器(/root/.ssh 是一个最安全的地方)将此文件复制为非根服务器在备份机器上。
这可行,但对我来说似乎很笨拙。
是的,完全同意。rsync
可以判断文件是否需要同步,因此基本上您在那里所做的一切都使您能够选择将该文件复制到非根位置。请注意,您/root
一开始就提到它并没有令人信服的理由。通常该目录其他人无法读取,因此其子目录将无法访问,但如果此文件应该对于非 root 用户来说是可以接受的,为什么不将其存储在权限与预期用途相匹配的不同目录中 - 在最简单的情况下,允许组读取该文件并将备份用户放入该组中。或者,让 root 进行备份。或者,首先不要以 root 身份运行。您决定以 root 身份拥有此文件和目录路径,仅以 root 身份读取它,但不希望 root 进行备份,这使得这变得如此笨拙。