限制对 \\wsl$ 的访问

限制对 \\wsl$ 的访问

\\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 的答案与之非常相似。

相关内容