Aviso:
- Eu nunca uso o webmin em produção. No passado, eu apenas instalei este software no meu devserver, mas não estou interessado em explorá-lo.
-
Esta solução é testada nesta versão Webmin e 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.
Alguns antecedentes
Virtualmin é um módulo de gerenciamento baseado na web chamado Webmin. Em outras palavras, o Virtualmin rodando no topo do Webmin . O próprio Webmin usa miniserv.pl como webserver . Então, se você quiser descobrir como restringir com base no cabeçalho do host, você deve cavar para miniserv.pl
Webserver miniserv.pl
Então, temos notícias ruins e boas novas. A má notícia é que este servidor tem apenas uma característica básica em comparação com outro servidor web complexo, como o nginx ou o apache. A boa notícia é que foi escrito com Perl - uma linguagem de script - contida em apenas um arquivo /usr/share/webmin/miniserv.pl
. Este servidor da Web possui arquivo de configuração em /etc/webmin/miniserv.conf
. Infelizmente a documentação sobre o parâmetro em miniserv.conf era bastante limitada (ou talvez eu use palavras-chave erradas para pesquisar :)).
Então, decidi examinar o código-fonte de miniserv.pl
. A linha interessada vem deste trecho.
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");
}
}
OK, estas linhas nos dizem:
Suponha que a solicitação chegue a miniserv.pl com todas essas condições foram atendidas
- Há um cabeçalho de host na solicitação HTTP
- O parâmetro
musthost
foi definido emminiserv.conf
- O valor do cabeçalho do host não é igual ao parâmetro
musthost
então o pedido deve ser rejeitado com erro 400 Nome do host HTTP inválido. Sim, esse recurso era exatamente o que você queria.
Portanto, se você quiser restringir o domínio ao acesso à interface virtualmin, defina o parâmetro musthost em miniserv.conf
com o domínio permitido.
Notas:
Alguma questão:
- O usuário pode ignorar sua restrição se não houver Host: no cabeçalho da solicitação.
- Quando você habilita o ssl, mas o usuário navega por meio de http (não https), o usuário imprime essas informações:
This web server is running in SSL mode. Try the URL https://your.allowed.domain:10000/ instead.
Atualização:
O segundo problema pode ser evitado remendando o arquivo miniserv.pl
com o patch do OP. O patch estará disponível em solicitação do github pull (crédito para OP !!!). Webmin futuro também tem esse recurso como o webmin já aceita o pedido pull :)