Как устранить ошибки SFTP Permission Denied в Linux

LinuxBeginner
Практиковаться сейчас

Введение

SFTP (Secure File Transfer Protocol) — это мощное и безопасное решение для передачи файлов по сети. Этот учебник проведет вас через понимание SFTP, устранение неполадок с ошибками 'Permission Denied' (Отказано в доступе) и решение проблем с разрешениями SFTP в вашей системе Linux. Вы узнаете, как настроить SFTP-сервер, создать пользователей с соответствующими разрешениями и диагностировать распространенные проблемы с разрешениями, возникающие во время передачи файлов.

Настройка SFTP-сервера на Ubuntu

SFTP (Secure File Transfer Protocol) предоставляет безопасный метод передачи файлов между системами. В отличие от обычного FTP, SFTP шифрует как команды, так и данные во время передачи, защищая вашу информацию от несанкционированного доступа.

В этом шаге мы настроим базовый SFTP-сервер в нашей системе Ubuntu.

Установка OpenSSH Server

Во-первых, убедимся, что наша система обновлена, и установим OpenSSH server, который включает в себя возможности SFTP:

sudo apt update
sudo apt install -y openssh-server

После выполнения этих команд вы должны увидеть вывод, аналогичный следующему:

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

Проверка статуса службы SSH

Поскольку мы находимся в контейнере Docker, стандартная команда systemctl не будет работать. Давайте проверим, запущена ли служба SSH, используя команду status процесса:

ps aux | grep sshd

Вы должны увидеть вывод, указывающий на то, что sshd запущен:

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

Создание тестового пользователя для SFTP

Давайте создадим выделенного пользователя для тестирования функциональности SFTP:

sudo adduser sftpuser

При появлении запроса введите простой пароль, например password123, и вы можете нажать Enter, чтобы пропустить дополнительные поля информации о пользователе. Вы должны увидеть вывод, аналогичный следующему:

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

Создание тестовых файлов для передачи по SFTP

Теперь давайте создадим несколько тестовых файлов в нашем домашнем каталоге, которые мы будем использовать для передачи по SFTP:

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

Давайте проверим, что файлы были созданы правильно:

ls -l testfile.txt restrictedfile.txt

Вы должны увидеть вывод, аналогичный следующему:

-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

По умолчанию оба файла имеют разрешения на чтение и запись для владельца и группы, а также разрешения только на чтение для остальных. Мы поэкспериментируем с изменением этих разрешений в следующих шагах.

Понимание разрешений на файлы и их влияние на SFTP

Прежде чем мы рассмотрим проблемы с разрешениями SFTP, давайте разберемся с системой разрешений на файлы Linux и тем, как она влияет на операции SFTP.

Основы разрешений на файлы Linux

В Linux каждый файл и каталог имеет три типа разрешений:

  • Read (r) (Чтение): Разрешает просмотр содержимого файла или вывод содержимого каталога
  • Write (w) (Запись): Разрешает изменение файлов или создание/удаление файлов в каталоге
  • Execute (x) (Выполнение): Разрешает выполнение файлов или доступ к каталогу

Эти разрешения назначаются трем категориям пользователей:

  • Owner (Владелец): Пользователь, создавший файл
  • Group (Группа): Группа, назначенная файлу
  • Others (Остальные): Все остальные

Просмотр текущих разрешений

Давайте проверим текущие разрешения наших тестовых файлов:

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

Вы увидите вывод, аналогичный следующему:

-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

Строка разрешений -rw-rw-r-- может быть разбита следующим образом:

  • Первый символ - указывает на обычный файл (для каталога будет d)
  • Следующие три символа rw- показывают разрешения владельца (чтение, запись, нет выполнения)
  • Следующие три символа rw- показывают разрешения группы (чтение, запись, нет выполнения)
  • Последние три символа r-- показывают разрешения для остальных (только чтение)

Изменение разрешений на файлы

Давайте изменим разрешения наших файлов, чтобы создать сценарии, которые могут привести к ошибкам "Permission denied" (Отказано в доступе) в 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

Теперь давайте проверим изменения:

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

Вы должны увидеть обновленные разрешения:

-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

Настройка каталога для тестов SFTP

Давайте создадим выделенный каталог для тестирования 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

Теперь давайте создадим каталог с ограниченными разрешениями:

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

Давайте проверим разрешения каталога:

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

Вы должны увидеть:

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

К каталогу sftp_test может получить доступ любой пользователь, в то время как к каталогу restricted_sftp может получить доступ только владелец (пользователь labex).

Знакомство с ошибками "Permission Denied" (Отказано в доступе) в SFTP и их диагностика

На этом шаге мы подключимся к нашему SFTP-серверу и на собственном опыте столкнемся с ошибками "Permission denied" (Отказано в доступе). Это поможет нам понять, как настройки разрешений влияют на операции SFTP.

Подключение к SFTP-серверу локально

Поскольку мы работаем в локальной среде, мы можем подключиться к нашему SFTP-серверу, используя адрес localhost. Давайте подключимся, используя sftpuser, которого мы создали ранее:

sftp sftpuser@localhost

При появлении запроса на ввод пароля введите пароль, который вы установили для учетной записи sftpuser (например, password123). Если подключение успешно, вы увидите приглашение, подобное следующему:

Connected to localhost.
sftp>

Если у вас возникнут проблемы с подключением, это может быть связано с тем, что служба SSH работает некорректно в контейнере. Вы можете попробовать выйти с помощью exit и продолжить следующие шаги, используя теоретические примеры.

Основные команды SFTP

Давайте рассмотрим некоторые основные команды SFTP:

  1. Просмотр текущего каталога на удаленном сервере:
sftp> pwd
Remote working directory: /home/sftpuser
  1. Вывод списка файлов в текущем каталоге:
sftp> ls
  1. Переход в другой каталог:
sftp> cd /tmp
sftp> pwd
Remote working directory: /tmp
  1. Возврат в ваш домашний каталог:
sftp> cd
sftp> pwd
Remote working directory: /home/sftpuser

Попытка доступа к файлам с разными разрешениями

Теперь давайте попробуем получить доступ к нашим тестовым файлам из сеанса SFTP:

  1. Попытайтесь получить файл из нашего каталога project:
sftp> get /home/labex/project/testfile.txt
Fetching /home/labex/project/testfile.txt to testfile.txt
Permission denied

Вы заметите ошибку "Permission denied" (Отказано в доступе). Это связано с тем, что у sftpuser нет разрешения на доступ к файлам в домашнем каталоге пользователя labex.

Выход из сеанса SFTP

Давайте выйдем из сеанса SFTP, чтобы продолжить:

sftp> exit

Понимание ошибок "Permission Denied" (Отказано в доступе)

Существует несколько распространенных причин для ошибок "Permission denied" (Отказано в доступе) в SFTP:

  1. File Permissions (Разрешения на файлы): У пользователя нет доступа на чтение/запись к файлу
  2. Directory Permissions (Разрешения на каталоги): Пользователь не может получить доступ к каталогу, содержащему файл
  3. Ownership Issues (Проблемы с владельцем): Файл/каталог принадлежит другому пользователю или группе
  4. Path Traversal Restrictions (Ограничения на обход пути): Конфигурация SFTP может ограничивать пользователей определенными каталогами

Давайте сделаем один из наших тестовых файлов доступным для нашего пользователя 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

Теперь переподключитесь к SFTP и попробуйте получить доступ к этому файлу:

sftp sftpuser@localhost

После подключения попробуйте:

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

Это должно сработать, потому что мы предоставили всем разрешения на чтение/запись как для каталога, так и для файла.

Выйдите из сеанса SFTP снова:

sftp> exit

Использование SFTP в режиме отладки

Чтобы получить больше информации об ошибках разрешений, вы можете использовать SFTP в режиме отладки:

sftp -v sftpuser@localhost

Подробный вывод покажет вам подробную информацию о подключении и любых возникающих ошибках:

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

Решение проблем с ошибками "Permission Denied" (Отказано в доступе) в SFTP

Теперь, когда мы понимаем, как разрешения влияют на доступ к SFTP, давайте узнаем, как решить распространенные ошибки "Permission denied" (Отказано в доступе).

Решение 1: Настройка разрешений на файлы и каталоги

Самым простым решением проблем с разрешениями является настройка разрешений на файлы и каталоги. Давайте создадим новый тестовый случай:

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

Проверьте текущие разрешения:

ls -l ~/project/restricted_access.txt

Вывод:

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

Теперь давайте сделаем этот файл доступным для других, изменив его разрешения:

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

Вывод:

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

С этими разрешениями (644) владелец файла (labex) может читать и записывать файл, в то время как члены группы и другие могут только читать его.

Решение 2: Изменение владельца файла

Другим решением является изменение владельца файлов в соответствии с пользователем SFTP. Давайте создадим еще один тестовый файл:

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

Теперь давайте изменим владельца на нашего пользователя SFTP:

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

Вывод:

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

Теперь файл принадлежит sftpuser, который может читать и записывать его.

Решение 3: Создание общего каталога

Общим решением для совместного использования файлов SFTP является создание каталога с соответствующими разрешениями, к которому могут получить доступ несколько пользователей:

## 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

Давайте проверим нашу настройку:

ls -la /tmp/sftp_shared/

Вывод:

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

С этой настройкой:

  • Основной каталог доступен для чтения и выполнения для всех, но доступен для записи только владельцу
  • Подкаталог uploads доступен для записи для всех (подходит для загрузок SFTP)
  • Файл sample.txt доступен для чтения для всех, но доступен для записи только владельцу

Эта конфигурация позволяет пользователю SFTP:

  • Переходить в общий каталог
  • Читать образец файла
  • Загружать файлы в каталог uploads

Решение 4: Использование ACL для более детального контроля

Списки управления доступом (ACL, Access Control Lists) обеспечивают более детальное управление разрешениями. Давайте установим необходимый пакет и используем ACL:

sudo apt install -y acl

Теперь давайте создадим файл и установим определенные разрешения с помощью ACL:

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

Вывод:

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

Эта конфигурация ACL позволяет:

  • Владельцу файла (labex) читать и записывать
  • sftpuser читать файл
  • Группе читать файл
  • Остальным не иметь доступа

Лучшие практики управления разрешениями SFTP

На этом заключительном шаге мы рассмотрим некоторые лучшие практики управления разрешениями SFTP и эффективного устранения проблем с разрешениями.

Создание выделенной группы пользователей SFTP

Хорошей практикой является создание выделенной группы для пользователей SFTP:

sudo groupadd sftp_users
sudo usermod -a -G sftp_users sftpuser

Убедитесь, что пользователь был добавлен в группу:

groups sftpuser

Вывод:

sftpuser : sftpuser sftp_users

Настройка каталога, управляемого группой

Теперь давайте создадим каталог, управляемый группой 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

Давайте проверим разрешения:

ls -la /tmp/sftp_group_shared/

Вывод:

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

s в разрешениях группы указывает на установленный бит SGID, что означает, что новые файлы, созданные в этом каталоге, унаследуют группу sftp_users.

Общие команды для устранения неполадок с разрешениями SFTP

При устранении неполадок с разрешениями SFTP эти команды особенно полезны:

  1. Проверка разрешений на файлы:
ls -la /path/to/file
  1. Проверка групп пользователей:
groups username
  1. Проверка текущих идентификаторов пользователя и группы:
id
  1. Просмотр журналов 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. Проверка доступа к файлам из командной строки:
sudo -u sftpuser cat /path/to/file

Дерево решений для ошибок "Permission Denied" (Отказано в доступе)

Когда вы сталкиваетесь с ошибкой "Permission denied" (Отказано в доступе) в SFTP, следуйте этому дереву решений:

  1. Может ли пользователь SFTP получить доступ к родительскому каталогу?

    • Проверьте с помощью: sudo -u sftpuser ls -la /path/to/directory/
    • Исправьте с помощью: chmod o+x /path/to/directory/
  2. Может ли пользователь SFTP прочитать файл?

    • Проверьте с помощью: sudo -u sftpuser cat /path/to/file
    • Исправьте с помощью: chmod o+r /path/to/file или setfacl -m u:sftpuser:r /path/to/file
  3. Может ли пользователь SFTP записывать в файл или каталог?

    • Проверьте с помощью: sudo -u sftpuser touch /path/to/directory/test_file
    • Исправьте с помощью: chmod o+w /path/to/directory/ или setfacl -m u:sftpuser:w /path/to/directory/

Создание тестового скрипта для разрешений SFTP

Давайте создадим простой тестовый скрипт, который проверяет, может ли пользователь SFTP получить доступ к определенным файлам и каталогам:

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

Теперь запустите тестовый скрипт:

sudo ~/project/check_sftp_permissions.sh

Вы должны увидеть вывод, указывающий, к каким каталогам и файлам пользователь SFTP может получить доступ. Это поможет вам быстро выявить проблемы с разрешениями.

Заключительные советы по управлению разрешениями SFTP

  1. Используйте принцип наименьших привилегий: Предоставляйте только минимально необходимые разрешения
  2. Регулярно проверяйте разрешения: Используйте такие инструменты, как find, для выявления файлов с ненадлежащими разрешениями
  3. Документируйте структуру разрешений: Отслеживайте, какие пользователи и группы имеют доступ к каким каталогам
  4. Рассмотрите возможность использования chroot-тюрем SFTP: Для производственных сред ограничьте пользователей определенными каталогами
  5. Тестируйте с точки зрения пользователя: Всегда проверяйте разрешения, тестируя от имени фактического пользователя SFTP

Резюме

В этом руководстве вы узнали, как настроить SFTP-сервер, создавать пользователей с соответствующими разрешениями и устранять распространенные ошибки "Permission denied" (Отказано в доступе). Вы получили практический опыт работы с:

  • Установкой и настройкой SFTP-сервера на Ubuntu
  • Пониманием разрешений на файлы Linux и их влияния на доступ к SFTP
  • Обнаружением и диагностикой ошибок "Permission denied" (Отказано в доступе)
  • Реализацией различных решений для устранения проблем с разрешениями
  • Применением лучших практик управления разрешениями SFTP

Эти навыки помогут вам эффективно управлять передачей файлов в безопасной среде, сводя к минимуму проблемы, связанные с разрешениями. Помните, что надлежащее управление разрешениями необходимо для поддержания безопасного, но функционального SFTP-сервера, уравновешивая требования безопасности с потребностями доступа пользователей.