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

red*_*war 77 ssh ubuntu backup rsync

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

rsync -chavzP --stats user@192.168.1.2:/ /media/backupdisk/myserverbackup/
Run Code Online (Sandbox Code Playgroud)

Mar*_*ich 101

我建议您首先使用 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

rsyncuser无论如何,本质上都是给予root 权限。你问:

@MartinvonWittich 很容易获得一个完整的 root shell,因为rsyncsudo? 请走 [m]e [通过]。

嗯,简单。使用推荐的配置,rsyncuser现在可以rsync以 root 身份运行,甚至不需要输入密码。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:::
Run Code Online (Sandbox Code Playgroud)

如您所见,我为自己创建了一个 root shell;whoami识别我的帐户根,我可以创建文件/etc,我可以读取/etc/shadow。我的利用是在二进制文件上设置setuiddash;它导致 Linux 始终以所有者的权限运行该二进制文件,在这种情况下是 root。

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

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

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

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

  • 之前没有提到的一个考虑因素:`sshd` 通常*不* 记录哪个授权密钥用于连接到一个帐户,因此如果您作为 `bob` 连接,然后使用 `sudo` 连接,您将获得比连接时更好的审计跟踪使用 `bob` 的键直接进入 `root`。 (5认同)
  • Martin 对使用 sudo root 的担忧是有效的,但似乎可以通过在 sudoers 文件中指定确切的 rsync 参数来缓解这些担忧。根据 Ubuntu 上的 sudoers(5) 手册页:“如果 Cmnd 具有关联的命令行参数,则 Cmnd 中的参数必须与用户在命令行上给出的参数完全匹配(或匹配通配符,如果有的话) .” 如果 sudoers 文件使用精确的选项(包括源和目标)指定了精确的 rsync 命令,那么它似乎应该是安全的。 (3认同)
  • 很好的解释。使用 sudo 而不是 root 的另一个原因是多人在服务器上拥有系统管理员角色的情况吗?这样每个人都可以使用自己的SSH密钥而不是共享root的SSH密钥? (2认同)
  • @NathanS.Watson-Haigh,您可以轻松地将所有 SSH 密钥放入 `/root/.ssh/authorized_keys`,甚至可以创建多个具有不同 home 的 root 帐户,这样每个用户都可以拥有自己的 shell、home 和 `.ssh/授权密钥` :) (2认同)
  • 您也可以将 ssh 密钥限制为仅允许某些命令。绝对是一个好主意,因为如果您正在自动化某些事情,您可能会在没有任何密码的情况下制作这些 ssh 密钥,或者至少在机器运行的所有时间都可以访问它们。(意味着该机器上的 root 授予对其他机器上的 root 的访问权限。) (2认同)
  • 我知道了。在要点中使用 `~` 使您看起来像是在指普通用户帐户的主目录而不是 `/root/`。应该更仔细地阅读答案,但是扩展`~` 以明确正在讨论的帐户不会有什么坏处。 (2认同)
  • @Witiko 固定 :) (2认同)

M_d*_*_dk 81

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

rsync -chavzP --rsync-path="sudo rsync" --stats user@192.168.1.2:/ .
Run Code Online (Sandbox Code Playgroud)

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

  • 请确保选择tty_tickets是您正在使用,运行如用户禁用了sudo visudo -f /etc/sudoers.d/local-rsync ,然后输入:

    Defaults:your.username.for.rsync !tty_tickets
    
    Run Code Online (Sandbox Code Playgroud)
  • 确保requiretty为您正在使用的用户禁用该选项- 默认情况下它可能处于关闭状态。方法和上面一样。

  • sudo通过运行例如在远程机器上播种密码 ssh -t user@192.168.1.2 sudo

  • 要允许 `sudo /usr/bin/rsync` 在不需要密码的情况下运行,将以下内容添加到你的 `/etc/sudoers` 文件中: `rsyncuser ALL= NOPASSWD:/usr/bin/rsync` 这将允许用户 rsyncuser (如上所述,最好使用您想要的用户名创建一个专用的备份用户)。 (5认同)
  • @M_dk 现在`rsync` 基本上总是具有root 权限;在该帐户中获得完整的 root shell 可能很容易。我认为最好首先使用真正的 root 帐户。 (4认同)
  • @scai 要求的密码很可能是 `sudo` 密码,而不是 `ssh` 密码 (2认同)
  • @redanimalwar 允许您的用户在不要求密码的情况下使用 `sudo /usr/bin/rsync`;检查`man sudoers`以了解如何执行此操作;您可能想为此创建一个额外的备份用户。 (2认同)

Gra*_*eme 17

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

rsync -chavzPe 'ssh -X' --stats \
  --rsync-path='SUDO_ASKPASS=/usr/lib/ssh/x11-ssh-askpass sudo -A rsync' \
  user@192.168.1.2:/ .
Run Code Online (Sandbox Code Playgroud)

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


小智 7

如果您的用户已经拥有受密码保护的 sudo 权限,我会将它们保持原样,并且只添加一个节来使用 rsync 而无需密码:

%admin ALL=(ALL) ALL
%admin ALL= NOPASSWD:/usr/bin/rsync 
Run Code Online (Sandbox Code Playgroud)


小智 5

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

我使用的命令如下。它由用户A在 上的/home目录中调用foo

sudo rsync -avu -e "ssh -i /home/A/.ssh/id_rsa -l A"  * B:/home/backup
Run Code Online (Sandbox Code Playgroud)

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

  • 这太棒了。我忘记了 `ssh` 的 `-i` 选项。如果你在机器 `bar` 上有 sudo,你可以使用 `--rsync-path="sudo /usr/bin/rsync" `。然后读取为`root@foo`,写入为`root@bar`,但通过`A@foo` -> `B@bar` 传输。谢谢! (2认同)