在没有 root 用户的情况下通过 SSH rsync 远程计算机的所有文件?

在没有 root 用户的情况下通过 SSH rsync 远程计算机的所有文件?

我有这个命令来备份远程机器。问题是我需要 root 权限才能读取和复制所有文件。出于安全原因我没有启用 root 用户并使用sudoUbuntu 方式。我需要一些凉爽的管道或其他东西来做到这一点吗?

rsync -chavzP --stats [email protected]:/ /media/backupdisk/myserverbackup/

答案1

我建议您首先使用 root 帐户。如果你这样设置:

  • sshd_config将目标计算机上的配置配置为PermitRootLogin without-password.
  • 在提取备份的计算机上使用ssh-keygen以创建 SSH 私钥(仅当您还没有 SSH 密钥时)。不要设置密码。如果你需要这方面的详细信息,谷歌一下教程,应该有很多。
  • /root/.ssh/id_rsa.pub将备份计算机的内容附加到/root/.ssh/authorized_keys目标计算机的内容。
  • 现在,您的备份计算机可以对目标计算机进行 root 访问,而无需使用密码身份验证。

那么最终的设置应该是非常安全的。


sudo,特别是与NOPASSWD评论中建议的结合使用,与仅使用 root 帐户相比没有任何安全优势。例如这个建议:

将以下内容添加到您的/etc/sudoers文件中:rsyncuser ALL= NOPASSWD:/usr/bin/rsync

本质上无论如何都给予rsyncuserroot 权限。你问:

@MartinvonWittich 很容易获得完整的 root shell,因为rsync使用sudo?请走[m]e[穿过]那个。

嗯,很简单。使用推荐的配置,rsyncuser现在可以以 root 身份运行,rsync甚至不需要输入密码。rsync是一个非常强大的操作文件的工具,所以现在rsyncuser有了一个非常强大的可以root权限操作文件的工具。我只花了几分钟就找到了利用这个问题的方法(在 Ubuntu 13.04 上测试,需要dashbash但没有成功):

martin@martin ~ % sudo rsync --perms --chmod u+s /bin/dash /bin/rootdash
martin@martin ~ % rootdash
# whoami
root
# touch /etc/evil
# tail -n1 /etc/shadow
dnsmasq:*:15942:0:99999:7:::

正如你所看到的,我为自己创建了一个 root shell;whoami将我的帐户标识为 root,我可以在 中创建文件/etc,并且可以从中读取/etc/shadow。我的漏洞是设置设定值二进制位dash;它会导致 Linux 始终以所有者(在本例中为 root)的权限运行该二进制文件。

出于充分的理由,不[推荐]拥有真正的根。 – redanimalwar 15 小时前

不,在绝对适合使用 root 帐户的情况下笨拙地解决它是没有充分理由的。这只是另一种形式货物崇拜编程- 你并不真正理解 sudo 与 root 背后的概念,你只是盲目地应用“root 是坏的,sudo 是好的”的信念,因为你已经在某处读到过。

一方面,在某些情况下,它sudo绝对是适合这项工作的工具。例如,当您在图形 Linux 桌面(假设是 Ubuntu)上进行交互工作时,sudo在偶尔需要 root 访问权限的极少数情况下,使用它就可以了。 Ubuntu故意禁用了root帐户并强制默认使用,sudo以防止用户总是使用root帐户登录。当用户只想使用例如网络浏览器时,以root身份登录将是一件危险的事情,因此默认情况下没有 root 帐户可以防止愚蠢的人这样做。

另一方面,在某些情况下,例如您的情况,自动化脚本需要某些东西的 root 权限,例如进行备份。现在使用sudoroot 帐户来解决问题不仅毫无意义,而且还很危险:乍一看rsyncuser就像一个普通的非特权帐户。但正如我已经解释过的,如果攻击者已经获得了访问权限,那么他将很容易获得完全的 root 访问权限rsyncuser。所以本质上,你现在有了一个额外的根帐户,它看起来根本不像根帐户,这不是一件好事。

答案2

利用该--rsync-path选项使远程rsync命令以sudo特权运行。你的命令应该是例如:

rsync -chavzP --rsync-path="sudo rsync" --stats [email protected]:/ .

如果sudo提示您输入密码,您必须通过使用NOPASSWD远程用户帐户的权限来避免这种情况(对于 root 来说毫无意义,在其他用例中可能有意义),或者如果您不想这样做:

  • 通过运行eg并输入以下内容,确保tty_tickets您正在使用的用户禁用该选项:sudo visudo -f /etc/sudoers.d/local-rsync

    Defaults:your.username.for.rsync !tty_tickets
    
  • 确保requiretty您正在使用的用户禁用该选项 - 默认情况下它可能是关闭的。方法与上面相同。

  • sudo通过运行例如在远程计算机上 播种密码ssh -t [email protected] sudo

答案3

一种简单的方法是使用ssh-askpass带有 的图形程序sudo,这可以绕过未连接到终端的事实sudo,并允许您安全地输入密码:

rsync -chavzPe 'ssh -X' --stats \
  --rsync-path='SUDO_ASKPASS=/usr/lib/ssh/x11-ssh-askpass sudo -A rsync' \
  [email protected]:/ .

当然,该ssh-askpass程序必须安装在给定位置,并且您必须在您正在使用的计算机上运行 X 会话。该程序有一些变体ssh-askpass也应该可以工作(Gnome/KDE 版本)。另外,像或 之类的图形sudo替换程序也应该可以工作。gksukdesudo

答案4

我今天遇到了这个问题并解决了它,无需修改配置文件或授予用户帐户root级别权限。我的特殊设置是A计算机上的用户foo必须将所有用户目录从用户拥有的目录中复制foo到计算机。 (用户拥有 sudo 权限。)barbackupAAfoo

我使用的命令如下。它是由目录A中的用户调用的。/homefoo

sudo rsync -avu -e "ssh -i /home/A/.ssh/id_rsa -l A"  * B:/home/backup

这将 rsync 作为 sudo 运行,以便foo可以访问所有用户目录,但它告诉 rsync 使用 ssh 使用bar用户A的凭据访问计算机。我的需求与上面的问题略有不同,但这使我能够快速获得我管理的特定计算机上所有用户目录的备份,而无需破坏系统配置。

相关内容