在这些场景中,我将私钥保持为未加密状态(除非可能位于已加密的磁盘上),读取权限仅限于 root 并且 cronjob 以 root 身份运行,但尽我所能将此密钥的用处限制为非常具体的任务(相对于允许它以完全访问权限登录远程计算机)。
这可以通过配置~/.ssh/authorized_keys为在使用特定密钥登录时自动运行特定命令来相当简单地完成。
command="/usr/bin/remote_commands_to_run.sh",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty
ssh-rsa AAAAB3Nz...DfE= root@some_client
有关更多信息,请参阅此答案。您应该小心,其中的命令/usr/bin/remote_commands_to_run.sh不允许攻击者逃到 shell。在远程机器上创建一个受限帐户也可能是有意义的,比如/bin/false运行远程命令的外壳(例如,将与该受限用户的私钥相关联的公钥放入该受限用户的authorized_keys)。
与往常一样,在设置之后,尝试并测试以确保密钥没有比您预期的更多的权限(例如,sftp 不起作用,rsync 不起作用等)。
在进一步通知中,我看到您的特定任务是 rsync 数据(大概在特定目录中)。这对于有限的帐户可能是可行的(例如,chroot 只能查看那些无法访问 shell 的特定目录)。我相信像 rssh 这样的工具可以用来做到这一点;咨询超级用户或服务器故障以获得最佳建议。
当然,我在这种情况下所做的是将特定目录挂载为网络驱动器(例如,通过 NFS / sshfs),然后在 cron 脚本中对挂载的目录执行 rsync。