Esse incidente de suporte aparece com frequência em hospedagem gerenciada: a conta FTP adicional conecta perfeitamente no FileZilla via FTPS, mas falha em conexões SFTP com o erro "Permission denied". A equipe de suporte costuma tratar como senha incorreta e reiniciar a credencial, mas a causa real reside na arquitetura de autenticação, não em um erro de digitação.
1. Usuários reais do sistema vs. usuários virtuais do daemon#
Para diagnosticar essa falha, é essencial entender como o Linux processa as conexões de cada protocolo:
- SFTP (SSH File Transfer Protocol): É um subsistema do SSH (
sshd). Toda autenticação passa obrigatoriamente pelo PAM (Pluggable Authentication Modules), checando usuários reais do sistema operacional listados em/etc/passwd. - FTPS (FTP over TLS): Utiliza um servidor FTP dedicado (como Pure-FTPd ou ProFTPD). Em painéis como cPanel e DirectAdmin, as contas de FTP adicionais são usuários virtuais. Suas credenciais são gerenciadas internamente pelo painel e validadas contra bancos de dados do daemon FTP (como arquivos de texto específicos ou base de dados local), sem qualquer representação no
/etc/passwd.
Conclusão: O SSH do servidor não conhece e não pode autenticar contas virtuais de FTP. Por definição, contas FTP adicionais criadas em painéis administrativos não funcionam via SFTP na porta 22.
2. Diagnóstico operacional: validando o serviço FTP#
Se os clientes não conseguirem conectar nem mesmo via FTPS, siga este fluxo de diagnóstico via terminal para atestar se o serviço está funcional:
# 1. Verificar se o daemon de FTP está rodando (Pure-FTPd ou ProFTPD)
systemctl status pure-ftpd
# ou
systemctl status proftpd
# 2. Verificar se o servidor está ouvindo na porta padrão 21 ou 990 (FTPS Implícito)
ss -lntp | grep -E "21|990"
# 3. Validar se o processo está respondendo localmente
nc -zv localhost 21
# ou
telnet localhost 21
# 4. Validar se o usuário é virtual ou real de sistema
getent passwd usuarioftp || echo "Usuário virtual: não existe no /etc/passwd"
3. FTPS explícito (porta 21) vs. FTPS implícito (porta 990)#
A criptografia de FTP sobre TLS pode ser estabelecida de duas maneiras:
- FTPS Explícito (Porta 21): O cliente estabelece uma conexão de texto plano tradicional e envia o comando
AUTH TLSouAUTH SSLpara atualizar o canal de controle para criptografado antes de transferir credenciais. É a abordagem mais compatível em ambientes de hospedagem compartilhada. - FTPS Implícito (Porta 990): Toda a conexão já inicia com o handshake TLS imediatamente no estabelecimento do socket TCP na porta 990. Não há tráfego em texto plano.
Como testar a conexão TLS via linha de comando:#
# Testar negociação TLS explícita (Porta 21)
openssl s_client -connect domain.com:21 -starttls ftp
# Testar conexão TLS implícita (Porta 990)
openssl s_client -connect domain.com:990
4. Hardening de segurança no pure-ftpd e proftpd#
Configurações padrão de FTP são inseguras. Devemos aplicar regras estritas de criptografia e limitação de recursos.
Como desabilitar FTP sem TLS (forçar criptografia)#
Conexões em texto plano expõem senhas na rede. Devemos configurar o daemon para recusar conexões não criptografadas.
No Pure-FTPd (cPanel/DirectAdmin comum):
# Editar o arquivo de configuração TLS
# Valores permitidos: 0 (Sem TLS), 1 (TLS Opcional), 2 (Forçar TLS)
echo "2" | sudo tee /etc/pure-ftpd/conf/TLS
# Reiniciar o serviço
sudo systemctl restart pure-ftpd
No ProFTPD:
# Editar o arquivo /etc/proftpd/proftpd.conf ou /etc/proftpd/conf.d/tls.conf
# Adicionar ou modificar o bloco mod_tls:
<IfModule mod_tls.c>
TLSEngine on
TLSRequired on
</IfModule>
# Reiniciar o serviço
sudo systemctl restart proftpd
Restringir ciphers fracos no FTPS#
Garantir que apenas algoritmos fortes de criptografia sejam aceitos durante o handshake.
No Pure-FTPd:
# Definir ciphers fortes no arquivo de configuração
echo "HIGH:!aNULL:!eNULL:!EXPORT:!DES:!3DES:!MD5:!PSK:!RC4" | sudo tee /etc/pure-ftpd/conf/TLSCipherSuite
# Reiniciar serviço
sudo systemctl restart pure-ftpd
Limitar tentativas de login por IP (prevenção de brute force)#
Evitar exaustão de conexões e ataques de dicionário.
No Pure-FTPd:
# Limitar número máximo de conexões por IP (ex: 3)
echo "3" | sudo tee /etc/pure-ftpd/conf/MaxClientsPerIP
sudo systemctl restart pure-ftpd
No ProFTPD:
# Adicionar ao proftpd.conf
MaxClientsPerHost 3
MaxClients 100
Para segurança em SFTP (SSH), configure o Fail2Ban editando /etc/fail2ban/jail.local:
[sshd]
enabled = true
port = ssh
maxretry = 3
bantime = 3600
Aplique as regras com sudo systemctl restart fail2ban.
5. Configuração de modo passivo (passive mode) e firewall#
O FTP tradicional utiliza canais diferentes para controle (porta 21) e dados (portas aleatórias de resposta do servidor). Em servidores protegidos por firewall ou atrás de NAT, o modo passivo falhará se o intervalo de portas não estiver explicitamente mapeado e liberado.
Configurar portas passivas no pure-ftpd:#
# Definir range de portas passivas (ex: 30000 a 31000)
echo "30000 31000" | sudo tee /etc/pure-ftpd/conf/PassivePortRange
# Se o servidor estiver atrás de NAT (como AWS EC2 ou Google Cloud), force o IP público externo:
echo "IP_PUBLICO_DO_SERVIDOR" | sudo tee /etc/pure-ftpd/conf/ForcePassiveIP
# Reiniciar serviço
sudo systemctl restart pure-ftpd
Liberar as portas no UFW firewall:#
sudo ufw allow 21/tcp
sudo ufw allow 990/tcp
sudo ufw allow 30000:31000/tcp
sudo ufw reload
6. Criação de usuário SFTP com chroot isolado (sem painel)#
Se o seu cliente necessita obrigatoriamente de conexões SFTP para terceiros com isolamento de diretórios (chroot), você deve criar um usuário real do sistema operacional sob regras rígidas no sshd_config.
# 1. Criar o usuário sem permissão a shell de comando (/bin/false)
sudo useradd -m -s /bin/false sftpuser
sudo passwd sftpuser
# 2. Configurar o diretório home como pertencente ao root (Requisito obrigatório do Chroot)
sudo chown root:root /home/sftpuser
sudo chmod 755 /home/sftpuser
# 3. Criar a pasta de trabalho (onde o usuário de fato poderá ler/escrever arquivos)
sudo mkdir -p /home/sftpuser/uploads
sudo chown sftpuser:sftpuser /home/sftpuser/uploads
Configurar regras de chroot no SSHD#
Edite o arquivo /etc/ssh/sshd_config e adicione ao final:
Match User sftpuser
ForceCommand internal-sftp
ChrootDirectory /home/%u
AllowTcpForwarding no
X11Forwarding no
PermitTunnel no
Valide a sintaxe do SSH antes de aplicar e reinicie:
sudo sshd -t
sudo systemctl restart sshd
7. Mapeamento de logs e verificação de clientes#
Para depurar falhas de autenticação de clientes FTP virtuais, os logs do próprio sistema são a melhor fonte de informação.
- Pure-FTPd:
/var/log/pure-ftpd.logoujournalctl -u pure-ftpd -f - ProFTPD:
/var/log/proftpd/proftpd.logoujournalctl -u proftpd -f - Mensagens gerais de login:
/var/log/messagesou/var/log/syslog
Testando conexões com ferramentas locais:#
# Testar com curl (FTPS)
curl -v --ftp-ssl --user "[email protected]:senha" ftp://domain.com:21/
# Testar com lftp (forçando criptografia)
lftp -u "[email protected],senha" -e "set ftp:ssl-force on; ls; bye" domain.com
8. Configuração nos painéis de controle (cPanel e DirectAdmin)#
Se você utiliza painéis administrativos, as alterações de serviço devem ser feitas diretamente pelas ferramentas do painel para evitar que sejam sobrescritas em atualizações automáticas.
No cPanel/WHM:#
- Acesse WHM > Service Configuration > FTP Server Selection.
- Escolha entre Pure-FTPd (Recomendado) ou ProFTPD.
- Acesse WHM > FTP Server > TLS/SSL Management para gerenciar certificados e forçar criptografia TLS.
No DirectAdmin:#
- Acesse o nível Admin > Server Manager > FTP Server.
- Defina o comportamento do serviço e verifique se as configurações de segurança de SSL/TLS estão ativas.
- Ajuste portas passivas em
/etc/pure-ftpd.confdiretamente pelos gerenciadores de arquivos protegidos do painel.
Comparativo técnico: FTP vs FTPS vs SFTP#
| Característica | FTP | FTPS | SFTP |
|---|---|---|---|
| Protocolo Base | FTP tradicional | FTP sobre TLS | SSH (Secure Shell) |
| Porta Padrão | 21 | 21 (Explícito) / 990 (Implícito) | 22 (Ou customizada do SSH) |
| Criptografia | Nenhuma (Texto plano) | TLS/SSL | SSH Nativo |
| Autenticação | Usuário Virtual ou Real | Usuário Virtual ou Real | Apenas Usuários Reais do Linux |
| Escopo (Chroot) | Nativo por daemon | Nativo por daemon | Requer configuração no sshd_config |
| Complexidade Firewall | Alta (Requer portas passivas) | Alta (Requer portas passivas) | Baixa (Apenas porta única de SSH) |
| Recomendação | ❌ Nunca utilizar | ✅ Recomendado para delegações | ✅ Recomendado para SysAdmins |
Script de diagnóstico completo (diagnose-ftp.sh)#
Este utilitário automatiza a verificação da integridade operacional do seu ambiente de transferência de arquivos.
#!/bin/bash
# diagnose-ftp.sh - Diagnóstico de serviços FTP/FTPS/SFTP
set -euo pipefail
echo "=== DIAGNÓSTICO OPERACIONAL DE SERVIÇOS DE ARQUIVOS ==="
echo ""
# 1. Verificar serviços FTP ativos
echo "[1/5] Verificando status dos daemons:"
if systemctl is-active --quiet pure-ftpd 2>/dev/null; then
echo " ✅ Pure-FTPd está ATIVO."
elif systemctl is-active --quiet proftpd 2>/dev/null; then
echo " ✅ ProFTPD está ATIVO."
else
echo " ❌ Nenhum daemon FTP padrão ativo encontrado."
fi
if systemctl is-active --quiet sshd 2>/dev/null; then
echo " ✅ SSHD (SFTP) está ATIVO."
else
echo " ❌ SSHD (SFTP) está INATIVO."
fi
# 2. Verificar portas em escuta
echo ""
echo "[2/5] Verificando portas em escuta (ss):"
ss -lntup | grep -E "21|990|22" || echo " ⚠️ Nenhuma porta 21, 990 ou 22 detectada em escuta ativa."
# 3. Validar se TLS está configurado no Pure-FTPd
echo ""
echo "[3/5] Verificando configuração TLS do FTP:"
if [ -f /etc/pure-ftpd/conf/TLS ]; then
TLS_VAL=$(cat /etc/pure-ftpd/conf/TLS)
case "$TLS_VAL" in
0) echo " ⚠️ TLS Desabilitado (Inseguro!)." ;;
1) echo " ✅ TLS Opcional (Aceita texto plano)." ;;
2) echo " ✅ TLS Obrigatório (Seguro)." ;;
*) echo " ❓ Configuração de TLS personalizada ou desconhecida: $TLS_VAL" ;;
esac
else
echo " ℹ️ Arquivo /etc/pure-ftpd/conf/TLS não encontrado (provavelmente usando outro daemon)."
fi
# 4. Verificar se há bloqueios ou limites por IP
echo ""
echo "[4/5] Verificando limites de conexões por IP:"
if [ -f /etc/pure-ftpd/conf/MaxClientsPerIP ]; then
echo " Pure-FTPd MaxClientsPerIP: $(cat /etc/pure-ftpd/conf/MaxClientsPerIP)"
else
echo " Sem limites explícitos de MaxClientsPerIP encontrados."
fi
# 5. Coletar logs recentes de erro
echo ""
echo "[5/5] Analisando logs de erro recentes (últimos 5 minutos):"
if [ -f /var/log/pure-ftpd.log ]; then
tail -n 10 /var/log/pure-ftpd.log | grep -i "fail\|error\|deny" || echo " Nenhum erro grave encontrado no log do Pure-FTPd."
else
journalctl -u pure-ftpd --since "5 minutes ago" 2>/dev/null | grep -i "fail\|error" || echo " Nenhum erro grave encontrado no journalctl."
fi
echo ""
echo "=== DIAGNÓSTICO CONCLUÍDO ==="
Tornando o script executável:
chmod +x diagnose-ftp.sh
Checklist de atendimento para o time de suporte (N1/N2)#
Siga este roteiro para resolver rapidamente chamados de "FTP não conecta":
- [ ] Identificar o Protocolo: O cliente está tentando usar SFTP (Porta 22) ou FTPS (Porta 21)?
- [ ] Validar Tipo de Conta: O usuário utilizado é o principal da hospedagem (real) ou uma conta FTP adicional (virtual)?
- [ ] Confirmar Porta: A porta configurada no cliente FTP está de acordo com o protocolo correto?
- [ ] Checar Firewall Local: Se o cliente alegar timeout, verifique se a faixa de portas passivas (
PassivePortRange) está liberada no UFW/IPTables. - [ ] Inspeção de Logs: Acompanhe em tempo real as tentativas de login com
tail -f /var/log/pure-ftpd.logpara isolar erros de credenciais.
Este artigo foi útil?
Deixe uma reação rápida para apoiar o conteúdo:
Este post está licenciado sob CC BY-NC.



Comentários
Participe da discussão abaixo.
0 comentários