Skip to content

Tudo para WordPress, desenvolvimento web — e não só

🔓 Como obter privilégios de root no WinSCP: configurar o sudo para transferências de ficheiros

🔓 Como obter privilégios de root no WinSCP: configurar o sudo para transferências de ficheiros

Liga-se a um servidor como utilizador normal, navega até /etc/nginx e recebe «Permission denied». Ficheiros de configuração, diretórios de sistema, logs: tudo isto está bloqueado para uma conta sem privilégios root. E o início de sessão direto como root via SSH está desativado na maioria dos servidores por razões de segurança.

O WinSCP é um gestor de ficheiros prático para Windows, mas, por predefinição, a sua sessão SFTP funciona com as permissões do utilizador com que iniciou sessão. O protocolo SFTP não pode solicitar elevação de privilégios «em tempo real» como um terminal: não é interativo durante o handshake e não pode exibir uma janela para introduzir a palavra-passe do sudo.

Abaixo estão quatro métodos funcionais para executar o WinSCP com privilégios de superutilizador, desde o mais simples até à abordagem «Jedi». Cada um foi testado em Ubuntu, Debian e CentOS. Escolha o que melhor se adapta à sua infraestrutura.

💡 Resumo rápido:

  • ➡️ Problema: O WinSCP não concede privilégios root por predefinição, mesmo que o utilizador tenha sudo.
  • Método principal: Substituir o comando de arranque do servidor SFTP nas definições do site do WinSCP. Rápido e direcionado.
  • 🔄 Alternativa: Mudar para o protocolo SCP com sudo su - como shell.
  • ⚙️ Avançado: Editar o sshd_config no servidor. Uma solução global para todas as ligações.

Passo 1: Comando de arranque do servidor SFTP (o método principal)

A forma mais comum e elegante de obter privilégios root no WinSCP é fazê-lo iniciar o servidor SFTP como superutilizador desde o início. Isto é feito substituindo o comando de arranque nas definições de uma ligação específica. O servidor em si não precisa de ser reconfigurado; a solução funciona por ligação.

Janela de configurações do servidor SFTP no WinSCP

Instruções passo a passo:

  • Inicie o WinSCP e abra o Gestor de Sites.
  • Selecione a ligação desejada e clique em Editar.
  • Clique em Avançadas… na parte inferior da janela.
  • No menu à esquerda, vá para Ambiente → SFTP.
  • No campo «Servidor SFTP», substitua «Predefinido» pelo seguinte comando:
1sudo /usr/lib/openssh/sftp-server

Para distribuições mais antigas, o caminho pode ser diferente. Localizações típicas do sftp-server:

Distribuição

Caminho para o sftp-server

Ubuntu / Debian (atual)

/usr/lib/openssh/sftp-server

Ubuntu / Debian (mais antigo)

/usr/lib/sftp-server

CentOS / RHEL / Fedora

/usr/libexec/openssh/sftp-server

Amazon Linux

/usr/libexec/openssh/sftp-server

Pode verificar o caminho exato no seu servidor via terminal: cat /etc/ssh/sshd_config | grep Subsystem. Este comando mostra qual o binário que o próprio servidor SSH utiliza.

O sistema iniciará o subsistema de transferência de ficheiros com privilégios root imediatamente. No entanto, para que isto funcione sem erro, o seu utilizador deve poder executar sudo sem solicitação de palavra-passe. Isso é abordado no próximo passo.


Passo 2: Configurar o sudoers (permitir sudo sem palavra-passe)

Como o handshake SFTP não é interativo, o WinSCP não tem como exibir uma janela para introduzir a palavra-passe do sudo. O servidor simplesmente terminará a ligação com um erro se for solicitada uma palavra-passe. A solução é conceder ao utilizador permissão para executar o comando necessário sem palavra-passe através do ficheiro /etc/sudoers.

A editar o ficheiro sudoers via visudo

O que fazer:

  • Ligue-se ao servidor via SSH (usando o PuTTY ou o terminal integrado do WinSCP).
  • Abra o editor de sudoers com sudo visudo. Nunca edite o /etc/sudoers diretamente: um erro de sintaxe bloqueará o sudo para todo o sistema, e o visudo valida a sintaxe antes de guardar.
  • Adicione a seguinte linha no final do ficheiro (substitua username pelo seu nome de utilizador):
1username ALL=(ALL) NOPASSWD: ALL

Isto concede ao utilizador acesso total sem palavra-passe. Uma opção mais segura é restringir a permissão apenas ao comando de arranque do servidor SFTP:

1username ALL=NOPASSWD: /usr/lib/openssh/sftp-server

Se o servidor tiver vários administradores com logins diferentes, uma configuração restrita reduz o risco: mesmo que uma conta seja comprometida, o atacante não terá acesso root a tudo, apenas a capacidade de iniciar o SFTP.

Nota: a opção requiretty no sudoers deve estar desativada. As implementações modernas de sudo-rs não a suportam por predefinição, mas em servidores mais antigos, verifique e comente a linha Defaults requiretty se existir.


Passo 3: Mudar para o protocolo SCP (uma alternativa rápida)

Se não quiser lidar com os caminhos para o sftp-server, pode mudar o próprio protocolo de transferência de dados. O WinSCP suporta SCP, um protocolo mais antigo mas fiável que adota mais facilmente as definições da shell.

Configurar protocolo SCP e shell no WinSCP

Como mudar:

  • Nas definições da sessão do WinSCP, altere Protocolo de ficheiros de SFTP para SCP.
  • Vá para Avançadas → SCP/Shell.
  • No campo Shell, introduza: sudo su -

Ao ligar-se, o WinSCP executará este comando imediatamente após o login e mudará a sessão para o modo root.

SFTP

SCP

Privilégios root

Substituindo o binário do servidor

Substituindo a shell (sudo su -)

Velocidade

Maior, especialmente com muitos ficheiros pequenos

Menor

Retomar após desconexão

Sim

Não

Fiabilidade em sistemas antigos

Requer caminho exato para o binário

Funciona «out of the box»

Segurança

NOPASSWD pode ser limitado a um comando

Requer sudo sem palavra-passe total

O método SCP é um compromisso. É mais fácil de configurar, mas perde para o SFTP em velocidade e capacidade de recuperação após uma desconexão. Para edições pontuais de configuração, a diferença é insignificante. Para transferir regularmente centenas de ficheiros, é melhor configurar o método SFTP.


Passo 4: Configuração global do sshd_config (para utilizadores avançados)

Este método é para administradores que desejam configurar o comportamento do servidor SSH centralmente. A ideia: substituir a linha Subsystem sftp no /etc/ssh/sshd_config por uma construção lógica que determina automaticamente se o utilizador pode executar sudo sem palavra-passe e inicia o SFTP com os privilégios apropriados.

O que alterar:

Linha antiga (tipicamente):

1Subsystem sftp /usr/lib/openssh/sftp-server

Linha nova:

1Subsystem sftp sudo -n true && sudo -n /usr/lib/openssh/sftp-server || /usr/lib/openssh/sftp-server

Como funciona:

  • sudo -n true verifica se o utilizador pode executar sudo sem palavra-passe (a flag -n significa não interativo).
  • Se sim (&&), o servidor inicia com privilégios root.
  • Se não (||), o servidor inicia com privilégios de utilizador normal.

Após editar, reinicie o serviço SSH: sudo systemctl restart sshd.

Importante: um erro de sintaxe neste ficheiro irá bloqueá-lo completamente fora do servidor via SSH. Antes de editar, certifique-se de que tem um segundo terminal com uma sessão ativa. Se algo correr mal, poderá reverter as alterações. Faça também uma cópia de segurança: cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak.


Especificidades de servidores cloud (AWS EC2, DigitalOcean)

As imagens Linux na cloud têm frequentemente definições de sudoers pré-configuradas que podem simplificar ou complicar a tarefa.

Configurações sudo do cloud-init no AWS EC2

AWS EC2 (Ubuntu):

O utilizador ubuntu em imagens Ubuntu 18.04 e mais recentes já tem frequentemente as permissões necessárias. Verifique o ficheiro /etc/sudoers.d/90-cloud-init-users, que pode já conter a linha:

1ubuntu ALL=(ALL) NOPASSWD:ALL

Se estiver lá, pode saltar o passo 2. Nas definições do WinSCP, use o comando sudo /usr/lib/openssh/sftp-server.

AWS EC2 (Amazon Linux):

No Amazon Linux, o caminho para o sftp-server é diferente: /usr/libexec/openssh/sftp-server. Um erro de uma letra (lib em vez de libexec) resultará no código de erro 127 (Command not found) e numa queda imediata da ligação.

DigitalOcean (Ubuntu Droplets):

Nos droplets padrão da DigitalOcean, o utilizador root está ativado por predefinição, mas o acesso é apenas por chave SSH. Se criou um utilizador separado, a configuração do sudoers é a mesma que para o Ubuntu normal.

Conselho geral para cloud: antes de introduzir um caminho no WinSCP, verifique se o ficheiro existe no servidor: ls -la /usr/lib/openssh/sftp-server (ou o equivalente para a sua distribuição).


⁉️🤔 Perguntas frequentes

Preciso de ativar o login direto como root para o WinSCP funcionar com sudo?

Não. O objetivo dos métodos descritos é usar uma conta normal e elevar temporariamente os privilégios via sudo. O login direto como root (PermitRootLogin yes) é considerado uma má prática de segurança: os logs não mostrarão qual o administrador que realmente executou uma ação.

Por que razão o WinSCP mostra um erro «Command not found» após a configuração?

Muito provavelmente, o caminho para o sftp-server está incorreto. Em diferentes distribuições, está localizado em /usr/lib/, /usr/lib/openssh/ ou /usr/libexec/openssh/. O caminho exato pode ser verificado com o comando cat /etc/ssh/sshd_config | grep Subsystem no servidor.

Quão seguro é o NOPASSWD no sudoers?

É um compromisso. O acesso total com ALL=(ALL) NOPASSWD:ALL reduz a proteção: se um atacante obtiver acesso ao utilizador, também obtém root. Restringir a um comando específico (/usr/lib/openssh/sftp-server) é significativamente mais seguro: um intruso não poderá executar nada além do servidor SFTP através desta conta.

Isto funciona com outros clientes como o FileZilla ou o Cyberduck?

O princípio é o mesmo, mas a configuração difere. O FileZilla não tem um campo conveniente para o comando do servidor SFTP na sua interface gráfica; é necessário editar o ficheiro de configuração. O Cyberduck suporta a opção «SFTP Server» nas definições de ligação, semelhante ao WinSCP. O WinSCP ganha em conveniência especificamente neste cenário.

O que devo fazer se os ficheiros estão visíveis mas não são editáveis?

Verifique o proprietário e as permissões com ls -la no servidor. Se configurou o servidor SFTP via sudo, mas a ligação reverteu para permissões normais, significa que o sudo solicitou uma palavra-passe e não recebeu resposta. Volte a verificar a configuração NOPASSWD do passo 2.

Posso simplesmente mudar o proprietário dos ficheiros de sistema para o meu utilizador?

Esta é uma solução de recurso «suja». Os serviços do sistema esperam que as suas configurações pertençam ao root. Alterar o proprietário (chown) ou as permissões (chmod) em ficheiros de sistema pode quebrar serviços. É melhor gastar cinco minutos a configurar o sudo e fazer as coisas corretamente.

Qual é a diferença entre SCP e SFTP no contexto do sudo?

O SCP é simplesmente cópia sobre SSH: adota mais facilmente a shell, pelo que para ele o comando sudo su - no campo Shell é suficiente. O SFTP é um subsistema completo que é executado como um processo separado: requer o truque de substituição do binário. O SFTP é mais rápido e rico em funcionalidades; o SCP é mais fácil de configurar.

As ações são visíveis nos logs ao usar o sudo através do WinSCP?

Sim. Em /var/log/auth.log haverá uma entrada mostrando que o utilizador username elevou privilégios via sudo. Isto é uma vantagem: se houver vários administradores, os logs mostram exatamente quem realizou a operação. Com o login direto como root, não existe essa transparência.

O que devo fazer se o sudo exigir TTY mas o WinSCP não fornecer um?

Verifique o /etc/sudoers para a opção Defaults requiretty. Se existir, comente-a (adicione # no início da linha) ou desative-a para um utilizador específico: Defaults:username !requiretty. As implementações modernas de sudo-rs não suportam esta opção; o problema é apenas relevante para servidores mais antigos.

Posso executar o SFTP como um utilizador diferente em vez de root?

Sim. O comando sudo -u www-data /usr/lib/openssh/sftp-server iniciará a sessão como www-data. Isto é conveniente quando precisa de editar ficheiros de um site sem tocar nos diretórios do sistema. As permissões do sudoers para isto devem incluir a opção -u: username ALL=(www-data) NOPASSWD: /usr/lib/openssh/sftp-server.


Veredito final: qual o método a escolher

Para o trabalho diário com o servidor, o primeiro método é o ideal: substituir o comando do servidor SFTP combinado com uma configuração NOPASSWD restrita apenas ao sftp-server. É seguro, não afeta as definições globais e funciona em todas as distribuições modernas.

  • Se tem Ubuntu / Debian e está disposto a gastar 5 minutos na configuração, use o Passo 1 + Passo 2 e nunca mais volte a este problema.
  • Se o servidor é antigo e o caminho para o sftp-server não pode ser encontrado, mude para SCP (Passo 3): tolera imprecisões e funciona praticamente em todo o lado.
  • Se administra uma dúzia de servidores e quer um padrão unificado, configure o sshd_config (Passo 4) uma vez via Ansible ou manualmente, mas definitivamente com uma cópia de segurança.

Comece com uma verificação: inicie sessão no servidor via SSH e execute cat /etc/ssh/sshd_config | grep Subsystem. Num minuto saberá o caminho exato, e o primeiro método funcionará à primeira tentativa. Que método de transferência de ficheiros utiliza? Partilhe nos comentários.