安全地创build备份

所以我有以下设置:

  • 服务器A(networking服务器)
  • 服务器B(Xen Dom0 – 带有逻辑卷)
  • 服务器C(备份服务器)

我想自动安全地从服务器B创build备份到服务器C 我可以在服务器B上创build一个PHP文件,在访问时会创build一个备份。 但是,它将需要在服务器上运行PHP。

现在我也可以使用PHP中的ssh2_connect ,我只能在服务器B上运行PHP并执行命令,但这些命令需要root权限。 因此,任何黑客攻击Web服务器或其他方式的人都可以立即访问这些文件。

我有一个在我的networking服务器上的“命令”做的数据库。 像备份虚拟机服务器1,然后恢复虚拟机服务器8等。这就是为什么我需要发送“命令”从服务器A到服务器B 我的问题是,安全地做这个最好的解决scheme是什么? 我显然不想让任何人访问服务器B除了我。

服务器A远程地在服务器B上运行命令,而不是让服务器B只要求服务器A运行哪些命令?

安排一个cron工作,沿着这些线:

 10 01 * * * /usr/local/bin/do_backups 

哪里do_backups看起来像这样:

 #!/usr/bin/env php <?php $conn = pg_connect('host=servera dbname=backup'); pg_prepare($conn, 'get_commands', 'SELECT command FROM backup_commands'); $result = pg_execute($conn, 'get_commands', array()); $commands = pg_fetch_result($result); foreach($commands as $cmd) { system(escapeshellcmd($cmd)); } ?> 

显然,这是一种伪代码,因为我不知道你的数据库是什么样的,所以如果不清楚它在做什么,请告诉我。 只要记住可能不受信任的参数就可以逃脱你的命令。 另外,我用PHP写了一段时间,所以在我的代码中可能会有错误;)

你想要做的是在服务器B上创build一个定期做备份的cron作业。 如果你已经在服务器上安装了php_cli ,如果你知道这一点,这甚至可以是一个PHP脚本。

创build你喜欢的任何forms的备份脚本,然后以root身份,用crontab -e将它添加到crontab -e 。 例:

 0 1 * * * /root/mybackupscript.sh 

会在每天晚上01:00在root的home文件夹中运行脚本mybackupscript.sh

有关更多信息,请参阅man cronman crontab


在你编辑之后,还有其他一些build议:

  • 让您的备份脚本轮询Web服务器以获取作业信息。 它仍然可以作为根运行。 Web服务器上的简单脚本可以为此轮询生成作业命令。
  • 使用SSH连接到服务器B并以这种方式运行作业。 很难以安全的方式非交互式地运行。
  • 允许服务器B(可能是Web服务器的用户)上的用户无需密码就可以sudo您的备份脚本。 确保只有root可以修改这个脚本,并且不能被恶意参数愚弄。

WRT Devator的回答是,您可以使用纯PHP PHP实现phpseclib以交互方式执行SSH。 下面是一个关于sudo的phpseclib文档的例子,它通常提供一个密码的交互提示:

 <?php include('Net/SSH2.php'); $sftp = new Net_SSH2('www.domain.tld'); $sftp->login('username', 'password'); echo $sftp->read('username@username:~$'); $sftp->write("sudo ls -la\n"); $output = $sftp->read('#Password:|username@username:~\$#', NET_SSH2_READ_REGEX); echo $output; if (preg_match('#Password:#', $lines)) { $ssh->write("password\n"); echo $sftp->read('username@username:~$'); } ?> 

您还可以使用$ ssh-> setTimeout(xx)来适应即使使用正则expression式匹配也不会返回所需内容的命令。