Como habilitar o SFTP sem acesso ao Shell no Ubuntu

Tecnologia infraestrutura e desenvolvimento

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ãoAllowTcpForwarding não. e X11Forwarding 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.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *