Bloqueia o acesso virtualmin a um domínio específico no linode [closed]

4

Eu configurei recentemente um servidor virtual no linode (debian 7) e gostaria de bloquear o acesso à instalação do virtualmin através de qualquer domínio diferente de um especificado.

No momento, posso acessar o virtualmin por meio do URL do membro do linode (por exemplo, exemplo1234.members.linode.com:10000), mas também posso acessá-lo por meio de domínios hospedados no servidor.

Como posso bloquear esses domínios?

    
por PottyBert 26.05.2013 / 19:58

1 resposta

1

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 em miniserv.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 :)

    
por 12.10.2014 / 02:21

Tags