锁定 linode 上特定域的 virtualmin 访问权限

锁定 linode 上特定域的 virtualmin 访问权限

我最近在 linode(debian 7)上设置了一个虚拟服务器,并且想阻止通过除指定域之外的任何域访问 virtualmin 安装。

我目前可以通过 linode 成员 url(例如 example1234.members.linode.com:10000)访问 virtualmin,但我也可以通过服务器上托管的域访问它。

我该如何阻止这些域名?

答案1

免责声明:

  • 我从未在生产中使用过 webmin。过去,我只是在我的开发服务器中安装了这个软件,但没有兴趣去探索它。
  • 此解决方案已在此进行测试 网页管理虚拟分钟版本

    # dpkg -l
    ii  webmin               1.710       all      web-based administration interface for Unix systems
    ii  virtualmin-base      1.0-35      all      Meta-package that runs a postinstall script to configure all of the services managed by Virtualmin.
    

一些背景

Virtualmin是一个模块基于 Web 的管理,称为 Webmin。换句话说,Virtualmin 在 Webmin 上运行. Webmin 本身使用 miniserv.pl 作为网络服务器。因此,如果您想了解如何基于 Host 标头进行限制,您应该深入研究 miniserv.pl

网络服务器 miniserv.pl

因此,我们有好消息也有坏消息。坏消息是,与其他复杂的 Web 服务器(如 nginx 或 apache)相比,此 Web 服务器仅具有基本功能。好消息是,它是用 Perl(一种脚本语言)编写的,仅包含在单个文件中/usr/share/webmin/miniserv.pl。此 Web 服务器的配置文件位于 中/etc/webmin/miniserv.conf。不幸的是,有关参数的文档位于迷你服务配置文件非常有限(或者也许我使用了错误的关键字进行搜索:))。

因此,我决定检查一下源代码miniserv.pl。我感兴趣的代码来自这个代码片段。

if (defined($header{'host'})) {
    if ($header{'host'} =~ /^\[(.+)\]:([0-9]+)$/) {
        ($host, $port) = ($1, $2);
        }
    elsif ($header{'host'} =~ /^([^:]+):([0-9]+)$/) {
        ($host, $port) = ($1, $2);
        }
    else {
        $host = $header{'host'};
        }
    if ($config{'musthost'} && $host ne $config{'musthost'}) {
        # Disallowed hostname used
        &http_error(400, "Invalid HTTP hostname");
        }
    }

好的,这些行告诉我们:

假设请求到达 miniserv.pl,并且所有这些条件都得到满足

  • HTTP 请求中有 Host 标头
  • 参数musthost定义在miniserv.conf
  • 主机标头值与参数不相等musthost

那么请求应该被拒绝,并出现错误 400 无效的 HTTP 主机名。是的,这些功能正是您想要的。

因此,如果您想限制域访问 virtualmin 接口,您应该设置参数必须主办与允许的域一起miniserv.conf

笔记:

一些问题:

  • 如果没有,用户可以绕过你的限制主持人:在请求标头中。
  • 当您启用 SSL,但用户通过 http(而非 https)浏览时,用户将打印此信息:

此 Web 服务器正在 SSL 模式下运行。请尝试 URLhttps://your.allowed.domain:10000/反而。

更新:

第二个问题可以通过使用 OP 的补丁来修补文件来预防miniserv.pl。该补丁将在Github 拉取请求(感谢 OP!!!)。未来的 webmin 也将具有此功能,因为 webmin 已经接受请求:)

相关内容