Como limitar um usuário SFTP a um único diretório?
Use ChrootDirectory do OpenSSH com seu servidor SFTP interno em um servidor que
você administra. A conta restrita vê o diretório atribuído a ela como
/, enquanto um subdiretório separado permanece gravável para uploads.
Isso não dá à conta acesso a um shell nem a encaminhamento.
O exemplo a seguir, para Linux, pressupõe uma conta dedicada já existente chamada
transloadit, um grupo primário chamado transloadit e um
diretório pessoal em /home/transloadit. Primeiro, verifique se essa conta consegue
fazer login com sua chave SSH de acordo com a política de autenticação existente. Não use uma
conta de administrador. Não altere o diretório pessoal da conta restrita para
/.
Mantenha uma sessão de administrador aberta enquanto altera as configurações do SSH e garanta que você tenha outra forma de acessar o servidor caso a nova configuração seja rejeitada.
Prepare os diretórios
Crie a raiz restrita, uma cópia vazia do caminho do diretório pessoal da conta dentro dela e o diretório de upload. O SSH ainda lê as chaves autorizadas existentes da conta antes de entrar no sistema de arquivos restrito; não copie chaves privadas para ele.
sudo install -d -o root -g root -m 755 /srv/sftp/transloadit
sudo install -d -o root -g root -m 755 /srv/sftp/transloadit/home/transloadit
sudo install -d -o transloadit -g transloadit -m 750 /srv/sftp/transloadit/uploads
Cada componente de /srv/sftp/transloadit, incluindo /srv e
/srv/sftp, deve pertencer ao root e não deve permitir gravação por outros
usuários ou grupos. Apenas o subdiretório uploads pertence à conta
restrita. Não permita gravação na raiz restrita para corrigir um erro de upload.
Restrinja a conta
Em /etc/ssh/sshd_config, substitua a linha Subsystem sftp existente
pela linha a seguir. Mantenha-a na seção global, antes de qualquer bloco
Match; não adicione uma segunda declaração do subsistema SFTP.
Subsystem sftp internal-sftp
Adicione este bloco específico da conta ao final da configuração:
Match User transloadit
ChrootDirectory /srv/sftp/%u
ForceCommand internal-sftp -d /uploads
DisableForwarding yes
PermitTunnel no
PermitTTY no
ForceCommand inicia o SFTP em /uploads em vez de aceitar
comandos de shell. DisableForwarding também bloqueia o encaminhamento SSH, o que
um comando SFTP forçado, por si só, não impede. Os requisitos de autenticação existentes da
conta continuam em vigor. Adapte o nome da conta e o caminho do diretório pessoal se os seus
forem diferentes e revise quaisquer regras anteriores que se apliquem à conta ou arquivos de
configuração incluídos.
Valide antes de recarregar
Verifique a sintaxe e a configuração efetiva da conta restrita:
sudo sshd -t
sudo sshd -T -C user=transloadit,host=localhost,addr=127.0.0.1
No segundo comando, use o endereço e o nome de host reais do cliente quando sua configuração
contiver regras específicas de endereço ou de host. Confirme que as configurações efetivas
incluem os valores pretendidos para chrootdirectory,
forcecommand, disableforwarding yes, permittunnel no e
permittty no. DisableForwarding prevalece sobre as opções
individuais de encaminhamento que ainda podem aparecer ativadas nessa saída. Não recarregue
uma configuração que falhe na validação. Use o comando para recarregar o serviço SSH indicado
na documentação do seu sistema operacional e, em seguida, verifique tanto uma nova conexão de
administrador quanto uma nova conexão SFTP antes de fechar a sessão original.
A partir do seu cliente, conecte-se com sftp transloadit@your-server.example e verifique o diretório:
sftp> pwd
Remote working directory: /uploads
sftp> cd /
sftp> pwd
Remote working directory: /
sftp> cd ..
sftp> pwd
Remote working directory: /
Faça upload de um arquivo de teste inofensivo para /uploads e baixe-o
novamente. A criação de um arquivo diretamente em / deve falhar.
Verifique também se um comando de shell e o encaminhamento de portas são rejeitados. O caminho
SFTP /uploads se refere a /srv/sftp/transloadit/uploads no servidor,
não ao diretório /uploads do próprio servidor.
Use a conta com /sftp/import ou /sftp/store, seguindo a documentação de autenticação e caminhos do Robot. Um chroot restringe o acesso ao sistema de arquivos; ele não substitui a autenticação da conta, as permissões do sistema de arquivos nem a política de rede. Consulte o manual de configuração do OpenSSH para conhecer toda a semântica das diretivas e a documentação da sua distribuição para saber como gerenciar o serviço.