我试图将主目录的层次结构暴露给许多 FreeBSD 监狱。主目录的配置使得每个目录都是唯一的 ZFS 数据集。监狱用于开发工作,因此会定期创建和销毁。
我的第一个想法是简单地使用nullfs挂载/home到 jail,但nullfs不提供任何访问从属文件系统的方法。
我的第二个想法是通过 NFS 导出目录,然后在每个 jail 中运行自动挂载程序守护程序 (amd)。如果可以在监狱内执行 NFS 挂载,这将是有效的。但事实并非如此。
我的第三个想法是在主机上运行 amd 并将nullfs挂载到监狱中……但是 amd 对nullfs 的支持不存在。
我的第四个想法是回到使用 NFS 导出目录,因为 amd 当然可以与 NFS 一起使用,对吗?不幸的是,amd 不是在目标挂载点上挂载目录,而是喜欢在临时位置 ( /.amd_mnt/...)挂载东西,然后创建符号链接……当然,这在 jail 环境中是无用的。
那么也许您可以使用nullfs将 的子目录暴露/.amd_mnt给监狱?不!这让我们回到了我的第一次尝试,我们发现无法使用nullfs访问从属文件系统。
然后我的头爆炸了。
我正在尝试做的事情有没有好的解决方案?一个糟糕的解决方案是在启动 jail 之后运行一个脚本,该脚本将为每个主目录创建多个nullfs挂载点,但这非常笨拙——它需要定期运行以考虑新目录或删除的目录。所以基本上我将不得不编写一个糟糕的自动挂载程序。
一定会有更好的办法。帮助我,Serverfault,你是我唯一的希望!
更新 1:我突然想到我可以用 解决部分问题pam_mount,尽管这充其量是不完整的。此外,文档中不清楚是否pam_mount可以自动创建目标挂载点。如果它需要先验存在挂载点,那么这个解决方案不会比我已经提出的坏自动挂载器更好。
更新 2:如下面的答案中所讨论的,VFCF_JAILNFS 文件系统上的设置确实允许 jails 执行 NFS 挂载。不幸的是,自动挂载程序继续无用的行为,并且当在监狱中运行时,它似乎非常擅长以这样的方式陷入困境,以至于需要重新启动系统才能删除进程条目。
jail.local 文件是作为 jail.conf 的覆盖还是作为 jail.conf 的替代?
当我从教程中学习Fail2Ban时,他们中的大多数人通常会说要么将 jail.conf 复制到 jail.local 并在那里进行编辑,其中一些人说要创建一个新的 jail.local 文件并提供一堆要复制的设置和粘贴。但他们没有解决的是 jail.local 如何与 jail.conf 一起工作。这些是2个场景:
覆盖:如果jail.local 充当jail.conf 文件的覆盖,那么我需要做的只是将我想要覆盖的必要配置添加到jail.conf 中给出的默认值中。在这种情况下,我不需要添加 SSH 配置等,因为它已经包含在 jail.conf 中。
替换:如果jail.conf 在jail.local 存在时无效,那么我需要在jail.local 中添加所有规则,然后编辑我想要修改的规则。
你能确认当 jail.local 存在时 jail.conf 会发生什么吗?如果 jail.local 的行为就像是在 jail.conf 文件之上的覆盖,那么对我来说,只需添加几行我想添加的规则就更容易了,这也使维护和可读性变得容易。什么是最好的方法?
我正在尝试设置 sftp,以便一些受信任的人可以访问/编辑/创建一些文件。我已将用户监禁到他们的主目录 (/home/name) 中,但遇到了问题。我希望他们也能够访问 VPS 的其他部分,因为它也是一个游戏服务器、网络主机等,我希望他们能够完全控制他们被监禁的目录之外的文件。
我尝试创建指向所需目录的符号链接 (ln -s),但没有按预期工作。我尝试 (cp -rl) 访问我想要访问的文件并且它起作用了 - 他们可以编辑其目录中的文件并更改存储在监狱外的文件。但是他们不能创建新文件(他们可以,但不会在监狱外更新)。我知道我可能没有以“正确的方式”这样做,但是我该怎么做才能做我想做的事?
我正在运行 Debian stable,我希望为我的 'sftponly' 组中的用户建立以下环境:
从我的实验和研究来看,sshd_config 中的以下节似乎让我达到了 90%:
Match group sftponly
ChrootDirectory /sftp/%u
X11Forwarding no
AllowTcpForwarding no
ForceCommand internal-sftp
Run Code Online (Sandbox Code Playgroud)
这给了我监禁的 SFTP 而没有 SSH,这很好。但它也禁用了 SCP,这不太理想,因为很多客户端是使用 SCP 而不是 SFTP 的遗留脚本进程(我们正在替换的服务器支持这两种协议),并且因为这些客户端不受我们的控制并且很容易修改后,完全禁用 SCP 可能不切实际。
此配置将禁用 SCP 是有道理的,因为传入的 SCP 连接会导致 sshd 以该用户的身份通过用户的登录 shell 生成一个“scp”进程。如果不是特殊的“internal-sftp”处理程序,SFTP 似乎通常也是如此。
所以,我想我的问题是:有没有一种方法可以达到与“internal-sftp”相同的效果,但对于 SCP,而不使用像 scponly 和 rssh 这样的第三方工具?'internal-sftp' 的真正好处在于它不需要用支持文件设置监狱,或处理可能被利用的第三方 setuid 二进制文件(特别是 rssh,它有被利用的历史)。
FreeBSD 上的 jails 和 Linux 上的 Docker 之间的主要区别是什么?一个比另一个更安全或更高效吗?Jails 比 Docker 实例更古老,因此可以认为代码本身更安全。但是 Jails 永远不会“流行起来”,所以也许它们不如 Docker 实例好?或者仅仅是因为 Linux 比 FreeBSD 更受欢迎?
我可以访问一个以前设置的 FreeBSD 盒子,上面有许多监狱。其中一个监狱是一个 SQL 服务器,它没有启用 ssh。
如何从主机访问该监狱上的 shell?(我拥有它的 root 权限。)
我正在使用两台服务器,都运行 FreeBSD 8.4-RELEASE-p1 和 OpenSSH_6.1p1。ssh_config位于 中的两个服务器的文件/etc/ssh是相同的。两台服务器都配置为允许用户使用 SSH 远程进入被监禁的环境。
作为测试,我使用以下命令在两台服务器上使用 SSH 密钥登录到测试用户的监狱:
ssh -i ~/.ssh/private_key test-user@server.mydomain.com hello
Run Code Online (Sandbox Code Playgroud)
并且这authorized_keys两种情况下的文件都指定了以下要在身份验证后运行的命令,附加到公钥(两台服务器上的权限相同):
command="~/test.sh",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty
Run Code Online (Sandbox Code Playgroud)
其中test.sh只需执行以下操作:
#!/bin/sh
echo SSH_ORIGINAL_COMMAND = $SSH_ORIGINAL_COMMAND
Run Code Online (Sandbox Code Playgroud)
在一台服务器上,上述sh脚本的输出显示如下:
SSH_ORIGINAL_COMMAND = hello
Run Code Online (Sandbox Code Playgroud)
但是在另一台服务器上,结果似乎没有存储在 SSH_ORIGINAL_COMMAND 中
SSH_ORIGINAL_COMMAND =
Run Code Online (Sandbox Code Playgroud)
每个用户 jail 的相应服务器的行为是相同的。我的问题是 -SSH_ORIGINAL_COMMAND在第二台服务器的情况下,我还需要什么其他配置来允许在身份验证后设置变量?
是否可以在较重的虚拟化(Xen DomU、KVM、Hyper-V、VMVare)下使用 LXC?我想将它用作安全(隔离)工具,限制资源消耗的能力对我来说不是优先事项。我只对是否可以以直接的方式完成感兴趣;类似于在非虚拟化服务器上使用 LXC。我不想在生产服务器上使用太复杂的设置。
我有一台 FreeNAS (11.1-U1) 和一台 FreeBSD (11.1-RELEASE-p6) 机器。在 FreeNAS 上,我想以zfs receive具有委派权限的非 root 用户身份递归快照。这似乎适用于大多数子数据集。但是 iocage 的data数据集可以安装到监狱中并从那里管理,它们失败了:
root@freebsd:~> zfs send -RI "dozer@2018-02-21" "dozer@2018-03-08" | ssh -T -i /root/backup_key backupuser@freenas zfs receive -dvuF neo/backups/freebsd
receiving incremental stream of dozer@2018-03-03 into neo/backups/freebsd@2018-03-03
received 312B stream in 1 seconds (312B/sec)
receiving incremental stream of dozer@2018-03-07 into neo/backups/freebsd@2018-03-07
received 312B stream in 1 seconds (312B/sec)
receiving incremental stream of dozer@2018-03-08 into neo/backups/freebsd@2018-03-08
received 312B stream in 1 seconds (312B/sec)
receiving incremental stream of …Run Code Online (Sandbox Code Playgroud) FreeBSD 下的 ZFS 允许将文件系统分配给监狱,这样监狱中具有适当权限的帐户可以访问文件系统,创建新的从属文件系统,等等。至少在 8-STABLE 中,这些功能没有集成到现有/etc/rc.d/jail脚本中。基本流程类似于:
sysctl -w security.jail.enforce_statfs=0
sysctl -w security.jail.mount_allowed=1
zfs set jailed=on <filesystem>
zfs jail <jid> <filesystem>
Run Code Online (Sandbox Code Playgroud)
并且还需要暴露zfs监狱内的设备节点。
与此同时,似乎有大量工具(ezjail、jailer、warden 和一般/usr/ports/sysutils/*jail*)声称更容易/更好/更强大/等等,但其中大多数似乎只是轻微维护而不是与标准监狱脚本相比,这确实是一场胜利。
我想避免重新发明轮子。是否有与 ZFS 集成良好的监狱管理工具?我正在寻找一些可以在启动 jail 时设置必要的 devfs 规则、sysctl 设置和 zfs 属性的东西……并且理想情况下允许对 jails 进行基于名称的引用,尽管许多第三方都支持这种引用 -可悲的是,库存监狱脚本中缺少派对工具。