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


68

我有此命令来备份远程计算机。问题是我需要root权限才能读取和复制所有文件。出于安全原因,我没有启用root用户,并使用sudoUbuntu方式。我需要一些凉爽的管道还是要做些什么?

rsync -chavzP --stats user@192.168.1.2:/ /media/backupdisk/myserverbackup/

3
只需使用root帐户摆在首位。sudo,尤其是NOPASSWD按注释中的建议结合使用时,并不能真正提高计算机的安全性。
Martin von Wittich

Answers:


88

我建议您首先使用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?请[通过]。

好吧,简单。使用推荐的配置,rsyncuser现在rsync甚至可以以root用户身份运行,甚至不需要输入密码。rsync是一个非常强大的文件处理工具,因此现在rsyncuser有了一个非常强大的具有根权限的文件处理工具。寻找一种方法来利用这个把我仅有几分钟的路程(在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:::

如您所见,我为自己创建了根外壳程序;whoami将我的帐户标识为root,可以在中创建文件/etc,也可以从中读取文件/etc/shadow。我的漏洞利用是在二进制文件上设置setuiddash。它会导致Linux始终在所有者(本例中为root)的许可下运行该二进制文件。

有正当理由不建议拥有真实的根源。– redanimalwar 15小时前

不可以,在出于绝对原因使用它绝对合适的情况下,笨拙地解决根帐户问题。这只是货物崇拜编程的另一种形式-您并没有真正理解sudo vs root的概念,只是盲目地应用了“ root不好,sudo很好”的信念,因为您已经在某个地方读过了。

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

另一方面,在像您这样的情况下,自动化脚本需要对某些内容具有root权限,例如进行备份。现在,sudo用于解决root帐户不仅毫无意义,而且也很危险:乍一看,它rsyncuser看起来像是普通的非特权帐户。但是,正如我已经解释的那样,如果攻击者已经获得rsyncuser访问权限,那么获得完全的root访问权限将非常容易。因此,从本质上讲,您现在有了一个根本不像根帐户的其他根帐户,这不是一件好事。


2
很好的解释。在根上使用sudo的另一个原因是否是在多个人在服务器上具有sysadmin角色的情况下?这样每个人都可以使用自己的SSH密钥而不是共享root的SSH密钥吗?
内森·沃森

2
@ NathanS.Watson-Haigh,您可以轻松地将所有SSH密钥放入/root/.ssh/authorized_keys,甚至可以使用不同的房屋创建多个root帐户,以便每个用户可以拥有自己的shell,房屋和.ssh/authorized_keys:)
Martin von Wittich 2014年

2
您也可以将ssh键限制为仅允许某些命令。绝对是个好主意,因为如果要自动执行某项操作,则可能会在没有任何密码的情况下制作这些ssh密钥,或者至少使它们在机器运行时始终可以访问。(这意味着该计算机上的root授予对其他计算机上root的访问权限。)
Peter Cordes

2
Martin关于使用sudo root的担忧是有效的,但似乎可以通过在sudoers文件中指定确切的rsync参数来缓解它们。根据Ubuntu上sudoers(5)的手册页:“如果Cmnd具有关联的命令行参数,则Cmnd中的参数必须与用户在命令行上给定的参数完全匹配(如果有,则与通配符匹配) 。” 如果sudoers文件使用确切的选项(包括源和目标)指定了确切的rsync命令,那么看起来应该是安全的。

4
一个考虑不提出了早期:sshd一般不会没有登录该决议授权密钥用于连接到一个帐户,所以如果你的连接bob,然后sudo,你会得到,如果你连接到比一个更好的审计线索root直接bob的关键。
编码员

71

利用该--rsync-path选项使远程rsync命令具有sudo特权运行。您的命令应为:

rsync -chavzP --rsync-path="sudo rsync" --stats user@192.168.1.2:/ .

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

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

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

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


1
@scai被要求输入密码是最有可能的sudo密码,而不是ssh密码
umläute

2
@redanimalwar允许您的用户sudo /usr/bin/rsync无需输入密码;检查man sudoers如何执行此操作;您可能要为此创建一个额外的备份用户。
umläute

5
要允许 sudo /usr/bin/rsync运行而无需输入密码,请在/etc/sudoers文件中添加以下内容:rsyncuser ALL= NOPASSWD:/usr/bin/rsync这将使用户rsyncuser(如上所述,最好创建专用的备份用户)具有所需的用户名。
M_dk

4
@M_dk现在rsync基本上始终具有root权限;在该帐户中获得完整的root shell可能很容易。我认为最好只使用真实的root帐户。
Martin von Wittich 2013年

1
毫无echo "password" | something疑问,我的答案实际上从未使用过,并且同意让sudo无休止地执行rsync(此处也未建议)带来的安全问题是不好的。该怎么tty_tickets做其实我也没办法,似乎需要和安全问题。只需在ssh上运行sodo然后执行命令,就可以安全地工作而无需进行任何调整?但是,由于我出于划写目的提出了该问题,因此我完全同意,没有密码的基于密钥的ssh是安全的,这样做是正确的。我接受了马丁斯的回答。
redanimalwar 2015年

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:/ .

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


rsync --rsh='ssh -X' --rsync-path='gksudo -- rsync' user@host:/ .不起作用。 rsync error: syntax or usage error (code 1) at main.c(1634) [server=3.1.1]。哦,ubuntu确实提供了gnome-ssh-askpass,但是它是/usr/bin/ssh-askpass,而不是/usr/lib/ssh/x11...。这样
行得通

1
这是更好的解决方案之一,因为它不需要在另一端进行任何重新配置​​-仅需要安装askpass和启用X转发,这两者应该相当普遍。
David Gardner

1
安装后就像护身符ssh-askpass。我只需要查找的含义-chavzPe,将它们作为长选项拼出是很好的。
krlmlr

我尝试了此操作,但是提示在远程计算机上打开,并且没有转发到本地计算机。X11Forwarding正在正常工作,我通过xeyes使用SSH 运行进行了验证。
Joyce Babu

7

如果您的用户已经有使用密码保护的sudo特权,我将其保留为原样,仅添加一个节以使用rsync而不使用密码:

%admin ALL=(ALL) ALL
%admin ALL= NOPASSWD:/usr/bin/rsync 

5

我今天遇到了这个问题,并且无需修改配置文件或向用户帐户授予根级别权限即可解决该问题。我特别的建立是用户A机器上foo有所有用户目录中复制foo到机器barbackup用户目录A拥有。(用户A具有的sudo特权foo。)

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

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

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


2
太好了 我忘了-i选项ssh。您可以--rsync-path="sudo /usr/bin/rsync" 在计算机上使用sudo 来使用bar。然后,将其读为root@foo和写为root@bar,但通过A@foo->进行传输B@bar。谢谢!
ctbrown

它不会保留所有者(例如root),对吗?
Andris

3

在目标计算机上将rsync作为守护程序运行,可以执行所需的操作。


1
我对这个答案表示赞同,但是最好是对如何使rsynch守护程序运行以及如何通过根访问使用它进行一些解释。
Mike Lippert 2015年

rsync作为守护程序与这种情况不匹配,因为rsync即使在以root身份启动时也会丢弃root权限,因此并非所有文件都可以传输。
teissler '16

2

我的解决方案是使用,--rsync-path="sudo rsync"但要求输入密码,解决方法:

rsync -chavzP --stats --rsync-path="echo <SUDOPASS> | sudo -Sv && sudo rsync"  user@192.168.1.2:/ .

1
通常,将密码放在命令行中不是一个好主意。例如,它们在过程树中变得可见。我有时会用这种类型的语句替换实际的密码,这种$( cat my_password.txt )方式稍好一些,但是通常首选在任一端配置权限和/或使用SSH密钥,这样在CLI上不需要密码
JDS
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.