Como mudar a porta SSH no Rocky Linux com SELinux
Veja como alterar a porta do sshd no Rocky Linux e AlmaLinux sem perder acesso: configure firewalld, o rótulo SELinux e o sshd_config na ordem correta.
Por que alterar a porta SSH exige três passos aqui
Para alterar a porta SSH no Rocky Linux, AlmaLinux, CentOS Stream ou Fedora, uma única edição não é suficiente. Três sistemas separados determinam se uma ligação na nova porta funciona. O firewalld decide se o pacote chega à máquina. O SELinux decide se sshd pode associar-se a esse número de porta. sshd_config decide qual porta o daemon solicita. Se ignorar o passo do SELinux, o daemon recusa-se a iniciar. Se ignorar o passo do firewalld, ele inicia e fica à escuta, mas ninguém consegue alcançá-lo.
No Ubuntu, o mesmo trabalho requer uma edição e um reinício, porque o Ubuntu usa AppArmor em vez de SELinux e não inclui nenhum perfil que restrinja as portas às quais o sshd pode associar-se. Se o ufw estiver em execução, adicione uma regra. Essa é toda a diferença. A família RHEL inclui o firewalld em execução e o SELinux em modo enforcing numa instalação nova, e ambos consideram os números das portas.
Execute as tarefas nesta ordem para manter a sessão atual ativa durante todos os passos:
- Abra a nova porta no firewalld, mantendo a porta 22 aberta por enquanto.
- Adicione o rótulo SELinux para a nova porta com
semanage. - Defina a porta na configuração do sshd.
- Reinicie
sshde, em seguida, inicie sessão na nova porta a partir de um segundo terminal antes de fechar o primeiro.
Encontre a consola web do seu fornecedor (VNC ou série) antes de começar e confirme que consegue iniciar sessão através dela. Essa consola é a forma de recuperar o acesso se a alteração correr mal. Uma alteração de porta é uma das razões mais comuns para um cliente ficar sem acesso a um servidor que acabou de pagar.
Instale primeiro o semanage
semanage é a ferramenta que edita as definições da política do SELinux, mas uma instalação mínima do Rocky Linux ou AlmaLinux não a inclui. A ferramenta está no pacote policycoreutils-python-utils.
sudo dnf install -y policycoreutils-python-utilsExecutar o comando antes de instalar esse pacote apresenta sudo: semanage: command not found. É nesse ponto que muitos leitores concluem que o SELinux não está instalado e ignoram o passo. O SELinux está instalado. Falta apenas a ferramenta de gestão. Se a sintaxe dnf for nova para si, os equivalentes do comando dnf e apt permitem relacioná-la com o que já conhece.
Escolha uma porta e confirme que nenhum processo a utiliza
Qualquer porta TCP livre entre 1024 e 65535 serve. Faça estas duas verificações antes de escolher uma:
sudo ss -tlnp | grep -w 2222
sudo semanage port -l | grep -w 2222A primeira mostra se já existe um processo a escutar nessa porta. A segunda mostra se a política SELinux já a atribui a outro tipo de serviço. Uma porta livre não devolve resultados em nenhuma das verificações. Se a política já a tiver atribuído, o semanage port -a no passo 2 falha com ValueError: Port tcp/2222 already defined. Nesse caso, escolha outro número.
Este guia usa 2222 como exemplo. Também é a primeira porta que um scanner tenta depois da 22. Num servidor real, escolha uma porta menos óbvia.
Etapa 1: abra a porta no firewalld
sudo firewall-cmd --permanent --add-port=2222/tcp
sudo firewall-cmd --reload
sudo firewall-cmd --list-ports--permanent grava a regra no ficheiro da zona em disco e não altera a firewall em execução. --reload carrega a configuração em disco para a firewall em execução. Se ignorar o reload, a regra existe, mas não tem efeito até o firewalld reiniciar. Esta é uma das formas mais comuns de este procedimento parecer falhar sem motivo.
Por enquanto, não altere a entrada de serviço ssh. Essa entrada mantém a porta 22 aberta e serve de alternativa enquanto faz os testes.
Verifique também o painel de controlo do seu fornecedor. Muitos hosts executam uma firewall de rede à frente do VPS, fora do sistema operativo. Por isso, uma porta aberta no firewalld ainda pode ser descartada a montante. O guia básico do firewalld para um VPS explica as zonas e a diferença entre a configuração em execução e a configuração permanente, caso esse modelo seja novo para si.
Passo 2: atribuir o rótulo SELinux à porta
sudo semanage port -a -t ssh_port_t -p tcp 2222
sudo semanage port -l | grep ssh_port_t-a adiciona uma nova atribuição de porta. -t ssh_port_t é o tipo usado pelas portas SSH. O segundo comando lista tudo o que ssh_port_t abrange agora, para confirmar que o seu número foi adicionado antes de alterar o daemon.
Por que o SELinux bloqueia a porta
O SELinux (security-enhanced Linux) atribui uma etiqueta a cada objeto do sistema, e os números das portas TCP são objetos como quaisquer outros. O daemon SSH é executado confinado num domínio chamado sshd_t. A política permite que sshd_t associe portas TCP com a etiqueta ssh_port_t, e, por predefinição, a única porta com essa etiqueta é a 22. Se pedir ao daemon para associar a porta 2222, o kernel verifica a etiqueta, encontra o tipo genérico que a política atribuiu a esse número e recusa a permissão name_bind no socket.
É por isso que esta falha não se parece com um problema de firewall. O kernel recusa a operação antes de existir um socket em escuta, portanto sshd comunica o erro e termina. Um problema de firewall é o inverso: o daemon está em execução e saudável, mas os pacotes são descartados à entrada.
getenforce informa em que modo o sistema está. No modo Permissive, uma recusa é registada, mas não é aplicada. Por isso, a alteração da porta parece funcionar e falha mais tarde, quando alguém executa setenforce 1 ou quando o sistema reinicia no modo de aplicação. Etiquete a porta de qualquer forma. O guia básico do SELinux para servidores explica corretamente os modos, contextos e booleanos. As portas não são os únicos objetos afetados. A mesma política impede um contentor de ler um diretório do host montado até esse caminho receber uma nova etiqueta. É por isso que a instalação do Docker no Rocky Linux ou AlmaLinux inclui uma etapa relativa ao SELinux que os guias para Ubuntu nunca mencionam.
Passo 3: definir a porta na configuração do sshd
No Rocky Linux 9 e 10, AlmaLinux 9 e 10 e nas versões atuais do Fedora, /etc/ssh/sshd_config começa com uma linha de inclusão. Por isso, o local adequado para a alteração é um ficheiro drop-in. As atualizações dos pacotes nunca entram em conflito com a sua alteração.
grep -n '^Include' /etc/ssh/sshd_config
echo 'Port 2222' | sudo tee /etc/ssh/sshd_config.d/10-port.conf
sudo sshd -tSe grep não encontrar nenhuma linha Include, como acontece no Rocky Linux 8 e noutras imagens mais antigas, coloque Port 2222 diretamente em /etc/ssh/sshd_config. sshd -t analisa toda a configuração, incluindo os drop-ins, e apresenta os erros de sintaxe. Corrija todos os erros apresentados antes de reiniciar, porque uma configuração que não pode ser analisada impede o daemon de voltar a arrancar.
Port pode aparecer mais de uma vez, e o sshd escuta em todas as portas listadas. Manter Port 22 juntamente com Port 2222 durante o primeiro dia é uma medida de segurança simples, desde que se lembre de remover Port 22.
O seu sshd é iniciado por uma unidade socket?
Algumas imagens iniciam o SSH através da ativação de sockets do systemd, em vez de o executarem como um serviço de longa duração. Nesse caso, o systemd gere o socket de escuta e entrega as ligações ao sshd. Por isso, a linha Port em sshd_config é totalmente ignorada. Verifique antes de reiniciar qualquer componente:
systemctl is-enabled sshd.socketUma resposta enabled significa que a porta está definida na unidade socket, e não em sshd_config:
sudo systemctl edit sshd.socket[Socket]
ListenStream=
ListenStream=2222O ListenStream= sem argumentos é obrigatório. Os valores acumulam-se nos drop-ins. Sem uma atribuição vazia para limpar primeiro a lista, o socket continua a escutar em 22 e também em 2222. Aplique a alteração com sudo systemctl daemon-reload e, em seguida, sudo systemctl restart sshd.socket. Se a unidade estiver desativada ou não existir no seu servidor, esta secção não se aplica.
Etapa 4: reinicie e teste a partir de um segundo terminal
sudo systemctl restart sshd
systemctl status sshd
sudo ss -tlnp | grep sshdMantenha este terminal aberto. Não termine a sessão. Abra um segundo terminal no seu computador e ligue-se à nova porta:
ssh -p 2222 youruser@203.0.113.10Feche a primeira sessão apenas depois de o segundo início de sessão ter funcionado. Se não funcionar, continuará a ter uma shell a partir da qual pode desfazer tudo. Este hábito pode ser a diferença entre uma alteração de cinco minutos e uma tarde inteira na consola do fornecedor.
Firewall drop ou negação do SELinux? Como distingui-los
A partir do portátil, as duas falhas parecem quase idênticas. No servidor, não se parecem em nada.
- Se
systemctl status sshdindicar que a unidade falhou, o daemon nunca obteve o socket. Isto indica um erro de configuração ou uma negação do SELinux. - Se a unidade estiver ativa e
ss -tlnpindicar que o sshd está associado à nova porta, o daemon está a funcionar e o problema está no caminho de rede: firewalld, a firewall separada do fornecedor ou o endereço e a porta utilizados na ligação.
No caso do SELinux, leia o registo de auditoria em vez de tentar adivinhar:
sudo ausearch -m AVC -ts recent
sudo journalctl -u sshd -n 50 --no-pagerUma negação name_bind na classe tcp_socket identifica o processo em comm="sshd", o número da porta em src= e o rótulo que a porta efetivamente tem em tcontext=. Esse último campo contém a resposta. Qualquer valor diferente de ssh_port_t significa que o passo 2 não foi aplicado à porta utilizada, normalmente devido a um erro no número ou ao protocolo incorreto. Instale setroubleshoot-server se preferir que sealert transforme o registo numa frase.
A mensagem que o próprio sshd escreve quando o kernel recusa a associação é semelhante a esta:
error: Bind to port 2222 on 0.0.0.0 failed: Permission denied.Permission denied numa porta acima de 1024, onde não é necessário o privilégio de root para fazer a associação, é a assinatura do SELinux. Address already in use nessa mesma linha indica uma falha diferente: outro processo está a utilizar a porta. Do lado do cliente, a diferença entre uma ligação recusada e uma ligação que excede o tempo limite distingue os dois casos de rede, porque uma recusa significa que o pacote chegou ao host e não havia nada a escutar, enquanto um timeout significa que não houve qualquer resposta.
Feche a porta 22 e atualize os clientes
Depois de vários logins funcionarem na nova porta, remova a porta 22:
sudo firewall-cmd --permanent --remove-service=ssh
sudo firewall-cmd --reload
sudo firewall-cmd --list-allNão altere o rótulo SELinux da porta 22. Ele vem da política base e não concede acesso quando a firewall deixa de aceitar pacotes nessa porta.
Depois, corrija os clientes, porque todas as ferramentas que assumiam a porta predefinida precisam de receber essa informação. Configure isto uma vez em ~/.ssh/config na sua própria máquina, em vez de escrever -p repetidamente:
Host myvps
HostName 203.0.113.10
Port 2222
User youruserscp, sftp, rsync e Ansible leem esse ficheiro. As tarefas de backup, as verificações de monitorização e os scripts do cron que têm a porta 22 definida diretamente não o fazem. Procure esses casos enquanto a alteração ainda está recente.
O que a alteração da porta resolve e o que não resolve
Isto reduz o ruído nos logs. Os scanners automatizados atacam constantemente a porta 22, e mudar para outra porta remove a maioria dessas linhas do journal, o que facilita a identificação de eventos reais. Não é um controlo de segurança. Qualquer scanner que percorra todo o intervalo de portas encontra o seu daemon e lê igualmente o respetivo banner de versão. Trate a alteração da porta como uma tarefa de manutenção e aplique a proteção real com autenticação apenas por chave e logins por palavra-passe desativados. O guia de reforço da segurança SSH para um VPS explica o procedimento passo a passo.
Tudo o que foi descrito acima funciona de forma idêntica nas duas principais reconstruções do RHEL, porque são compiladas a partir das mesmas fontes. Consulte Comparação entre Rocky Linux e AlmaLinux se ainda estiver a escolher entre as duas. Existem duas reconstruções quase idênticas para escolher porque o CentOS deixou de o ser em 2020. Essa mudança é explicada detalhadamente em A história do Red Hat ao CentOS, Rocky e AlmaLinux. Confirme qual release recebeu realmente antes de seguir qualquer guia antigo, usando cat /etc/os-release. Os guias escritos para Rocky Linux 8 continuam bem classificados, e os passos semanage e firewall-cmd continuam corretos. No entanto, o Rocky 8 não tem a linha include sshd_config.d nem uma socket unit a considerar. Por isso, a parte relativa ao sshd nesses guias não corresponde a um sistema atual.
o fail2ban tem de ser informado sobre a nova porta
O fail2ban não está nos repositórios base. É disponibilizado pelo EPEL (extra packages for enterprise Linux):
sudo dnf install -y epel-release
sudo dnf install -y fail2ban fail2ban-firewalldO subpacote fail2ban-firewalld faz o fail2ban aplicar os bloqueios através do firewalld. É isso que deve ser usado num servidor onde o firewalld gere o conjunto de regras.
A jail padrão sshd define port = ssh, e esse nome é resolvido através de /etc/services para a porta 22. Depois da alteração, a jail monitoriza uma porta que ninguém está a atacar. Por isso, não bloqueia ninguém, enquanto as tentativas de login falhadas se acumulam na porta 2222. Defina a porta pelo número em /etc/fail2ban/jail.local:
[sshd]
enabled = true
port = 2222
backend = systemd
maxretry = 5
bantime = 3600backend = systemd lê as falhas do journal em vez de /var/log/secure. Esta é a opção mais segura numa instalação mínima, onde rsyslog pode não estar presente. Inicie-o com sudo systemctl enable --now fail2ban e verifique a jail com sudo fail2ban-client status sshd. A sintaxe da jail é a mesma usada em a configuração do fail2ban para SSH no Ubuntu 24.04. Apenas a origem do pacote e a ação de bloqueio são diferentes.
A aplicação de patches é mais importante do que a porta
Um servidor com a porta SSH alterada e quatro meses de atualizações de segurança por instalar está em pior estado do que um servidor na porta 22 que instala patches todas as noites. Ative as atualizações automáticas na mesma sessão, enquanto já tem acesso como root: atualizações automáticas do dnf no Rocky Linux e AlmaLinux explica o temporizador e a escolha entre descarregar as atualizações e aplicá-las. Uma atualização instalada não reinicia os daemons que continuam a executar o código antigo. Por isso, verificar o que ainda precisa de um reinício ou reboot vale o minuto sempre que o openssh-server ou uma biblioteca de que depende for atualizado no lote.
FAQ
Por que o sshd falha ao iniciar depois que altero a porta no Rocky Linux?
Quase sempre, falta o rótulo de porta do SELinux. sshd é executado confinado no domínio sshd_t, e a política só permite que ele faça bind em portas rotuladas como ssh_port_t, que, por padrão, inclui apenas a porta 22. O kernel recusa o bind, por isso o daemon termina em vez de ficar escutando, e journalctl -u sshd contém uma linha no formato error: Bind to port 2222 on 0.0.0.0 failed: Permission denied.. Execute sudo semanage port -a -t ssh_port_t -p tcp 2222 com o seu próprio número de porta e reinicie o serviço. Se semanage não for encontrado, instale policycoreutils-python-utils primeiro.
Ainda preciso do semanage se o SELinux estiver no modo permissive?
Sim. No modo permissive, a negação é registada e o bind é permitido mesmo assim, por isso parece que a alteração funcionou. O rótulo continua em falta. Assim que alguém executar setenforce 1, ou o servidor arrancar com SELINUX=enforcing em /etc/selinux/config, o sshd deixará de iniciar nessa porta. Adicionar o rótulo requer um comando e elimina uma falha que, de outra forma, só surgiria semanas depois, sem uma causa evidente.
A porta está rotulada e o sshd está em execução. Então por que a minha ligação expira?
Um daemon em execução significa que o SELinux está satisfeito. Portanto, o pacote está a ser descartado durante a entrada. Verifique sudo firewall-cmd --list-ports para confirmar a sua porta e confirme que executou firewall-cmd --reload depois da regra --permanent, porque uma regra permanente, por si só, nunca é aplicada à firewall em execução. Depois, verifique o painel de controlo do seu host para encontrar uma firewall de rede separada à frente do VPS. Esse é o segundo ponto onde as ligações costumam ser bloqueadas, e nada dentro do sistema operativo o mostrará.
Que porta devo usar em vez da 22?
Qualquer porta TCP livre entre 1024 e 65535. Evite 2222 e 22222 num servidor real, porque os scanners tentam-nas imediatamente depois da 22. Confirme que o número está livre com sudo ss -tlnp, confirme que a política do SELinux ainda não o reservou com sudo semanage port -l e não escolha uma porta atribuída a um serviço que possa instalar mais tarde. Um número alto e difícil de memorizar é adequado, porque irá escrevê-lo uma vez em ~/.ssh/config e nunca mais terá de o introduzir.