ZFS 在 Linux 上通过 ssh 发送/接收而不允许 root 登录

ZFS 在 Linux 上通过 ssh 发送/接收而不允许 root 登录

我希望将文件系统storage/photos从复制source到,destination但不启用 ssh 以 root 身份登录。我尝试了许多不同的组合,例如:

sudo zfs send -R storage/photos@frequent_2015-02-12_18:15 | ssh example.com sudo zfs recieve storage/photos
sudo zfs send -R storage/photos@frequent_2015-02-12_18:15 | ssh example.com su -c zfs recieve storage/photos
sudo zfs send -R storage/photos@frequent_2015-02-12_18:15 | ssh example.com 'sudo -S zfs recieve storage/photos <~/topsecret'

我无法使用 sudo -S 传递密码,因为 zfs 流已经连接到标准输入。上面的两个示例需要交互式终端而不是 stdin。

也许不想在服务器上启用 root 登录是愚蠢的。但这给暴力攻击者留下了更多可以猜测的东西,这很好。

答案1

这并不能完全删除 root 登录,但它确实可以保证超出全功能登录的安全。

通过将本地用户的公钥(通常为 )复制到远程用户的~/.ssh/id_rsa.pubauthorized_keys 文件 ( ) 来设置 SSH 信任。这样可以消除密码提示,并提高安全性,因为 SSH 密钥更难被暴力破解。您可能还想确保有- 这会将远程 root 登录限制为仅使用 SSH 密钥(即使正确的密码也会失败)。~/.ssh/authorized_keyssshd_configPermitRootLogin without-password

然后,您可以使用ForceCommandauthorized_keys 文件中的指令添加安全性,以仅允许执行 zfs 命令。

答案2

今天早些时候我遇到了同样的问题。我发现你可以使用“zfs allow”命令授权普通用户执行某些操作:

以 root 身份在服务器上执行以下操作:zfs allow your_username received,create,mount storage/photos

之后,您将能够使用 your_username 通过 ssh 进入服务器,并且您将拥有 zfs 权限来接收。请参见此处: http://docs.oracle.com/cd/E19253-01/819-5461/gfkco/index.html

答案3

@analog900 走在正确的轨道上。

提高安全性的关键之一(包括避免需要 root 登录)是使用 ZFS 的内置权限结构,以及以相反的方式构建备份传输,通过网络备份,而不是推送备份。无需 root 访问权限即可备份文件系统,这是 ZFS 文件系统的主要设计成就之一。

运行该作业destination并从中提取数据source,可能类似于:

  • 来源机器,创建一个非特权用户帐户foo并使用zfs allow赋予该帐户创建和发送快照的能力:
    zfs allow foo mount,snapshot,send,hold storage/photos
  • 目的地机器,创建一个非特权帐户bar并赋予该帐户接收/创建/挂载文件系统的能力:
    zfs allow bar mount,create,receive storage/photos
  • 在目标上,以用户身份bar创建专门用于备份作业的 ssh 密钥。将该密钥的公共部分安装在源计算机上.ssh的用户目录中。这为用户提供了对该帐户的安全 ssh 登录访问权限。此外,编辑 ~bar/.ssh/config 文件,以便它自动使用正确的 SSH 密钥文件名(您之前创建的)和用户名:foobar@destinationfoo@sourcedestination
    Host source
       Hostname FQDN.of.source.example.com
       User foo
       IdentityFile ~bar/.ssh/backup_key_id_rsa
  • 现在从以下位置运行您的备份作业bar@destination
    dt=$(date +%Y-%m-%d_%H-%M-%S)
    ssh source "zfs snap storage/photos@frequent_$dt"
    ssh source "zfs send -R storage/photos@frequent_$dt" | zfs receive storage/photos

这样做需要任何 root 访问权限。

答案4

2022 年大多数 FreeBSD 都使用 mbuffer。我不会听从那些说使用 ssh 登录到其他主机进行备份的人的建议,这是个坏主意。使用 mbuffer 而不是 wireguard。Permitrootlogin 始终为否,没有例外。如果您使用 ssh 进行备份,数据包将碎片化,导致速度低下 + 跨线加密的开销以及大量 CPU 周期的丢失。想象一下通过 VPN,然后再用 SSH 加密,这是没有意义的。而在本地 LAN 上,您绝对不关心跨线加密,您只想要速度,如果您有疑虑,您可以随时为此设置一个 VLAN。

无论您在机器上使用哪个端口,防火墙端口都应关闭,备份主机除外。人们使用 mbuffer 的原因是您可以指定块大小以匹配池的记录大小,这样您的备份速度就会非常快。

在一天结束时,您的备份应该由连接到主机的简单 cronjob 行组成,不要使其过于复杂,如果必须的话,编写一个 shell 脚本并将其保持为 1 行。

如果您更高级,只需编写自己的套接字守护进程以使用 Linux 上的 epoll 或 FreeBSD 上的 kqueue 接受请求,这样您就可以使用您选择的任何命令来管理所有机器。

在 FreeBSD 上创建每日快照和每月快照的 cronjob 的非常简单的示例:

0 3 * * * (zfs destroy data@`/bin/date +\%A`;zfs snapshot data@`/bin/date +\%A`)              > /dev/null 2>&1
0 3 1 * * (zfs destroy data@`/bin/date +\%B`;zfs snapshot data@`/bin/date +\%B`)              > /dev/null 2>&1

添加另一行以使用 mbuffer 复制每日快照中的数据,非常简单。或者,您可以使用第三方包为您完成所有操作,当出现故障或他们决定停止支持时,祝您调试他人的程序好运,保持简单。

这里是 mbuffer 的一些命令行: https://www.mceith.com/blog/?p=183

如果您是系统管理员,我甚至不会在 FreeBSD 以外的任何系统上运行 ZFS,除非您喜欢一直与内核版本作斗争以获得 Linux 上的支持。在前面使用 Linux KVM 主机并将 ZFS 或 PCIE 设备驱动器直通到 FreeBSD 非常简单,我不会允许主主机执行除虚拟化、路由、vpn 和防火墙之外的任何事情。将 Rocky Linux 放在上面,并将内核更改为 kernel-ml,就这样,为您的客户保持坚如磐石。如果您想运行 wireguard,至少需要 5.15.x 内核系列。

我在家里通过 10 千兆 LAN 运行 ZFS samba 到 google tv chromecast 上的 VLC 播放器,速度非常快,我使用 wireguard 在远程服务器上的 FreeBSD 上获得了非常稳定的性能,以备份异地主机。我喜欢备份就像一面镜子,但总是使用两台独立的机器,如果一台机器出现故障,你仍然有一台机器可以使用,直到另一台机器修好。(我已经数不清有多少机械驱动器出现故障,它们是系统管理员的噩梦)

几十年来,我从来没有遇到过这个问题,但第二次我开始将池导入 Linux 时,我损坏了它们,不得不从备份中恢复,这不值得你花时间。我可以在 FreeBSD 上随时更新修订版本,无需停机。在 Linux 上,你必须在 RHEL 修订版本之间重新格式化一半的时间,在 FreeBSD 上保证你的数据安全。

多年来,我见过人们做过一些最愚蠢的备份,将整个 KVM 客户机复制为备份,对于 Linux,您只需要 /etc、主目录和数据库目录。FreeBSD 也是如此,但 /usr/local/etc 也是如此。保持简单,想使用 SSD 对吗?

希望有一天,我们可以摆脱机械旋转的锈桶驱动器,让人们以 100 美元的价格拥有 20TB 的 SSD,贪婪的 SSD 制造商正在阻碍人们的发展。

相关内容