Como Solucionar Erros de Permissão Negada SFTP no Linux

LinuxBeginner
Pratique Agora

Introdução

SFTP (Secure File Transfer Protocol) é uma solução poderosa e segura para transferir arquivos através de uma rede. Este tutorial irá guiá-lo através da compreensão do SFTP, da solução de problemas de erros 'Permission Denied' (Permissão Negada) e da resolução de problemas de permissões SFTP no seu sistema Linux. Você aprenderá como configurar um servidor SFTP, criar usuários com as permissões apropriadas e diagnosticar problemas comuns de permissão que ocorrem durante as transferências de arquivos.

Este é um Lab Guiado, que fornece instruções passo a passo para ajudá-lo a aprender e praticar. Siga as instruções cuidadosamente para completar cada etapa e ganhar experiência prática. Dados históricos mostram que este é um laboratório de nível iniciante com uma taxa de conclusão de 88%. Recebeu uma taxa de avaliações positivas de 100% dos estudantes.

Configurando o Servidor SFTP no Ubuntu

SFTP (Secure File Transfer Protocol) fornece um método seguro para transferir arquivos entre sistemas. Diferente do FTP regular, o SFTP criptografa tanto os comandos quanto os dados durante a transmissão, protegendo suas informações contra acesso não autorizado.

Nesta etapa, configuraremos um servidor SFTP básico em nosso sistema Ubuntu.

Instalando o Servidor OpenSSH

Primeiro, vamos garantir que nosso sistema esteja atualizado e instalar o servidor OpenSSH, que inclui as capacidades SFTP:

sudo apt update
sudo apt install -y openssh-server

Após executar esses comandos, você deverá ver uma saída semelhante a:

Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
openssh-server is already the newest version (1:8.9p1-3ubuntu0.1).

Verificando o Status do Serviço SSH

Como estamos em um contêiner Docker, o comando systemctl padrão não funcionará. Vamos verificar se o serviço SSH está em execução usando o comando de status do processo:

ps aux | grep sshd

Você deve ver uma saída indicando que o sshd está em execução:

root      1234  0.0  0.1  12016  5604 ?        Ss   10:20   0:00 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups

Criando um Usuário de Teste para SFTP

Vamos criar um usuário dedicado para testar a funcionalidade SFTP:

sudo adduser sftpuser

Quando solicitado, insira uma senha simples como password123 e você pode pressionar Enter para pular os campos de informações adicionais do usuário. Você deve ver uma saída semelhante a:

Adding user `sftpuser' ...
Adding new group `sftpuser' (1001) ...
Adding new user `sftpuser' (1001) with group `sftpuser' ...
Creating home directory `/home/sftpuser' ...
Copying files from `/etc/skel' ...
New password:
Retype new password:
passwd: password updated successfully

Criando Arquivos de Teste para Transferência SFTP

Agora, vamos criar alguns arquivos de teste em nosso diretório home que usaremos para transferências SFTP:

cd ~/project
echo "This is a test file for SFTP transfers" > testfile.txt
echo "This file has different permissions" > restrictedfile.txt

Vamos verificar se os arquivos foram criados corretamente:

ls -l testfile.txt restrictedfile.txt

Você deve ver uma saída semelhante a:

-rw-rw-r-- 1 labex labex 37 Sep 28 10:30 restrictedfile.txt
-rw-rw-r-- 1 labex labex 38 Sep 28 10:30 testfile.txt

Por padrão, ambos os arquivos têm permissões de leitura e escrita para o proprietário e o grupo, e permissões de somente leitura para outros. Experimentaremos alterar essas permissões nas próximas etapas.

Compreendendo as Permissões de Arquivos e Seu Impacto no SFTP

Antes de explorarmos os problemas de permissão do SFTP, vamos entender o sistema de permissões de arquivos do Linux e como ele afeta as operações SFTP.

Noções Básicas de Permissões de Arquivos no Linux

No Linux, cada arquivo e diretório tem três tipos de permissões:

  • Leitura (r): Permite visualizar o conteúdo do arquivo ou listar o conteúdo do diretório
  • Escrita (w): Permite modificar arquivos ou criar/excluir arquivos em um diretório
  • Execução (x): Permite executar arquivos ou acessar um diretório

Essas permissões são atribuídas a três categorias de usuários:

  • Proprietário (Owner): O usuário que criou o arquivo
  • Grupo (Group): O grupo atribuído ao arquivo
  • Outros (Others): Todos os outros

Visualizando as Permissões Atuais

Vamos verificar as permissões atuais de nossos arquivos de teste:

ls -l ~/project/testfile.txt ~/project/restrictedfile.txt

Você verá uma saída semelhante a:

-rw-rw-r-- 1 labex labex 38 Sep 28 10:30 /home/labex/project/testfile.txt
-rw-rw-r-- 1 labex labex 37 Sep 28 10:30 /home/labex/project/restrictedfile.txt

A string de permissão -rw-rw-r-- pode ser dividida em:

  • O primeiro caractere - indica um arquivo regular (seria d para diretório)
  • Os três caracteres seguintes rw- mostram as permissões do proprietário (leitura, escrita, sem execução)
  • Os três caracteres seguintes rw- mostram as permissões do grupo (leitura, escrita, sem execução)
  • Os três últimos caracteres r-- mostram as permissões de outros (somente leitura)

Modificando as Permissões de Arquivos

Vamos modificar as permissões de nossos arquivos para criar cenários que podem levar a erros de permissão negada no SFTP:

## Make testfile.txt readable by everyone but writable only by owner
chmod 644 ~/project/testfile.txt

## Make restrictedfile.txt accessible only to the owner
chmod 600 ~/project/restrictedfile.txt

Agora, vamos verificar as alterações:

ls -l ~/project/testfile.txt ~/project/restrictedfile.txt

Você deve ver as permissões atualizadas:

-rw-r--r-- 1 labex labex 38 Sep 28 10:30 /home/labex/project/testfile.txt
-rw------- 1 labex labex 37 Sep 28 10:30 /home/labex/project/restrictedfile.txt

Configurando um Diretório para Testes SFTP

Vamos criar um diretório dedicado para testes SFTP:

mkdir -p ~/project/sftp_test
echo "This file is in the SFTP test directory" > ~/project/sftp_test/test_file.txt
chmod 755 ~/project/sftp_test

Agora, vamos criar um diretório com permissões restritas:

mkdir -p ~/project/restricted_sftp
echo "This file is in the restricted directory" > ~/project/restricted_sftp/restricted_file.txt
chmod 700 ~/project/restricted_sftp

Vamos verificar as permissões do diretório:

ls -ld ~/project/sftp_test ~/project/restricted_sftp

Você deve ver:

drwxr-xr-x 2 labex labex 4096 Sep 28 10:35 /home/labex/project/sftp_test
drwx------ 2 labex labex 4096 Sep 28 10:35 /home/labex/project/restricted_sftp

O diretório sftp_test pode ser acessado por qualquer pessoa, enquanto o diretório restricted_sftp só pode ser acessado pelo proprietário (usuário labex).

Experimentando e Diagnosticando Erros de Permissão Negada no SFTP

Nesta etapa, conectaremos ao nosso servidor SFTP e experimentaremos erros de permissão negada em primeira mão. Isso nos ajudará a entender como as configurações de permissão afetam as operações SFTP.

Conectando ao Servidor SFTP Localmente

Como estamos trabalhando em um ambiente local, podemos nos conectar ao nosso servidor SFTP usando o endereço localhost. Vamos nos conectar usando o sftpuser que criamos anteriormente:

sftp sftpuser@localhost

Quando solicitado a senha, insira a senha que você definiu para a conta sftpuser (por exemplo, password123). Se a conexão for bem-sucedida, você verá um prompt como:

Connected to localhost.
sftp>

Se você encontrar problemas de conexão, pode ser porque o serviço SSH não está sendo executado corretamente no contêiner. Você pode tentar sair com exit e prosseguir com as próximas etapas usando exemplos teóricos.

Comandos SFTP Básicos

Vamos explorar alguns comandos SFTP básicos:

  1. Visualize o diretório atual no servidor remoto:
sftp> pwd
Remote working directory: /home/sftpuser
  1. Liste os arquivos no diretório atual:
sftp> ls
  1. Navegue para um diretório diferente:
sftp> cd /tmp
sftp> pwd
Remote working directory: /tmp
  1. Retorne ao seu diretório home:
sftp> cd
sftp> pwd
Remote working directory: /home/sftpuser

Tentando Acessar Arquivos com Diferentes Permissões

Agora, vamos tentar acessar nossos arquivos de teste da sessão SFTP:

  1. Tente obter um arquivo do nosso diretório do projeto:
sftp> get /home/labex/project/testfile.txt
Fetching /home/labex/project/testfile.txt to testfile.txt
Permission denied

Você notará um erro "Permission denied". Isso ocorre porque o sftpuser não tem permissão para acessar arquivos no diretório home do usuário labex.

Sair da Sessão SFTP

Vamos sair da sessão SFTP para continuar:

sftp> exit

Compreendendo os Erros de Permissão Negada

Existem várias razões comuns para erros "Permission denied" no SFTP:

  1. Permissões de Arquivo: O usuário não tem acesso de leitura/escrita ao arquivo
  2. Permissões de Diretório: O usuário não pode acessar o diretório que contém o arquivo
  3. Problemas de Propriedade: O arquivo/diretório pertence a um usuário ou grupo diferente
  4. Restrições de Travessia de Caminho: A configuração do SFTP pode restringir os usuários a determinados diretórios

Vamos tornar um de nossos arquivos de teste acessível ao nosso usuário SFTP:

## Create a directory that can be accessed by others
mkdir -p /tmp/shared
echo "This is a shared file for SFTP testing" > /tmp/shared/shared_file.txt
chmod 777 /tmp/shared
chmod 666 /tmp/shared/shared_file.txt

Agora, reconecte-se ao SFTP e tente acessar este arquivo:

sftp sftpuser@localhost

Após a conexão, tente:

sftp> get /tmp/shared/shared_file.txt
Fetching /tmp/shared/shared_file.txt to shared_file.txt
/tmp/shared/shared_file.txt                        100%   36     1.0KB/s   00:00

Isso deve funcionar porque demos a todos permissões de leitura/escrita para o diretório e o arquivo.

Saia da sessão SFTP novamente:

sftp> exit

Usando SFTP com Modo de Depuração

Para obter mais informações sobre erros de permissão, você pode usar o SFTP no modo de depuração:

sftp -v sftpuser@localhost

A saída detalhada mostrará informações detalhadas sobre a conexão e quaisquer erros que ocorram:

debug1: Sending subsystem: sftp
debug1: client_input_channel_req: channel 0 rtype exit-status reply 0
debug1: channel 0: free: client-session, nchannels 1
Transferred: sent 2412, received 2876 bytes, in 0.1 seconds
Bytes per second: sent 30074.7, received 35857.2
debug1: Exit status 0

Resolvendo Erros de Permissão Negada no SFTP

Agora que entendemos como as permissões afetam o acesso SFTP, vamos aprender como resolver erros comuns de permissão negada.

Solução 1: Ajustando as Permissões de Arquivos e Diretórios

A solução mais direta para problemas de permissão é ajustar as permissões de arquivos e diretórios. Vamos criar um novo caso de teste:

## Create a new test file with restrictive permissions
echo "This file has restricted permissions" > ~/project/restricted_access.txt
chmod 600 ~/project/restricted_access.txt

Verifique as permissões atuais:

ls -l ~/project/restricted_access.txt

Saída:

-rw------- 1 labex labex 35 Sep 28 11:05 /home/labex/project/restricted_access.txt

Agora, vamos tornar este arquivo acessível a outros alterando suas permissões:

chmod 644 ~/project/restricted_access.txt
ls -l ~/project/restricted_access.txt

Saída:

-rw-r--r-- 1 labex labex 35 Sep 28 11:05 /home/labex/project/restricted_access.txt

Com essas permissões (644), o proprietário do arquivo (labex) pode ler e escrever no arquivo, enquanto os membros do grupo e outros só podem lê-lo.

Solução 2: Alterando a Propriedade do Arquivo

Outra solução é alterar a propriedade dos arquivos para corresponder ao usuário SFTP. Vamos criar outro arquivo de teste:

echo "This file will be owned by sftpuser" > ~/project/ownership_test.txt

Agora, vamos alterar a propriedade para nosso usuário SFTP:

sudo chown sftpuser:sftpuser ~/project/ownership_test.txt
ls -l ~/project/ownership_test.txt

Saída:

-rw-rw-r-- 1 sftpuser sftpuser 36 Sep 28 11:10 /home/labex/project/ownership_test.txt

Agora, o arquivo é de propriedade do sftpuser, que pode ler e escrever nele.

Solução 3: Criando um Diretório Compartilhado

Uma solução comum para o compartilhamento de arquivos SFTP é criar um diretório com as permissões apropriadas que vários usuários podem acessar:

## Create a new shared directory with appropriate permissions
mkdir -p /tmp/sftp_shared
sudo chown labex:labex /tmp/sftp_shared
chmod 755 /tmp/sftp_shared

## Create a subdirectory for uploads that's writable by everyone
mkdir -p /tmp/sftp_shared/uploads
chmod 777 /tmp/sftp_shared/uploads

## Create a sample file in the shared directory
echo "This file is in the shared SFTP directory" > /tmp/sftp_shared/sample.txt
chmod 644 /tmp/sftp_shared/sample.txt

Vamos verificar nossa configuração:

ls -la /tmp/sftp_shared/

Saída:

total 12
drwxr-xr-x 3 labex   labex   4096 Sep 28 11:15 .
drwxrwxrwt 4 root    root    4096 Sep 28 11:15 ..
-rw-r--r-- 1 labex   labex     39 Sep 28 11:15 sample.txt
drwxrwxrwx 2 labex   labex   4096 Sep 28 11:15 uploads

Com esta configuração:

  • O diretório principal é legível e executável por todos, mas somente gravável pelo proprietário
  • O subdiretório de uploads é gravável por todos (adequado para uploads SFTP)
  • O arquivo sample.txt é legível por todos, mas somente gravável pelo proprietário

Esta configuração permite que o usuário SFTP:

  • Navegue para o diretório compartilhado
  • Leia o arquivo de exemplo
  • Carregue arquivos no diretório de uploads

Solução 4: Usando ACLs para um Controle Mais Granular

Listas de Controle de Acesso (ACLs) fornecem um gerenciamento de permissões mais detalhado. Vamos instalar o pacote necessário e usar ACLs:

sudo apt install -y acl

Agora, vamos criar um arquivo e definir permissões específicas usando ACLs:

echo "This file uses ACLs for permissions" > ~/project/acl_test.txt

## Set basic permissions
chmod 640 ~/project/acl_test.txt

## Add ACL permission for sftpuser
sudo setfacl -m u:sftpuser:r ~/project/acl_test.txt

## View the ACL settings
getfacl ~/project/acl_test.txt

Saída:

## file: /home/labex/project/acl_test.txt
## owner: labex
## group: labex
user::rw-
user:sftpuser:r--
group::r--
mask::r--
other::---

Esta configuração de ACL permite:

  • O proprietário do arquivo (labex) ler e escrever
  • O sftpuser ler o arquivo
  • O grupo ler o arquivo
  • Outros não têm acesso

Melhores Práticas para Gerenciamento de Permissões SFTP

Nesta etapa final, abordaremos algumas melhores práticas para gerenciar permissões SFTP e solucionar problemas de permissão de forma eficaz.

Criando um Grupo de Usuários SFTP Dedicado

É uma boa prática criar um grupo dedicado para usuários SFTP:

sudo groupadd sftp_users
sudo usermod -a -G sftp_users sftpuser

Verifique se o usuário foi adicionado ao grupo:

groups sftpuser

Saída:

sftpuser : sftpuser sftp_users

Configurando um Diretório Gerenciado por Grupo

Agora, vamos criar um diretório que é gerenciado pelo grupo sftp_users:

## Create a new directory for the SFTP group
sudo mkdir -p /tmp/sftp_group_shared
sudo chown labex:sftp_users /tmp/sftp_group_shared
sudo chmod 770 /tmp/sftp_group_shared

## Set the SGID bit to ensure new files inherit the group
sudo chmod g+s /tmp/sftp_group_shared

## Create a test file in this directory
echo "This file is in the SFTP group directory" > /tmp/sftp_group_shared/group_file.txt

Vamos verificar as permissões:

ls -la /tmp/sftp_group_shared/

Saída:

total 12
drwxrws--- 2 labex    sftp_users 4096 Sep 28 11:25 .
drwxrwxrwt 5 root     root       4096 Sep 28 11:25 ..
-rw-rw-r-- 1 labex    sftp_users   42 Sep 28 11:25 group_file.txt

O s nas permissões do grupo indica que o bit SGID está definido, o que significa que novos arquivos criados neste diretório herdarão o grupo sftp_users.

Comandos Comuns de Solução de Problemas para Permissões SFTP

Ao solucionar problemas de permissão SFTP, esses comandos são particularmente úteis:

  1. Verifique as permissões do arquivo:
ls -la /path/to/file
  1. Verifique os grupos de usuários:
groups username
  1. Verifique os IDs de usuário e grupo atuais:
id
  1. Visualize os logs do servidor SFTP:
## In a production system, you would check system logs
## For our lab environment, we can simulate viewing logs
grep "sshd" /var/log/auth.log | tail
  1. Teste o acesso ao arquivo a partir da linha de comando:
sudo -u sftpuser cat /path/to/file

Árvore de Decisão de Erro de Permissão Negada

Ao encontrar um erro de permissão negada no SFTP, siga esta árvore de decisão:

  1. O usuário SFTP pode acessar o diretório pai?

    • Verifique com: sudo -u sftpuser ls -la /path/to/directory/
    • Corrija com: chmod o+x /path/to/directory/
  2. O usuário SFTP pode ler o arquivo?

    • Verifique com: sudo -u sftpuser cat /path/to/file
    • Corrija com: chmod o+r /path/to/file ou setfacl -m u:sftpuser:r /path/to/file
  3. O usuário SFTP pode escrever no arquivo ou diretório?

    • Verifique com: sudo -u sftpuser touch /path/to/directory/test_file
    • Corrija com: chmod o+w /path/to/directory/ ou setfacl -m u:sftpuser:w /path/to/directory/

Criando um Script de Teste para Permissões SFTP

Vamos criar um script de teste simples que verifica se o usuário SFTP pode acessar arquivos e diretórios específicos:

cat > ~/project/check_sftp_permissions.sh << 'EOF'
#!/bin/bash

USER="sftpuser"
echo "Testing SFTP permissions for user: $USER"
echo "-------------------------------------------"

## Test directories
for DIR in /tmp/shared /tmp/sftp_shared /tmp/sftp_group_shared /home/labex/project; do
  echo -n "Can $USER access $DIR? "
  if sudo -u $USER ls -la $DIR &>/dev/null; then
    echo "YES"
  else
    echo "NO"
  fi
done

## Test files
for FILE in /tmp/shared/shared_file.txt /tmp/sftp_shared/sample.txt /home/labex/project/testfile.txt; do
  echo -n "Can $USER read $FILE? "
  if sudo -u $USER cat $FILE &>/dev/null; then
    echo "YES"
  else
    echo "NO"
  fi
done

echo "-------------------------------------------"
echo "Testing complete!"
EOF

chmod +x ~/project/check_sftp_permissions.sh

Agora, execute o script de teste:

sudo ~/project/check_sftp_permissions.sh

Você deve ver a saída indicando quais diretórios e arquivos o usuário SFTP pode acessar. Isso ajuda a identificar problemas de permissão rapidamente.

Dicas Finais para Gerenciar Permissões SFTP

  1. Use o princípio do menor privilégio: Conceda apenas as permissões mínimas necessárias
  2. Audite regularmente as permissões: Use ferramentas como find para identificar arquivos com permissões inadequadas
  3. Documente sua estrutura de permissões: Acompanhe quais usuários e grupos têm acesso a quais diretórios
  4. Considere o uso de chroot jails SFTP: Para ambientes de produção, restrinja os usuários a diretórios específicos
  5. Teste da perspectiva do usuário: Sempre verifique as permissões testando como o usuário SFTP real

Resumo

Neste tutorial, você aprendeu como configurar um servidor SFTP, criar usuários com as permissões apropriadas e solucionar erros comuns de permissão negada. Você adquiriu experiência prática com:

  • Instalação e configuração de um servidor SFTP no Ubuntu
  • Compreensão das permissões de arquivos Linux e seu impacto no acesso SFTP
  • Experiência e diagnóstico de erros de permissão negada
  • Implementação de várias soluções para resolver problemas de permissão
  • Aplicação das melhores práticas para o gerenciamento de permissões SFTP

Essas habilidades o ajudarão a gerenciar transferências de arquivos de forma eficaz em um ambiente seguro, minimizando problemas relacionados a permissões. Lembre-se de que o gerenciamento adequado de permissões é essencial para manter um servidor SFTP seguro e funcional, equilibrando os requisitos de segurança com as necessidades de acesso do usuário.