我有这个命令来备份远程机器。问题是我需要 root 权限才能读取和复制所有文件。出于安全原因我没有启用 root 用户并使用sudo
Ubuntu 方式。我需要一些凉爽的管道或其他东西来做到这一点吗?
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
本质上无论如何都给予rsyncuser
root 权限。你问:
@MartinvonWittich 很容易获得完整的 root shell,因为
rsync
使用sudo
?请走[m]e[穿过]那个。
嗯,很简单。使用推荐的配置,rsyncuser
现在可以以 root 身份运行,rsync
甚至不需要输入密码。rsync
是一个非常强大的操作文件的工具,所以现在rsyncuser
有了一个非常强大的可以root权限操作文件的工具。我只花了几分钟就找到了利用这个问题的方法(在 Ubuntu 13.04 上测试,需要dash
,bash
但没有成功):
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 权限,例如进行备份。现在使用sudo
root 帐户来解决问题不仅毫无意义,而且还很危险:乍一看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
替换程序也应该可以工作。gksu
kdesudo
答案4
我今天遇到了这个问题并解决了它,无需修改配置文件或授予用户帐户root级别权限。我的特殊设置是A
计算机上的用户foo
必须将所有用户目录从用户拥有的目录中复制foo
到计算机。 (用户拥有 sudo 权限。)bar
backup
A
A
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
的凭据访问计算机。我的需求与上面的问题略有不同,但这使我能够快速获得我管理的特定计算机上所有用户目录的备份,而无需破坏系统配置。