\\WSL$
在 WSL2 中挂载文件系统时,是否总是可以使用或从主机访问它\\wsl.localhost\
?
我想在 WSL2 环境中挂载一个 luks 加密的文件系统,并保护它免受外部访问,最好是完全隐藏这个挂载。
我阅读了有关完全禁用文件共享功能的选项,但我在其他用例中需要此功能,因此我需要更细粒度的功能,例如挂载选项mount --make-*
。
答案1
它是否总是可以使用...从主机访问?
好问题。据我所知,目前是的,它始终可以访问。我想不出任何方法来禁用它完全。
但是,由于没有 WSL 功能可以直接处理此问题,因此这里有几种替代实现。但需要注意的是没有任何如果第三方有权访问 Windows 主机,它们就可以保护数据不被窃取(参见脚注)。
首先,也许最直接的,就是限制你的默认WSL 用户无法访问挂载点。这将使 无法从
\\wsl$\
(及其后继\\wsl.localhost\
)访问,但要求您在 Ubuntu 中访问挂载点时使用不同的用户名。这可能是 root,或者您可以创建一个辅助用户,su -
当您想要使用 LUKS 驱动器时,您可以使用该用户。sudo chmod 700 /mnt/LUKSdrive
相反,您可以将默认用户更改为 ,
nobody
并将挂载的所有权授予您的普通用户。\\wsl$\
然后,将使用 的权限访问共享nobody
,并且访问将被拒绝。sudo chown $USER:$USER /mnt/LUKSdrive sudo chmod 700 /mnt/LUKSdrive sudo -e /etc/wsl.conf
添加以下内容:
[user] default=nobody
退出 Ubuntu,然后从 PowerShell 中:
$ wsl --shutdown $ wsl ~ <3>WSL (9) ERROR: CreateProcessEntryCommon:559: chdir(/nonexistent) failed 2 This account is currently not available. $ wsl ~ -u <your_Ubuntu_username>
每次启动 Ubuntu 时您都需要指定
-u <username>
,但您的用户将可以访问 LUKS 加密的驱动器,而\\wsl$\
不能。
保护它免受外部访问,最好是完全隐藏此支架
最复杂,但可能最接近“隐藏它”的方法是使用挂载命名空间,在其中能使用
mount --make-private
以限制它在初始/默认命名空间中被看到。# One time sudo touch /root/LUKSns sudo mkdir /mnt/LUKSdrive sudo unshare --mount=/root/LUKSns --propagation unchanged # Now we are inside the mount namespace as root mount --make-private /dev/mapper/LUKSdrive /mnt/LUKSdrive/ logout # exit or Ctrl+D, etc. # Back in the initial namespace ls /mnt/LUKSdrive # Should be empty sudo nsenter --mount=/root/LUKSns runuser -P -l $USER -c "exec $SHELL" ls /mnt/LUKSdrive # Contents should be visible
在文件资源管理器中将
\\wsl$\<distribution>\mnt\LUKSdrive
显示为空。注意事项:
在命名空间内部,某些 WSL 功能将无法使用。其中包括:
Windows 路径将不再附加到 Linux 路径。因此,如果您想要调用 Windows 命令,则需要使用完全限定路径(例如
/mnt/c/Windows/notepad.exe
)。WSL 配置的环境变量将不会被设置,包括
$WSL_DISTRO_NAME
和$DISPLAY
。假设您使用的是较新的 WSL 版本,您可以手动export DISPLAY=:0
恢复 X11 功能。Wayland 和 PulseAudio 的其他变量也可以手动重置。
为了使这个解决方案发挥作用,我多次对 WSL 进行了硬锁定,需要
taskkill
整个子系统。这可能是由于尝试进入\\wsl.localhost\<distro>\mnt\LUKSdrive
,但我还不确定。我很想知道(如果您尝试这样做)您是否遇到任何问题。
脚注:安全影响
WSL 采用“容器”概念,目前无法限制 Windows 用户访问分发版。即使我们像\\wsl$\
上面一样阻止访问,用户仍然可以简单地执行以下操作:
wsl -u root
...并输入命名空间或绕过所有权/权限限制。这与 Docker 容器的工作方式非常相似。请参阅 Stack Overflow 问题,如何用密码保护 Docker 容器?,WSL 的答案与之非常相似。