FTP, FTPS ou SFTP no cPanel/DirectAdmin: arquitetura correta e falhas comuns
Voltar para blog

FTP, FTPS ou SFTP no cPanel/DirectAdmin: arquitetura correta e falhas comuns

07/06/2026 · 5 min · Infraestrutura

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:

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:

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.

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:#

  1. Acesse WHM > Service Configuration > FTP Server Selection.
  2. Escolha entre Pure-FTPd (Recomendado) ou ProFTPD.
  3. Acesse WHM > FTP Server > TLS/SSL Management para gerenciar certificados e forçar criptografia TLS.

No DirectAdmin:#

  1. Acesse o nível Admin > Server Manager > FTP Server.
  2. Defina o comportamento do serviço e verifique se as configurações de segurança de SSL/TLS estão ativas.
  3. Ajuste portas passivas em /etc/pure-ftpd.conf diretamente pelos gerenciadores de arquivos protegidos do painel.

Comparativo técnico: FTP vs FTPS vs SFTP#

CaracterísticaFTPFTPSSFTP
Protocolo BaseFTP tradicionalFTP sobre TLSSSH (Secure Shell)
Porta Padrão2121 (Explícito) / 990 (Implícito)22 (Ou customizada do SSH)
CriptografiaNenhuma (Texto plano)TLS/SSLSSH Nativo
AutenticaçãoUsuário Virtual ou RealUsuário Virtual ou RealApenas Usuários Reais do Linux
Escopo (Chroot)Nativo por daemonNativo por daemonRequer configuração no sshd_config
Complexidade FirewallAlta (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":

Este artigo foi útil?

Deixe uma reação rápida para apoiar o conteúdo:

CC BY-NC

Este post está licenciado sob CC BY-NC.

Comentários

Participe da discussão abaixo.

0 comentários