Como instalar e proteger o Webmin no Ubuntu 24.04
Instale o Webmin no Ubuntu 24.04 e proteja a porta 10000 com tunel SSH ou allowlist de IP, certificado Let's Encrypt, 2FA e Fail2ban.
O que você vai criar
O Webmin é um painel de controlo web que disponibiliza uma interface de navegador para todo um servidor Linux: utilizadores, pacotes, tarefas cron, a firewall, Apache, BIND, discos e centenas de outros módulos. Fica acessível por HTTPS na porta 10000. A instalação consiste em 3 comandos e demora cerca de 1 minuto. Este guia dedica a maior parte do conteúdo à segunda etapa porque o Webmin inicia sessão como root e pode fazer tudo o que root pode fazer. Um Webmin exposto sem restrições ou sem autenticação não é apenas "um risco a gerir"; representa o comprometimento total do servidor, com uma página de início de sessão à frente. Instale-o em 10 minutos e dedique o resto da hora a garantir que só você consegue aceder-lhe.
Pré-requisitos e um aviso importante
Um VPS KVM Ubuntu 24.04 novo, com acesso root ou com um utilizador sudo. O Webmin é desenvolvido em Perl e é leve: 1 GB de RAM é suficiente, e a utilização em espera fica bem abaixo de um quarto de gigabyte. O Webmin escuta na porta TCP 10000 através do seu próprio servidor Web incluído (miniserv.pl), e não do Apache ou do nginx. Por isso, não é necessário instalar mais nada antes.
Há duas decisões a tomar antes de começar. A primeira diz respeito à conta usada para iniciar sessão: o Webmin autentica-se nas contas Unix através do PAM. Por isso, inicia sessão como root ou como um utilizador do grupo sudo, usando a palavra-passe Unix dessa conta. As imagens cloud normalmente permitem apenas autenticação por chave e não têm uma palavra-passe definida para o utilizador predefinido. O Webmin não consegue iniciar sessão numa conta sem palavra-passe. Defina primeiro uma palavra-passe com sudo passwd youruser. Caso contrário, o início de sessão falhará, independentemente do que escrever.
A segunda decisão é o aviso: não abra simplesmente a porta 10000 para a Internet e deixe tudo assim. Decida agora se vai aceder ao Webmin através de um túnel SSH (recomendado, sem expor nada) ou se vai restringir o acesso ao seu próprio IP. Essa decisão determina todos os passos seguintes. Por isso, leia ambas as opções antes de alterar a firewall.
Instalar o Webmin a partir do repositório oficial
O Webmin disponibiliza um repositório apt assinado. O script de configuração adiciona o repositório e a respetiva chave de assinatura GPG, para que as futuras execuções de apt upgrade obtenham o Webmin como qualquer outro pacote. Assim, recebe atualizações autenticadas em vez de um .deb transferido que nunca é atualizado.
curl -o webmin-setup-repo.sh https://raw.githubusercontent.com/webmin/webmin/master/webmin-setup-repo.sh
sudo sh webmin-setup-repo.shO script mostra o que vai fazer e pede Setup repository? (y/N). Responda y. Quando terminar, instale o pacote. A opção --install-recommends instala as dependências comuns dos módulos Perl e SSL, para evitar que módulos individuais falhem mais tarde devido a bibliotecas em falta.
sudo apt-get install --install-recommends webminO Webmin já mudou o nome deste script, e os guias antigos fazem referência a setup-repos.sh. Se o URL direto devolver 404, obtenha o comando atual diretamente de webmin.com/download em vez de fixar um nome. Uma instalação correta termina com uma linha semelhante a Webmin install complete. You can now login to https://your-host:10000/ as root. O serviço fica ativado e em execução, a configuração fica em /etc/webmin, os pedidos são registados em /var/webmin/miniserv.log e as tentativas de início de sessão falhadas vão para o syslog, que no Ubuntu 24.04 corresponde ao journal do systemd.
Confirme que o serviço está realmente ativo e a escutar antes de abrir um navegador:
sudo systemctl status webmin --no-pager
sudo ss -tlnp | grep 10000Deve obter um estado active (running) e uma linha que mostre miniserv.pl associado a 0.0.0.0:10000. Esse endereço muda para 127.0.0.1:10000 quando utilizar o túnel descrito abaixo. Se ss não mostrar nada na porta 10000, o Webmin não iniciou. Consulte journalctl -u webmin -n 50 antes de continuar.
Primeiro início de sessão e aviso do certificado
Aponte o navegador para https://YOUR_SERVER_IP:10000. Num servidor acabado de instalar, acontecem duas coisas.
Se o ufw estiver ativo, a página não será carregada. A imagem de servidor do Ubuntu inclui-o desativado, mas muitos fornecedores ativam-no previamente. Este caso é explicado abaixo, na secção sobre modos de falha. Se a porta estiver aberta, o navegador apresenta um bloqueio em página inteira: "A sua ligação não é privada", com o código NET::ERR_CERT_AUTHORITY_INVALID no Chrome, ou SEC_ERROR_UNKNOWN_ISSUER / "Warning: Potential Security Risk Ahead" no Firefox. Isto é esperado e não significa que tenha ocorrido uma intrusão. O Webmin gerou um certificado autoassinado durante a instalação (/etc/webmin/miniserv.pem). Como nenhuma autoridade de certificação o valida, o navegador recusa-se a confiar nele silenciosamente. A ligação continua cifrada; simplesmente não é validada por uma autoridade. Prossiga mesmo assim (Advanced e depois Proceed). Mais abaixo, substituímos corretamente este certificado.
Inicie sessão com root ou com o seu utilizador sudo e a respetiva palavra-passe Unix. Será encaminhado para o dashboard System Information. Um erro comum nesta etapa é introduzir http:// em vez de https://. O miniserv responde com HTTP simples nessa porta e apresenta exatamente o texto "This web server is running in SSL mode. Try the URL https://...". Para corrigir, basta alterar http para https na barra de endereços.
A decisão de segurança: como vai aceder ao Webmin?
Agora vem a parte importante. Um painel com privilégios equivalentes aos de root não deve ficar exposto à Internet pública, a responder a tentativas de início de sessão de todos os scanners existentes. Existem duas opções defensáveis, por ordem de preferência. Todas as interfaces de administração auto-hospedadas acabam por colocar esta mesma questão. É por isso que a segurança do Vaultwarden depende do seu endpoint de administração e do ficheiro de backup, e não da sua encriptação.
O túnel SSH da Opção B é a melhor opção, porque não expõe absolutamente nada. A lista de permissões de IP da Opção A é aceitável se o seu endereço for estático. Não fazer nenhuma das duas coisas é exatamente o erro que este guia pretende evitar. Se preferir aceder ao Webmin através de uma rede privada, em vez de usar qualquer uma destas opções, coloque o servidor atrás de uma VPN WireGuard auto-hospedada e faça o Webmin escutar no 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 e depois IP Access Control. Selecione "Only allow from listed addresses" e introduza o seu IP público, que pode obter executando curl ifconfig.me no seu portátil. Guarde as alterações. O Webmin escreve este valor na linha allow= de /etc/webmin/miniserv.conf e reinicia-se.
O problema é o seguinte: se o IP da sua rede doméstica for dinâmico e mudar, ou se introduzir o endereço incorretamente, ficará sem acesso. O navegador apresenta então "Access denied for <your IP>", sem formulário de início de sessão, e não existe um caminho de acesso pela interface web. Corrija a configuração a partir da consola do servidor, através de SSH ou do VNC do seu fornecedor:
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 webminEliminar a linha allow= restaura o acesso totalmente aberto. Faça isto apenas para recuperar o acesso e, em seguida, defina imediatamente um valor correto.
Opção B: associar a localhost e criar um túnel através de SSH (recomendado)
Melhor do que qualquer lista de permissões é não escutar na interface pública. Configure o miniserv para associar-se apenas ao loopback e aceda a ele através de um túnel SSH encriptado em que já confia.
Edite /etc/webmin/miniserv.conf e adicione ou altere uma linha:
bind=127.0.0.1Reinicie com sudo systemctl restart webmin. O Webmin deixa de estar acessível pela Internet, uma verificação das portas 10000 não encontra nada e a verificação ss apresentada anteriormente mostra agora que está associado a 127.0.0.1:10000. No seu portátil, abra um túnel:
ssh -L 10000:localhost:10000 youruser@YOUR_SERVER_IPMantenha essa sessão aberta e aceda a https://localhost:10000. O tráfego passa dentro do SSH, que já é autenticado pela sua chave e encriptado. Por isso, pode aceitar com segurança o certificado autoassinado neste caso; a camada SSH fornece a proteção efetiva. Feche a sessão SSH e o Webmin deixa de estar acessível. Não há nada para incluir numa lista de permissões, nada exposto e nenhum serviço adicional para proteger.
Se definir bind=127.0.0.1 e se esquecer do túnel, o acesso remoto simplesmente deixa de funcionar. Essa é a funcionalidade a operar, não uma falha. Recupere da mesma forma que na Opção A: a partir da consola, remova a linha bind ou defina bind=0.0.0.0 e reinicie. Este é o mesmo procedimento de tunelização usado para aceder a um ambiente de desenvolvimento remoto com Claude Code em tmux: uma sessão SSH, tudo privado e nada adicional a escutar na interface pública.
Substituir o certificado autoassinado por um certificado válido
Se expõe o Webmin num hostname ao abrigo da Opção A, elimine o aviso do browser com um certificado real da Let's Encrypt. Precisa de um nome DNS, por exemplo panel.example.com, com um registo A a apontar para o servidor, e de algo que responda ao desafio HTTP na porta 80 durante a validação.
O Webmin já inclui esta função: Webmin, depois Webmin Configuration, depois SSL Encryption, depois o separador Let's Encrypt. Introduza o hostname, indique em "website root directory" um caminho servido na porta 80 para esse domínio e peça o certificado. O Webmin obtém o certificado, atualiza as linhas certfile= e keyfile= em miniserv.conf e renova-o automaticamente antes de expirar. Recarregue a página. O cadeado deixa de apresentar avisos.
O ponto importante é que o servidor do Webmin funciona na porta 10000, não na porta 80. Por isso, o desafio http-01 precisa de um servidor Web real, como Apache ou nginx, a responder por panel.example.com na porta 80, ou de uma validação baseada em DNS. Num servidor apenas com Webmin e sem nada na porta 80, o pedido falha com um erro de validação até dar à Let's Encrypt uma forma de aceder ao ficheiro do desafio. Os detalhes, incluindo os registos DNS, o desafio na porta 80 e a renovação, são os mesmos de uma emissão de certificado para qualquer website. Para obter esse contexto, o guia sobre certificados TLS da Let's Encrypt com Certbot e nginx explica detalhadamente o fluxo de validação e a configuração DNS. Se optou pelo túnel SSH, pode ignorar esta secção: o certificado autoassinado é suficiente através de SSH, e um certificado real emitido para panel.example.com apresentaria na mesma um aviso de nome incompatível ao visitar https://localhost:10000.
Ative a autenticação de dois fatores
Uma palavra-passe isolada oferece pouca proteção para um painel root, por isso adicione um segundo fator. Abra Webmin, depois Webmin Configuration e depois Two-Factor Authentication. Selecione o fornecedor Google Authenticator, que usa TOTP padrão e funciona com Authy, 1Password ou qualquer aplicação autenticadora, e guarde a configuração. O Webmin instala o pequeno módulo Perl necessário (Authen::OATH e um gerador de QR) e ativa a funcionalidade; este passo, por si só, ainda não protege nenhuma conta.
Cada conta deve então associar o seu próprio dispositivo. Com a 2FA ativa, abra Webmin, depois Webmin Users, selecione a conta, escolha Enable Two-Factor For User e o Webmin apresenta um código QR; leia-o com a aplicação e introduza um código gerado para confirmar. A partir desse momento, o início de sessão pede o token de seis dígitos depois da palavra-passe. Faça a associação antes de terminar a sessão. Se a 2FA for obrigatória, mas a sua conta nunca tiver lido um código, ainda pode remover a obrigatoriedade a partir da consola, mas é muito menos trabalhoso fazer primeiro a associação.
Adicionar o Fail2ban para bloquear tentativas de login por força bruta
Mesmo um endpoint de login restrito deve penalizar falhas repetidas. O Webmin regista os logins falhados no syslog no formato webmin[12345]: Invalid login as root from 10.0.0.9 ou Non-existent login as ... quando o nome de utilizador nem sequer corresponde a uma conta Unix. No Ubuntu 24.04, essas linhas são gravadas no journal do systemd, porque uma imagem padrão não tem /var/log/auth.log. O Fail2ban inclui um filtro padrão webmin-auth que corresponde exatamente a essas duas linhas. A jail abaixo define backend = systemd por si própria, por isso não precisa de uma expressão regular personalizada nem de um caminho de log.
Crie /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 que a jail está ativa:
sudo fail2ban-client status webmin-authA jail deve aparecer com um contador de bloqueios inicialmente igual a zero. No backend do journal, não existe uma linha File list:. Para testar todo o funcionamento, provoque intencionalmente algumas falhas de login a partir de outra rede. Em seguida, execute novamente o comando de estado e monitorize o aumento de Currently banned. Se o valor nunca aumentar, confirme que o teste não está a ser feito a partir de um endereço incluído em ignoreip do Fail2ban. Execute também journalctl SYSLOG_IDENTIFIER=webmin no servidor para confirmar que as linhas Invalid login estão realmente a ser gravadas. Se o Fail2ban ainda não estiver instalado neste servidor, o guia do Fail2ban no Ubuntu 24.04 para SSH explica a instalação e a jail SSH que deve executar em conjunto com esta.
Restrinja o que cada utilizador do Webmin pode alterar
Em Webmin, depois Webmin Users, crie logins adicionais do Webmin e atribua a cada um apenas os módulos necessários. Por exemplo, um operador de backups pode ter acesso apenas aos módulos cron e sistema de ficheiros. Ao editar um utilizador, é apresentada uma lista de verificação com todos os módulos. Desmarcar um módulo remove-o do menu desse utilizador e bloqueia os URLs correspondentes. Isto aplica defesa em profundidade: mesmo uma sessão do Webmin de baixo privilégio, se for roubada, não pode reescrever /etc/shadow quando o módulo Users não estiver incluído na respetiva lista.
Manter o Webmin atualizado
Como instalou o Webmin a partir do repositório apt, sudo apt update && sudo apt upgrade obtém as novas versões do Webmin juntamente com o resto do sistema. Instale as correções rapidamente, porque um painel de controlo é um alvo frequente. O Webmin também pode atualizar-se através de Webmin, depois Webmin Configuration e depois Upgrade Webmin, mas o método com apt é mais simples no Ubuntu, porque mantém as versões consistentes com a gestão dos restantes pacotes. Não trate esta tarefa como opcional: várias CVEs anteriores do Webmin permitiam execução remota de código, e a única diferença entre um sistema corrigido e um servidor comprometido era a rapidez com que o administrador executava a atualização.
Modos de falha e as mensagens que verá
"Your connection is not private" / NET::ERR_CERT_AUTHORITY_INVALID. É apresentada no primeiro acesso. A causa é o certificado autoassinado que o Webmin gerou durante a instalação, sem uma autoridade emissora confiável. Não se trata de um ataque. O canal está cifrado, mas o certificado não é validado por uma entidade confiável. Por agora, avance pelo aviso. Depois, emita um certificado Let's Encrypt válido ou aceite-o permanentemente se aceder ao Webmin através de um túnel SSH.
"This web server is running in SSL mode. Try the URL https://..." Introduziu http://server:10000. O miniserv só utiliza TLS nessa porta e está a informar isso em texto simples. Altere http para https na barra de endereço.
A página excede o tempo limite, ERR_CONNECTION_TIMED_OUT / "This site can't be reached". O pedido nunca chega ao Webmin. No Ubuntu, quase sempre é o ufw a descartar a porta 10000. Confirme com sudo ufw status. Se 10000 não estiver listada, abra-a com sudo ufw allow 10000/tcp ou, preferencialmente, mantenha-a fechada e utilize o túnel SSH da Opção B. Tenha em atenção a diferença: um timeout significa que uma firewall está a descartar os pacotes silenciosamente, enquanto ERR_CONNECTION_REFUSED significa que a porta está acessível, mas o Webmin não está em execução. Verifique sudo systemctl status webmin.
"Access denied for <your IP>." Configurou o controlo de acesso por IP na Opção A e o endereço atual não está na lista permitida. Também pode tratar-se de um endereço IP dinâmico que mudou ou de um erro de digitação. Não existe um caminho de recuperação pelo browser. Corrija o problema na consola: edite a linha allow= em /etc/webmin/miniserv.conf, corrija-a ou elimine-a, e execute sudo systemctl restart webmin.
"Login failed. Please try again." com credenciais que sabe estarem corretas. A conta não tem uma palavra-passe Unix. Isto é comum em imagens cloud que utilizam apenas chaves. O Webmin autentica através do PAM usando a palavra-passe Unix, mas essa palavra-passe não existe para o utilizador. Corrija o problema executando sudo passwd youruser no servidor e, depois, inicie sessão. Se /var/webmin/miniserv.log apresentar Non-existent login as ..., está a introduzir um nome de utilizador que nem sequer corresponde a uma conta Unix.
Para mais do que alguns servidores, a automação é mais escalável do que instalar um painel de controlo em cada máquina: o seu primeiro playbook Ansible é o ponto de partida.
FAQ
É seguro expor o Webmin na Internet pública?
Trate um Webmin exposto à Internet como um shell root com uma página de login, porque é exatamente isso que ele é. Só é suficientemente seguro quando protegido por várias camadas: um certificado válido, autenticação de dois fatores, Fail2ban e uma lista de permissões de IP restrita ou, melhor ainda, nenhuma exposição pública. A configuração de menor risco associa o Webmin a 127.0.0.1 e permite aceder-lhe através de um túnel SSH. Assim, a porta 10000 não responde a ninguém na Internet pública.
Como removo o aviso de certificado do Webmin?
O aviso (NET::ERR_CERT_AUTHORITY_INVALID) aparece porque o Webmin é distribuído com um certificado autoassinado. Em Webmin, Webmin Configuration, SSL Encryption, Let's Encrypt, emita um certificado válido usando um nome DNS que aponte para o servidor e tenha algo a servir o desafio na porta 80 para validação. Se só aceder ao Webmin através de um túnel SSH para localhost, o aviso não representa um risco. O SSH já cifra e autentica a ligação, pelo que pode aceitar o certificado autoassinado com segurança.
Como restrinjo o Webmin apenas ao meu endereço IP?
Aceda a Webmin, Webmin Configuration, IP Access Control, selecione "Only allow from listed addresses" e introduza o seu IP público a partir de curl ifconfig.me. O Webmin armazena esta configuração na linha allow= de /etc/webmin/miniserv.conf. Tenha cuidado com um IP doméstico dinâmico. Se mudar, ficará sem acesso e terá de corrigir a linha allow= a partir da consola do servidor. Na prática, um endereço estático ou o método do túnel SSH é mais fiável.
Por que motivo o início de sessão falha mesmo com a palavra-passe correta?
O Webmin autentica através do PAM usando a sua palavra-passe Unix. As imagens cloud normalmente permitem apenas autenticação por chave e não têm uma palavra-passe definida para a conta predefinida. Por isso, não existe uma palavra-passe para o PAM validar e o início de sessão é rejeitado. Execute sudo passwd youruser no servidor para definir uma palavra-passe e, em seguida, inicie sessão. Uma linha Non-existent login as ... em /var/webmin/miniserv.log indica, em vez disso, que o próprio nome de utilizador não corresponde a uma conta Unix válida.
Para que serve o Webmin em comparação com o SSH simples?
O Webmin é uma camada de descoberta e conveniência. É realmente útil para consultar ficheiros de log, gerir utilizadores e cron, editar regras de firewall e consultar o estado dos discos e dos serviços sem memorizar todos os comandos. Isso é útil para administradores ocasionais ou equipas com diferentes níveis de experiência. O SSH simples é mais rápido, permite criar scripts e expõe uma superfície de ataque muito menor nas tarefas de rotina. Muitos administradores usam ambos: SSH para o trabalho diário e Webmin associado a localhost, acedido através de um túnel, para tarefas ocasionais feitas com cliques. Se a sua dúvida real for escolher entre painéis, e não entre um painel e o shell, vale a pena avaliar primeiro Cockpit em comparação com o Webmin, porque os dois diferem na quantidade de componentes do sistema que conseguem alterar e na forma como autenticam o utilizador.