在ssh上设置cron rsync的密码

我正在写一个bash脚本,它将从cron中调用,每天从远程服务器上获取一个文件。 我正在使用SSH,所以我需要自动提供一个密码,因为这是无人值守的运行。 以下是我到目前为止所做的:

1:通过ssh-keygen创build一个DSA密钥对
2:将公钥复制到远程服务器
3:configurationssh-agent来处理密钥密码

我的问题是:这一切都有必要吗? 这是最简单/最好的方法吗? 这是一个非常简单的任务,所以我想尽可能简化configuration,同时保持合理的安全级别。

附加信息:
不运行rsync守护进程
双机是Ubuntu的Linux

没有使用sshsshd你所做的任何事情都是不安全的。

规范的方式是使用scp甚至更好, rsync和一个没有密码的ssh密钥。

或者,创build仅用于复制的密钥,并在远程端编辑authorized_keys文件,以仅包含需要运行的命令以及密钥,例如:

 # remote_server:/home/copyuser/.ssh/authorized_keys: command="[...]" ssh-rsa KEY_HERE user@host 

也有scponly可用。 如果你创build了一个用户,把他们的/etc/passwd/usr/bin/scponly ,他们将不被允许login,而是按照正常的权限拷入文件。

虽然我想你可以使用密码保护的私钥,通常不推荐用于通过cron运行的进程。 我build议您跳过密码,然后确保您使用的任何用户帐户仅在目标机器上拥有非常有限的权限。 通过跳过密码短语,你不需要处理与ssh-agent混乱。

这是我的build议:

  • 为此cron作业创build一组特定的SSH公钥/私钥。 使用:ssh-keygen -t rsa -N“-f id_cronjobname
  • 保护生成的id_cronjobname文件,使得只有cron作业才能读取它。 如果这个文件被盗用,那么具有该密钥文件的任何人都可能获得相同的权限。
  • 限制在远程端使用该密钥。 例如,在远程的authorized_keys中,你可能希望以下面的例子为前缀。
  • 还要考虑使用“from”来限制authorized_keys文件中的IP地址。 有关这些限制的更多信息,请参阅“man sshd”。

来自远程authorized_keys文件的示例行:

 no-pty,no-agent-forwarding,no-X11-forwarding,no-port-forwarding,command="rsync --server --sender -vlogDtprze.i --ignore-errors --numeric-ids --inplace . /path/on/destination/system" ssh-rsa SSH_KEY_STRING user@host" 

确切的命令放在那里你可以通过运行你打算使用的rsync命令,然后在远程系统上同时执行“ps awwlx | grep rsync”。

注意:我遇到的一个常见问题是,运行cron作业的用途没有远程主机的SSH密钥,所以它试图询问连接是否正常。 确保将远程系统的SSH主机密钥放置在/ etc / ssh / ssh_known_hosts中(可能只是在连接后将其复制到自己的〜/ .ssh / known_hosts文件中)。 或者,您可以执行“su – $ USER_CRONJOB_RUNS_AS”,然后手动调用该命令并确保其正常工作。 另外,这对于testing工作是很好的。

在步骤#1(生成密钥),当你被要求释义的时候,你应该立刻敲回车 – 你将会有一个无释义的密钥对,那么你可以跳过第3步(configurationssh-agent )。

安全方面,在这个设置中,如果你的ssh客户端受到攻击,那么ssh服务器(你从中拉出的地方)也将变得对攻击者开放(如果你没有以root身份login,那么它就是非root用户)。 这不是一个大问题,这是一个很常见的做事方式。 但是请尝试定期在您的Ubuntu系统上执行安全更新。

比这个设置简单的任何东西都将是相当低的安全性。

serverninja描述的选项可以提高安全性(客户端和服务器之间的隔离更好),但这些设置的configuration开销较大,难以debugging。

一旦你设置了无密码密钥对(将pub密钥复制到服务器上的〜/ .ssh / autorized_keys),rsync将没有任何额外的选项,就像ssh和scp一样。