Como habilitar o SFTP sem acesso ao Shell no Ubuntu
Introdução
FTP (File Transfer Protocol), embora seja amplamente suportado por clientes FTP modernos.
O SFTP está disponível por padrão sem nenhuma configuração adicional em todos os servidores com acesso SSH ativado. É seguro e fácil de usar, mas vem com uma desvantagem: em uma configuração padrão, o servidor SSH concede acesso de transferência de arquivos e acesso de shell de terminal a todos os usuários com uma conta no sistema.
Em alguns casos, você pode querer que apenas determinados usuários tenham permissão para transferências de arquivos e nenhum acesso SSH. Neste tutorial, configuraremos o daemon SSH para limitar o acesso SFTP a um diretório sem acesso SSH permitido por usuário.
Pré-requisitos
Para seguir este tutorial, você precisará de:
- Um servidor Ubuntu 16.04 configurado com este tutorial de configuração inicial do servidor, incluindo um usuário sudo não root e um firewall.
Etapa 1 — Criando um novo usuário
Primeiro, crie um novo usuário que receberá apenas acesso de transferência de arquivos ao servidor. Aqui, estamos usando o nome de usuário sammyfiles, mas você pode usar qualquer nome de usuário que desejar.
sudo adduser sammyfiles
Você será solicitado a criar uma senha para a conta, seguida de algumas informações sobre o usuário. As informações do usuário são opcionais, então você pode pressionar ENTER
para deixar esses campos em branco.
Agora você criou um novo usuário que terá acesso ao diretório restrito. Na próxima etapa, criaremos o diretório para transferência de arquivos e configuraremos as permissões necessárias.
Etapa 2 — Criando um diretório para transferências de arquivos
Para restringir o acesso SFTP a um diretório, primeiro precisamos garantir que o diretório esteja em conformidade com os requisitos de permissão do servidor SSH, que são muito específicos.
Especificamente, o próprio diretório e todos os diretórios acima dele na árvore do sistema de arquivos devem pertencer ao root e não podem ser escritos por mais ninguém. Conseqüentemente, não é possível simplesmente conceder acesso restrito ao diretório inicial de um usuário porque os diretórios pessoais pertencem ao usuário, não ao root.
Nota: Algumas versões do OpenSSH não possuem requisitos tão rígidos para a estrutura e propriedade do diretório, mas a maioria das distribuições Linux modernas (incluindo o Ubuntu 16.04) possuem.
Há várias maneiras de contornar esse problema de propriedade. Neste tutorial, criaremos e usaremos /var/sftp/uploads
como o diretório de upload de destino. /var/sftp
pertencerá ao root e não poderá ser escrito por outros usuários; o subdiretório /var/sftp/uploads
será propriedade de sammyfiles, para que o usuário possa enviar arquivos para ele.
Primeiro, crie os diretórios.
sudo mkdir -p /var/sftp/uploads
Defina o proprietário de /var/sftp
como root.
sudo chown root:root /var/sftp
Conceda permissões de gravação raiz para o mesmo diretório e conceda a outros usuários apenas direitos de leitura e execução.
sudo chmod 755 /var/sftp
Altere a propriedade no diretório uploads
para sammyfiles.
sudo chown sammyfiles:sammyfiles /var/sftp/uploads
Agora que a estrutura de diretórios está pronta, podemos configurar o próprio servidor SSH.
Etapa 3 — Restringindo o acesso a um diretório
Nesta etapa, modificaremos a configuração do servidor SSH para não permitir o acesso ao terminal para sammyfiles, mas permitir o acesso à transferência de arquivos.
Abra o arquivo de configuração do servidor SSH usando nano
ou seu editor de texto favorito.
sudo nano /etc/ssh/sshd_config
Role até o final do arquivo e anexe o seguinte trecho de configuração:
. . .
Match User sammyfiles
ForceCommand internal-sftp
PasswordAuthentication yes
ChrootDirectory /var/sftp
PermitTunnel no
AllowAgentForwarding no
AllowTcpForwarding no
X11Forwarding no
Em seguida, salve e feche o arquivo.
Veja o que cada uma dessas diretivas faz:
Match User
diz ao servidor SSH para aplicar os seguintes comandos apenas ao usuário especificado. Aqui, especificamos sammyfiles.ForceCommand internal-sftp
força o servidor SSH a executar o servidor SFTP no login, impedindo o acesso ao shell.PasswordAuthentication yes
permite autenticação de senha para este usuário.ChrootDirectory /var/sftp/
garante que o usuário não terá acesso a nada além do diretório/var/sftp
. Você pode aprender mais sobre o chroot neste tutorial do chroot.AllowAgentForwarding não
,AllowTcpForwarding não
. eX11Forwarding no
desabilita o encaminhamento de porta, tunelamento e encaminhamento X11 para este usuário.
Este conjunto de comandos, começando com Match User
, também pode ser copiado e repetido para diferentes usuários. Certifique-se de modificar o nome de usuário na linha Match User
de acordo.
Observação: você pode omitir a linha PasswordAuthentication yes
e, em vez disso, configurar o acesso à chave SSH para aumentar a segurança. Siga a seção Copiando sua chave SSH pública do tutorial SSH Essentials: Working with SSH Servers, Clients, and Keys para fazer isso. Certifique-se de fazer isso antes de desativar o acesso ao shell para o usuário.
Na próxima etapa, testaremos a configuração por SSH localmente com acesso por senha, mas se você configurar chaves SSH, precisará acessar um computador com o par de chaves do usuário.
Para aplicar as alterações de configuração, reinicie o serviço.
sudo systemctl restart sshd
Agora você configurou o servidor SSH para restringir o acesso à transferência de arquivos apenas para sammyfiles. A última etapa é testar a configuração para garantir que ela funcione conforme o esperado.
Etapa 4 — Verificando a configuração
Vamos garantir que nosso novo usuário sammyfiles só possa transferir arquivos.
Fazer login no servidor como sammyfiles usando o acesso shell normal não deve mais ser possível. Vamos tentar:
ssh sammyfiles@localhost
Você verá a seguinte mensagem antes de retornar ao prompt original:
Error messageThis service allows sftp connections only.
Connection to localhost closed.
Isso significa que sammyfiles não podem mais acessar o shell do servidor usando SSH.
Em seguida, vamos verificar se o usuário pode acessar o SFTP com sucesso para transferência de arquivos.
sftp sammyfiles@localhost
Em vez de uma mensagem de erro, este comando mostrará uma mensagem de login bem-sucedida com um prompt interativo.
SFTP promptConnected to localhost.
sftp>
Você pode listar o conteúdo do diretório usando ls
no prompt:
ls
Isso mostrará o diretório uploads
que foi criado na etapa anterior e retornará ao prompt sftp>
.
SFTP file list outputuploads
Para verificar se o usuário está realmente restrito a este diretório e não pode acessar nenhum diretório acima dele, você pode tentar alterar o diretório para o que está acima dele.
cd ..
Este comando não dará erro, mas listar o conteúdo do diretório como antes não mostrará nenhuma alteração, provando que o usuário não conseguiu alternar para o diretório pai.
Agora você verificou que a configuração restrita funciona conforme o esperado. O usuário sammyfiles recém-criado pode acessar o servidor usando apenas o protocolo SFTP para transferência de arquivos e não tem capacidade de acessar o shell completo.
Conclusão
Você restringiu um usuário ao acesso somente SFTP a um único diretório em um servidor sem acesso total ao shell. Embora este tutorial use apenas um diretório e um usuário para brevidade, você pode estender este exemplo para vários usuários e vários diretórios.
O servidor SSH permite esquemas de configuração mais complexos, incluindo acesso limitado a grupos ou vários usuários ao mesmo tempo ou acesso limitado a determinados endereços IP. Você pode encontrar exemplos de opções de configuração adicionais e explicações de possíveis diretivas na série SSH de solução de problemas.