Como instalar e segurar Webmin no Ubuntu 24.04
Instale o Webmin no Ubuntu 24.04 e proteja a porta 10000 usando SSH tunnel, Let's Encrypt, 2FA e Fail2ban para evitar acesso root não autorizado no servidor.
O que você está construindo
O Webmin é um painel de controle web que fornece uma interface de navegador para um servidor Linux completo — usuários, pacotes, cron jobs, firewall, Apache, BIND, discos e centenas de outros módulos — acessível via HTTPS na porta 10000. A instalação consiste em três comandos e leva cerca de um minuto. Este guia foca na segunda metade porque o Webmin faz login como root e possui as mesmas permissões do root. Um Webmin aberto ou sem autenticação não é apenas "um risco para gerenciar"; é um comprometimento total do servidor com uma página de login na frente. Portanto, instale-o em dez minutos e use o restante da hora para garantir que apenas você tenha acesso.
Pré-requisitos e um aviso importante
Um VPS Ubuntu 24.04 KVM recém-instalado com acesso root ou um usuário sudo. O Webmin é escrito em Perl e é leve — 1 GB de RAM é suficiente e o consumo em idle é inferior a um quarto de gigabyte. Ele escuta na porta TCP 10000 através de seu próprio servidor web integrado (miniserv.pl), não via Apache ou nginx, portanto não é necessário instalar outros serviços previamente.
Você deve decidir duas coisas antes de começar. Primeiro, a conta de login: o Webmin autentica contas Unix via PAM, então você deve logar como root ou um usuário no grupo sudo usando a senha Unix dessa conta. Imagens de nuvem geralmente utilizam apenas chaves SSH e não possuem senha definida para o usuário padrão; o Webmin não consegue logar em contas sem senha. Defina uma senha com o comando sudo passwd youruser primeiro, caso contrário o login falhará independentemente do que for digitado.
Segundo, e este é o aviso: não apenas abra a porta 10000 para a internet e finalize o processo. Decida agora se você acessará o Webmin via túnel SSH (recomendado, sem exposição) ou se irá restringir o acesso ao seu próprio IP. Essa decisão define todos os passos seguintes, portanto leia ambas as opções antes de configurar o firewall.
Instalar Webmin do repositório oficial
O Webmin disponibiliza um repositório apt assinado. O script de configuração adiciona o repositório e sua chave de assinatura GPG para que futuras execuções de apt upgrade baixem o Webmin como qualquer outro pacote. Isso garante atualizações autenticadas em vez de um .deb baixado que não se atualiza sozinho.
curl -o webmin-setup-repo.sh https://raw.githubusercontent.com/webmin/webmin/master/webmin-setup-repo.sh
sudo sh webmin-setup-repo.shO script exibe as ações que serão realizadas e pergunta Setup repository? (y/N) — responda y. Quando o processo terminar, instale o pacote. A flag --install-recommends baixa as dependências comuns de módulos Perl e SSL para evitar erros de biblioteca ausente em módulos individuais posteriormente.
sudo apt-get install --install-recommends webminO Webmin já renomeou este script anteriormente — guias antigos referenciam setup-repos.sh — portanto, se a URL direta retornar 404, utilize o comando de linha única atual diretamente de webmin.com/download em vez de fixar um nome. Uma instalação correta termina com uma linha como Webmin install complete. You can now login to https://your-host:10000/ as root. O serviço está habilitado e em execução, a configuração reside em /etc/webmin, os logs de requisições ficam em /var/webmin/miniserv.log, e falhas de login são enviadas para o syslog — no Ubuntu 24.04, para o journal do systemd.
Confirme se o serviço está ativo e escutando antes de abrir o navegador:
sudo systemctl status webmin --no-pager
sudo ss -tlnp | grep 10000Você deve ver um status active (running) e uma linha mostrando miniserv.pl vinculado a 0.0.0.0:10000 — esse endereço muda para 127.0.0.1:10000 ao utilizar a rota de túnel descrita abaixo. Se ss não mostrar nada na porta 10000, o Webmin não iniciou; verifique journalctl -u webmin -n 50 antes de prosseguir.
Primeiro login e o aviso de certificado
Acesse https://YOUR_SERVER_IP:10000 no seu navegador. Dois eventos ocorrem em uma instalação nova.
Se o ufw estiver ativo — a imagem padrão do Ubuntu vem com ele desativado, mas muitos provedores o ativam por padrão — a página não carregará; isso é tratado nos modos de falha abaixo. Se a porta estiver aberta, o navegador exibirá um bloqueio de página inteira: "Your connection is not private" com o código NET::ERR_CERT_AUTHORITY_INVALID no Chrome, ou SEC_ERROR_UNKNOWN_ISSUER / "Warning: Potential Security Risk Ahead" no Firefox. Isso é esperado e não indica uma invasão. O Webmin gerou um certificado autoassinado durante a instalação (/etc/webmin/miniserv.pem) e, como nenhuma autoridade de certificação o valida, o navegador recusa a confiança silenciosamente. A conexão ainda é criptografada; ela apenas não é validada. Clique para prosseguir (Advanced, depois Proceed) por enquanto — substituiremos este certificado corretamente mais adiante.
Faça login com root ou seu usuário sudo e sua senha Unix para acessar o dashboard de System Information. Um erro comum aqui é digitar http:// em vez de https://. O miniserv responde em HTTP puro nessa porta com o texto "This web server is running in SSL mode. Try the URL https://..." — a solução é literalmente alterar http para https na barra de endereços.
A decisão de segurança: como você acessará o Webmin?
Agora a parte importante. Um painel com privilégios de root não deve estar exposto na internet pública respondendo a tentativas de login de scanners globais. Você tem duas opções seguras, em ordem de preferência.
O túnel SSH na Opção B é a melhor escolha, pois não expõe nada. A allowlist de IP na Opção A é aceitável se o seu endereço for estático. Não utilizar nenhuma das duas é o erro que este guia visa prevenir. Se preferir acessar o Webmin via rede privada, coloque o servidor atrás de um VPN WireGuard self-hosted e vincule o Webmin ao endereço do túnel em vez do endereço público.
Opção A: restringir o Webmin ao seu IP
No painel, abra Webmin, depois Webmin Configuration, depois IP Access Control. Escolha "Only allow from listed addresses" e insira seu IP público, que pode ser obtido executando curl ifconfig.me no seu laptop. Salve. O Webmin grava essa configuração na linha allow= do arquivo /etc/webmin/miniserv.conf e reinicia o serviço.
O risco: se o seu IP residencial for dinâmico e mudar, ou se você digitar o endereço incorretamente, você perderá o acesso. O navegador exibirá "Access denied for <your IP>" e não mostrará o formulário de login; não haverá caminho via interface web para retornar. Você deve corrigir o problema pelo console do servidor via SSH ou pelo VNC do seu provedor:
sudo nano /etc/webmin/miniserv.conf
# find the line that begins allow=
# correct your IP, or delete the whole line to allow all again
sudo systemctl restart webminExcluir a linha allow= restaura o acesso totalmente aberto; use este método apenas para recuperação e, em seguida, configure o valor correto imediatamente.
Opção B: bind no localhost e túnel via SSH (recomendado)
Não ouvir na interface pública é melhor do que qualquer allowlist. Configure o miniserv para bind apenas no loopback e acesse-o através de um túnel SSH criptografado de sua confiança.
Edite o /etc/webmin/miniserv.conf e adicione, ou altere, uma linha:
bind=127.0.0.1Reinicie com sudo systemctl restart webmin. O Webmin agora está inacessível pela internet — um port scan na porta 10000 não encontrará nada, e o comando ss anterior mostrará que ele está bindado em 127.0.0.1:10000. Do seu laptop, abra um túnel:
ssh -L 10000:localhost:10000 youruser@YOUR_SERVER_IPMantenha essa sessão aberta e acesse https://localhost:10000. O tráfego passa por dentro do SSH, que já está autenticado pela sua chave e criptografado; portanto, você pode aceitar o certificado self-signed com segurança — a camada SSH fornece a proteção real. Feche a sessão SSH e o Webmin ficará inacessível. Sem necessidade de allowlist, sem exposição e sem serviços extras para hardening.
Se você configurar o bind=127.0.0.1 e esquecer o túnel, o acesso remoto será interrompido — isso é o recurso funcionando, não um erro. Recupere o acesso da mesma forma que na Opção A: pelo console, remova a linha bind ou defina bind=0.0.0.0 e reinicie. Este é o mesmo hábito de tunelamento usado para acessar um servidor de desenvolvimento remoto rodando Claude Code no tmux — uma única sessão SSH, tudo privado e nada ouvindo na interface pública.
Substitua o certificado self-signed por um real
Se você expõe o Webmin em um hostname conforme a Opção A, remova o aviso do navegador usando um certificado real do Let's Encrypt. Você precisa de um nome DNS — por exemplo, panel.example.com — com um registro A apontando para o servidor, e algo que responda ao desafio HTTP na porta 80 durante a validação.
O Webmin possui essa função integrada: Webmin, depois Webmin Configuration, depois SSL Encryption, e então a aba Let's Encrypt. Insira o hostname, aponte o "website root directory" para um caminho servido na porta 80 para esse domínio e solicite o certificado. O Webmin obtém o certificado, atualiza as linhas certfile= e keyfile= no arquivo miniserv.conf e o renova automaticamente antes do vencimento. Recarregue a página e o ícone de cadeado estará limpo.
O único obstáculo: o servidor do próprio Webmin roda na porta 10000, não na 80. Portanto, o desafio http-01 exige um servidor web real — Apache ou nginx — respondendo por panel.example.com na porta 80, ou uma validação baseada em DNS. Em um servidor apenas com Webmin, sem nada na porta 80, a solicitação falha com um erro de validação até que você forneça ao Let's Encrypt um caminho para acessar o arquivo de desafio. O funcionamento — registros DNS, desafio na porta 80 e renovação — é o mesmo para emitir um certificado para qualquer site. Se precisar de mais detalhes, o guia de certificados TLS Let's Encrypt com Certbot e nginx detalha o fluxo de validação e a configuração de DNS. Se você utilizou o método de túnel SSH, pode pular esta seção: o certificado self-signed é suficiente via SSH, e um certificado real emitido para panel.example.com causaria apenas um aviso de mismatch de nome ao acessar https://localhost:10000 de qualquer forma.
Ative a autenticação de dois fatores
Uma senha sozinha oferece pouca proteção para um painel root; adicione um segundo fator. Abra o Webmin, depois Webmin Configuration, e então Two-Factor Authentication. Selecione o provedor Google Authenticator — este utiliza o padrão TOTP, funcionando com Authy, 1Password ou qualquer aplicativo de autenticação — e salve. O Webmin instala o módulo Perl necessário (Authen::OATH mais um gerador de QR code) e habilita o recurso; este passo sozinho ainda não protege nenhuma conta.
Cada conta deve então registrar seu próprio dispositivo. Com o 2FA habilitado, abra o Webmin, depois Webmin Users, selecione a conta, escolha Enable Two-Factor For User e o Webmin exibirá um QR code; escaneie-o com o aplicativo e insira um código gerado para confirmar. A partir de então, o login solicitará o token de seis dígitos após a senha. Realize o registro antes de fazer logout — se o 2FA for obrigatório mas sua conta nunca tiver escaneado um código, você ainda poderá remover a exigência via console, mas é muito mais simples realizar o registro primeiro.
Adicione o Fail2ban para banir brute-force logins
Mesmo endpoints de login restritos devem punir falhas repetidas. O Webmin reporta logins falhos no syslog no formato webmin[12345]: Invalid login as root from 10.0.0.9, ou Non-existent login as ... para usuários que não são contas Unix — no Ubuntu 24.04 essas linhas vão para o systemd journal, pois uma instalação padrão não possui /var/log/auth.log. O Fail2ban inclui um filtro webmin-auth padrão que identifica exatamente essas duas linhas, e a jail abaixo configura o backend = systemd automaticamente, portanto não requer regex ou caminhos de log customizados.
Crie o /etc/fail2ban/jail.d/webmin.local:
[webmin-auth]
enabled = true
port = 10000
filter = webmin-auth
backend = systemd
maxretry = 4
bantime = 1hRecarregue com sudo systemctl restart fail2ban e confirme se a jail está ativa:
sudo fail2ban-client status webmin-authVocê verá a jail listada com um contador de banimentos em zero inicialmente (no backend do journal não existe a linha File list:). Para testar a integração completa, falhe um login propositalmente algumas vezes de outra rede, então execute o comando status novamente e observe o Currently banned subir. Se o contador não subir, verifique se você não está testando de um endereço presente no ignoreip do Fail2ban, e execute journalctl SYSLOG_IDENTIFIER=webmin no servidor para confirmar se as linhas Invalid login estão sendo escritas. Se o Fail2ban ainda não estiver instalado nesta máquina, o guia Fail2ban on Ubuntu 24.04 for SSH cobre a instalação e a jail de SSH que deve ser executada junto com esta.
Restrinja o que cada usuário do Webmin pode acessar
Nem todos que precisam do painel precisam de acesso root total. Em Webmin, depois Webmin Users, crie logins adicionais e conceda apenas os módulos necessários para cada um — por exemplo, um operador de backups que visualiza apenas os módulos cron e filesystem. Ao editar um usuário, você verá uma lista de todos os módulos; desmarcar um módulo o remove do menu do usuário e bloqueia as URLs correspondentes. Isso é defesa em profundidade: mesmo que uma sessão do Webmin com privilégios baixos seja roubada, ela não poderá reescrever /etc/shadow se o módulo Users não estiver na lista.
Mantendo o Webmin atualizado
Como você instalou via repositório apt, o sudo apt update && sudo apt upgrade baixa novas versões do Webmin junto com o restante do sistema. Aplique patches rapidamente — um painel de controle é um alvo frequente. O Webmin também pode se atualizar através de Webmin, depois Webmin Configuration, depois Upgrade Webmin, mas o método via apt é mais limpo no Ubuntu porque mantém as versões consistentes com seu outro gerenciamento de pacotes. Não trate isso como opcional: vários CVEs passados do Webmin foram bugs de remote-code-execution, e a única diferença entre estar "corrigido" ou "comprometido" era a velocidade com que o administrador executava a atualização.
Modos de falha e as mensagens que você verá
"Your connection is not private" / NET::ERR_CERT_AUTHORITY_INVALID. Exibido no primeiro carregamento. Causa: o certificado self-signed gerado pelo Webmin na instalação não possui um emissor confiável. Não é um ataque; o canal está criptografado, mas não é validado. Solução: ignore o aviso por enquanto e depois emita um certificado Let's Encrypt real, ou aceite-o permanentemente se você acessar o Webmin via túnel SSH.
"This web server is running in SSL mode. Try the URL https://..." Você digitou http://server:10000. O miniserv só aceita TLS nessa porta e está informando isso em texto puro. Solução: altere http para https na barra de endereços.
Page times out — ERR_CONNECTION_TIMED_OUT / "This site can't be reached". A requisição nunca chega ao Webmin. No Ubuntu, isso quase sempre é o ufw descartando a porta 10000. Confirme com sudo ufw status; se a porta 10000 não estiver listada, abra-a com sudo ufw allow 10000/tcp ou, preferencialmente, mantenha-a fechada e use o túnel SSH da Opção B. Note a diferença: um timeout significa que um firewall está descartando pacotes silenciosamente, enquanto ERR_CONNECTION_REFUSED significa que a porta é alcançável, mas o Webmin não está rodando — verifique sudo systemctl status webmin.
"Access denied for <your IP>." Você configurou o IP Access Control na Opção A e seu endereço atual não está na lista de permissões — um IP dinâmico que mudou ou um erro de digitação. Não há caminho de volta pelo navegador. Solução via console: edite a linha allow= em /etc/webmin/miniserv.conf, corrija ou delete-a, e execute sudo systemctl restart webmin.
"Login failed. Please try again." com credenciais que você sabe estarem corretas. A conta não possui senha Unix, o que é padrão em imagens de nuvem que usam apenas chaves. O Webmin autentica via PAM contra a senha Unix, e essa senha não existe para o usuário. Solução: execute sudo passwd youruser no servidor e faça o login. Se /var/webmin/miniserv.log mostrar Non-existent login as ..., você está digitando um nome de usuário que não é uma conta Unix.
Para mais de alguns servidores, a automação escala melhor do que um painel de controle em cada máquina: seu primeiro playbook Ansible é por onde você começa.
FAQ
É seguro expor o Webmin na internet pública?
Trate um Webmin exposto à internet como um shell root com uma página de login, pois é exatamente isso que ele é. Ele é seguro apenas se houver múltiplas camadas: um certificado real, autenticação de dois fatores, Fail2ban e uma lista de permissões de IP restrita ou, preferencialmente, nenhuma exposição pública. A configuração de menor risco vincula o Webmin ao 127.0.0.1 e o acessa via túnel SSH, de modo que a porta 10000 não responde a ninguém na internet aberta.
Como remover o aviso de certificado do Webmin?
O aviso (NET::ERR_CERT_AUTHORITY_INVALID) aparece porque o Webmin utiliza um certificado autoassinado. Gere um certificado real em Webmin, Webmin Configuration, SSL Encryption, Let's Encrypt, usando um nome DNS que aponte para o servidor com um serviço que responda ao desafio port-80 para validação. Se você acessa o Webmin apenas via túnel SSH para o localhost, o aviso é inofensivo — o SSH já criptografa e autentica a conexão — e você pode aceitar o certificado autoassinado com segurança.
Como restringir o Webmin apenas ao meu endereço IP?
Vá em Webmin, Webmin Configuration, IP Access Control, escolha "Only allow from listed addresses" e insira seu IP público do curl ifconfig.me. O Webmin armazena isso na linha allow= do /etc/webmin/miniserv.conf. Cuidado com IPs residenciais dinâmicos: se o IP mudar, você perderá o acesso e precisará corrigir a linha allow= pelo console do servidor. Portanto, um endereço estático ou o método de túnel SSH é mais confiável na prática.
Por que meu login falha mesmo com a senha correta?
O Webmin autentica via PAM contra sua senha Unix. Imagens de nuvem geralmente usam apenas chaves e não possuem senha definida na conta padrão — logo, o PAM não tem uma senha para validar e o login é rejeitado. Execute sudo passwd youruser no servidor para definir uma senha e então faça o login. Uma linha Non-existent login as ... no /var/webmin/miniserv.log significa que o nome de usuário não é uma conta Unix real.
Qual a utilidade do Webmin comparado ao SSH comum?
O Webmin é uma camada de conveniência e descoberta. Ele é útil para navegar em arquivos de log, gerenciar usuários e cron, editar regras de firewall e visualizar o estado de discos e serviços sem memorizar todos os comandos — ideal para administradores ocasionais ou equipes com diferentes níveis de habilidade. O SSH puro é mais rápido, permite automação via scripts e expõe uma superfície de ataque muito menor para tarefas rotineiras. Muitos administradores utilizam ambos: SSH para o uso diário e Webmin vinculado ao localhost via túnel para tarefas ocasionais de interface gráfica.