Home Comunidade Eventos YouTube Networks Desafios // produtos Academy News CTI | CVE Contato

06 - SFTP e SCP

video explicativo
Video explicativoEspaco reservado para o video desta anotação — adicione video: https://youtu.be/... no frontmatter da nota.

SFTP e SCP

1. Definição

SFTP (SSH File Transfer Protocol) e SCP (Secure Copy Protocol) são dois mecanismos distintos de transferência de arquivos sobre SSH. Apesar de ambos usarem a porta 22 e o canal cifrado do SSH, têm arquiteturas, capacidades e históricos completamente diferentes. A confusão entre eles é comum porque ambos copiam arquivos via SSH, mas tecnicamente são protocolos separados.

  • SCP: protocolo legado (1983, derivado do rcp BSD), que executa o binário scp no servidor para cada transferência. Operações limitadas a cópia de arquivo único. Substituído por SFTP como padrão desde OpenSSH 9.0 (2022).
  • SFTP: protocolo moderno (2001, Internet-Draft draft-ietf-secsh-filexfer), executado como subsistema do SSH (Subsystem sftp). Permite navegação de diretórios, operações múltiplas, preservação de atributos e retomada de transferências.

Comparação Rápida

Característica SCP SFTP
Ano de origem 1983 (rcp), SSH 1995 2001
RFC / Spec RFC 4251 (arquitetura SSH) I-D secsh-filexfer
Implementação Binário scp no servidor Subsistema sftp-server
Operações Apenas cópia (put/get) Lista, rename, mkdir, stat, symlink
Navegação remota Não Sim (interactive shell)
Retomar transferência Não (recria do zero) Sim (offset em read/write)
Preservar atributos -p (limitado) Sim (perms, uid, gid, timestamps, ACLs)
Performance Menor (1 processo por arquivo) Maior (1 canal, pipeline)
Default em OpenSSH 9.0+ Não Sim

2. SCP — Secure Copy Protocol

O SCP é essencialmente o rcp (remote copy do BSD) encapsulado em SSH. Funciona executando o binário scp no servidor remoto, que por sua vez usa o ssh para transportar dados. Cada transferência cria um novo subsistema SSH.

Funcionamento Interno

O cliente SCP conecta via SSH, solicita execução de scp -t (to, recebimento) ou scp -f (from, envio) no servidor. O protocolo troca mensagens de controle (tipo C0644 tamanho nome) seguidas do conteúdo bruto do arquivo. Não há sessão interativa — cada comando scp é uma operação completa.

Sintaxe Básica

scp /local/arquivo.txt user@host:/remoto/dir/        # Local para remoto
scp user@host:/remoto/arquivo.txt /local/            # Remoto para local
scp user1@host1:/arq user2@host2:/destino/           # Entre hosts remotos
scp -r /local/dir user@host:/remoto/                 # Recursivo
scp -p /local/arq user@host:/remoto/                 # Preservar perms/timestamps
scp -P 2222 /local/arq user@host:/remoto/            # Porta SSH diferente
scp -C /local/grande.log user@host:/remoto/          # Comprimir em trânsito
scp -l 1000 /local/arq user@host:/remoto/           # Limitar banda (1 Mbps)

Limitações do SCP

  • Sem navegação: cada invocação é uma cópia isolada; não há "entrar" no servidor remoto.
  • Sem rename/mkdir: precisa de SSH interativo ou SFTP para operações de diretório.
  • Sem retomar: transferência interrompida reinicia do zero.
  • Baixa performance em múltiplos arquivos: cada arquivo dispara novo handshake SSH interno, sobrecarregando a rede em milhares de arquivos pequenos.
  • Sem progresso de resumo: barra de progresso existe, mas não há relatório final de taxa.
  • Obsoleto: OpenSSH 9.0 (2022) trocou o protocolo padrão de scp para usar SFTP internamente (flag -s), mantendo a CLI compatível.

3. SFTP — SSH File Transfer Protocol

O SFTP é um protocolo de transferência de arquivos completo, baseado em mensagens request-response sobre um canal SSH. Permite operações ricas equivalentes a um sistema de arquivos remoto. É o subsistema padrão para transferência segura de arquivos em servidores modernos.

Arquitetura

O cliente SFTP abre uma conexão SSH, solicita o subsistema sftp (Subsystem sftp /usr/lib/openssh/sftp-server no sshd_config), e troca pacotes SFTP binários (versão, extensões, comandos). Múltiplas requisições podem ser pipelineadas em um único canal, evitando o overhead do SCP.

Cliente Interativo (sftp)

sftp user@host
sftp> ls                                  # Listar remoto
sftp> cd /var/log                         # Mudar diretório remoto
sftp> pwd                                 # Diretório atual remoto
sftp> get messages                        # Download
sftp> get -r /var/log /local/backup/      # Recursivo
sftp> put /local/arquivo.txt /remoto/     # Upload
sftp> rename arquivo.txt arquivo.bak
sftp> mkdir novo_dir; rm arquivo.tmp; rmdir vazio
sftp> symlink alvo link; stat arquivo.txt
sftp> lls; lcd /local                     # Operações locais
sftp> reget /remoto/grande.iso /local/    # Retomar download
sftp> reput /local/backup.tar /remoto/    # Retomar upload
sftp> help; quit

Operações Não-Interativas (Batch)

# Batch com arquivo de comandos
cat > /tmp/cmd.sftp <<EOF
cd /var/log
get messages /local/backup/
bye
EOF
sftp -b /tmp/cmd.sftp user@host

# Comando único direto (download/upload)
sftp user@host:/remoto/arquivo.txt /local/
sftp /local/arquivo.txt user@host:/remoto/

# Preservar atributos (perms, timestamps, owner)
sftp> put -P /local/arquivo /remoto/

4. Comparativo de Performance

Cenário SCP SFTP
1 arquivo grande Similar Similar (pouco melhor com pipelining)
1000 arquivos pequenos Lento (1 processo por arquivo) Rápido (1 canal, pipeline)
Latência alta (intercontinental) Muito lento Significativamente melhor
Retomada após queda Recria do zero Continua do offset
Compressão -C no SSH -C no SSH (igual)
Banda limitada -l (Kbit/s) Não nativo; usar trickle/curl

Em redes de alta latência (ex.: Brasil ↔ Europa, RTT 200ms), o SFTP pode ser 5-10x mais rápido que o SCP antigo para muitos arquivos pequenos, devido ao pipelining de comandos em um único canal.

5. Quando Usar Cada

Caso Recomendação Motivo
Cópia única e ad-hoc scp Sintaxe simples, comando único
Múltiplos arquivos sftp (batch) ou rsync Performance
Navegação remota sftp interativo Lista, cd, stat disponíveis
Script de automação sftp -b ou rsync Idempotente, logs
Sincronização incremental rsync over SSH Delta-sync, deleta/remove
Migração de servidor rsync Resume, verificação
Compatibilidade legada scp Servidores antigos sem sftp-server
Transferência Windows WinSCP (SFTP) GUI rica, fila

6. rsync — A Alternativa Superior

Para a maioria dos casos reais, rsync sobre SSH é superior a ambos. Suporta delta-transfer (apenas blocos alterados), sincronização bidirecional, exclusão de arquivos removidos, retomada, verificação de integridade e preservação completa de atributos. Usa SSH como transporte com -e ssh.

# Sincronizar (espelho) com delete e exclusões
rsync -avz --delete /local/dir/ user@host:/remoto/dir/

# Delta-sync (apenas diferenças) com retomada
rsync -avz --partial --progress /local/grande.iso user@host:/remoto/

# Excluir padrões e usar chave SSH específica
rsync -avz --exclude='*.tmp' --exclude='.git/' \
    -e "ssh -i ~/.ssh/chave_deploy" /local/ user@host:/remoto/

# Dry-run (simular antes de executar)
rsync -avzn /local/ user@host:/remoto/

7. Diagnóstico e Problemas Comuns

sftp -vvv user@host                                # Debug verbose
ssh user@host "grep -i subsystem /etc/ssh/sshd_config"  # Verificar subsistema
echo "ls /" | sftp -b - user@host                  # Testar SFTP sem interação
scp -v /local/arq user@host:/remoto/               # SCP com verbose
scp -s /local/arq user@host:/remoto/               # Forçar SFTP no scp (OpenSSH 9+)
scp -O /local/arq user@host:/remoto/               # Forçar SCP legado
Problema Causa Solução
subsystem request failed sftp-server não habilitado Adicionar Subsystem sftp internal-sftp
Permission denied após login Chroot sem permissões ChrootDirectory com root:root 755
scp lento em rede intercontinental Overhead por arquivo Usar sftp -r ou rsync
bash: scp: command not found scp ausente no servidor Instalar openssh-client
Connection closed após reget Servidor não suporta offset Verificar versão do sftp-server

8. Configuração no Servidor

# /etc/ssh/sshd_config
Subsystem sftp internal-sftp

# Chroot para usuarios SFTP-only (sem shell)
Match Group sftpusers
    ChrootDirectory /home/%u
    ForceCommand internal-sftp
    AllowTcpForwarding no
    X11Forwarding no
    PermitTunnel no

internal-sftp é compilado dentro do sshd (sem binário externo), mais seguro para ambientes chroot. O ChrootDirectory deve ser propriedade de root:root com permissão 755 (ou 750), sem escrita para o usuário — subdiretórios internos podem ser do usuário.

9. Boas Práticas

Prática Recomendação
Subsistema internal-sftp (sem binário externo)
Chroot Para usuários SFTP-only
Autenticação Chave SSH + passphrase (nunca senha)
Log LogLevel VERBOSE + sftp-server -l INFO
Limite de banda Match User com PermitTTY no, rate-limit via tc
Auditoria audit.log para comando SFTP (-a)
Backup rsync noturno com --link-dest para snapshots
Múltiplas sessões MaxSessions 10 (default)

10. Conclusão

SCP e SFTP coexistem historicamente, mas têm papéis distintos: SCP é uma relíquia de 1983 mantida por compatibilidade, enquanto SFTP é o protocolo moderno rico em operações. Desde OpenSSH 9.0 (2022), o scp usa internamente o protocolo SFTP, mantendo a CLI familiar mas eliminando as limitações do protocolo SCP legado. Para novos projetos, prefira sempre SFTP (cliente interativo ou batch) ou rsync sobre SSH, que oferecem melhor performance, operações ricas e capacidade de retomar transferências. SCP permanece útil apenas para comandos ad-hoc de arquivo único, especialmente em ambientes legados sem subsistema SFTP habilitado.