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

Rov*_*ion 7 linux ssh sudo zfs

我要复制文件系统storage/photossourcedestination不启用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'
Run Code Online (Sandbox Code Playgroud)

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

也许不想在服务器上启用 root 登录是愚蠢的。但是,对于蛮力攻击者来说,还有一件事可以猜测哪个好。

小智 8

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

以 root 身份,在服务器上执行以下操作: zfs 允许 your_username 接收、创建、挂载存储/照片

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

  • [`zfs allow` 支持刚刚添加到 zfsonlinux](https://github.com/zfsonlinux/zfs/commit/f74b821a6696fef9e9953aae05941e99bf83800e)(仍然存在一些限制,请参阅提交消息) (4认同)
  • 在 Ubuntu Xenial 上,运行 `sudo zfs allow myuser receive,create,mount tank/test2` 后,我仍然无法执行 `sudo zfs send -i snap1 tank/test@snap2 | zfs recv tank/test2` 由于“权限被拒绝,ZFS 实用程序必须以 root 身份运行。”错误。看来 [ZoL 仍然不支持 `zfs allow`](https://github.com/zfsonlinux/zfs/issues/434)。 (2认同)

Jim*_* L. 8

@analog900 走在正确的轨道上。

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

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

  • 计算机上,创建一个非特权用户帐户foo并用于zfs allow授予该帐户创建和发送快照的能力:
    zfs allow foo mount,snapshot,send,hold storage/photos
Run Code Online (Sandbox Code Playgroud)
  • 目标计算机上,创建一个非特权帐户bar并赋予该帐户接收/创建/挂载文件系统的能力:
    zfs allow bar mount,create,receive storage/photos
Run Code Online (Sandbox Code Playgroud)
  • 在目标上,以 user 身份bar创建专门用于备份作业的 ssh 密钥。在源计算机上的.ssh用户目录中安装该密钥的公共部分。foo这为用户提供了bar@destination对该foo@source帐户的安全 ssh 登录访问权限。另外,编辑 ~bar/.ssh/config 文件,destination以便它自动使用正确的 SSH 密钥文件名(您之前创建的)和用户名:
    Host source
       Hostname FQDN.of.source.example.com
       User foo
       IdentityFile ~bar/.ssh/backup_key_id_rsa
Run Code Online (Sandbox Code Playgroud)
  • 现在从以下位置运行您的备份作业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
Run Code Online (Sandbox Code Playgroud)

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

  • 谢谢你,@mschwaig,你是对的。我检查了我的其中一个安装,并且存在该权限。我已编辑答案以包含您的评论。 (2认同)

Bow*_*sCR 5

这并没有完全删除 root 登录,但它确实保护了功能齐全的登录之外的东西。

通过将本地用户的公钥(通常~/.ssh/id_rsa.pub)复制~/.ssh/authorized_keys到远程用户的 authorized_keys 文件 ( ) 来建立 SSH 信任。这消除了密码提示,并提高了安全性,因为 SSH 密钥更难暴力破解。您可能还需要确保sshd_config拥有PermitRootLogin without-password-这限制root远程登录,只SSH密钥(即使是正确的密码会失败)。

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