Назад | Перейти на главную страницу

Блокировать доступ virtualmin к определенному домену на линоде

Я недавно установил виртуальный сервер на linode (debian 7) и хотел бы заблокировать доступ к установке virtualmin через любой домен, кроме указанного.

В настоящее время я могу получить доступ к virtualmin через URL-адрес члена linode (например, example1234.members.linode.com:10000), но я также могу получить к нему доступ через домены, размещенные на сервере.

Как я могу заблокировать эти домены?

Отказ от ответственности:

  • Я никогда не использую webmin в продакшене. Раньше я просто устанавливал это программное обеспечение на свой сервер разработчиков, но не интересовался его изучением.
  • Это решение протестировано в этом Webmin и Virtualmin версия

    # 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 - это модуль веб-управления под названием Webmin. Другими словами, Virtualmin работает поверх Webmin. Сам Webmin использовать miniserv.pl в качестве веб-сервера. Итак, если вы хотите узнать, как ограничить на основе заголовка Host, вам следует откопать его в miniserv.pl

Веб-сервер miniserv.pl

Итак, у нас есть плохие новости и хорошие новости. Плохая новость в том, что этот веб-сервер имеет только базовую функцию по сравнению с другими сложными веб-серверами, такими как nginx или apache. Хорошая новость в том, что он был написан на Perl - языке сценариев - и содержался в одном файле. /usr/share/webmin/miniserv.pl. Этот веб-сервер имеет файл конфигурации в /etc/webmin/miniserv.conf. К сожалению, документация о параметре в 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, вы должны установить параметр musthost в miniserv.conf с разрешенным доменом.

Ноты:

Некоторая проблема:

  • Пользователь может обойти ваше ограничение, если нет Хост: в заголовке запроса.
  • Когда вы включаете ssl, но пользователь просматривает http (не https), пользователь распечатывает эту информацию:

Этот веб-сервер работает в режиме SSL. Попробуйте URL https: //your.allowed.domain: 10000 / вместо.

Обновить:

Вторую проблему можно предотвратить, исправив файл miniserv.pl с патчем из ОП. Патч будет доступен через запрос на включение github (кредит ОП !!!). Будущий webmin также имеет эту функцию, поскольку webmin уже принять запрос на перенос :)