Введение
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:
- Просмотр текущего каталога на удаленном сервере:
sftp> pwd
Remote working directory: /home/sftpuser
- Вывод списка файлов в текущем каталоге:
sftp> ls
- Переход в другой каталог:
sftp> cd /tmp
sftp> pwd
Remote working directory: /tmp
- Возврат в ваш домашний каталог:
sftp> cd
sftp> pwd
Remote working directory: /home/sftpuser
Попытка доступа к файлам с разными разрешениями
Теперь давайте попробуем получить доступ к нашим тестовым файлам из сеанса SFTP:
- Попытайтесь получить файл из нашего каталога 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:
- File Permissions (Разрешения на файлы): У пользователя нет доступа на чтение/запись к файлу
- Directory Permissions (Разрешения на каталоги): Пользователь не может получить доступ к каталогу, содержащему файл
- Ownership Issues (Проблемы с владельцем): Файл/каталог принадлежит другому пользователю или группе
- 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 эти команды особенно полезны:
- Проверка разрешений на файлы:
ls -la /path/to/file
- Проверка групп пользователей:
groups username
- Проверка текущих идентификаторов пользователя и группы:
id
- Просмотр журналов 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
- Проверка доступа к файлам из командной строки:
sudo -u sftpuser cat /path/to/file
Дерево решений для ошибок "Permission Denied" (Отказано в доступе)
Когда вы сталкиваетесь с ошибкой "Permission denied" (Отказано в доступе) в SFTP, следуйте этому дереву решений:
Может ли пользователь SFTP получить доступ к родительскому каталогу?
- Проверьте с помощью:
sudo -u sftpuser ls -la /path/to/directory/ - Исправьте с помощью:
chmod o+x /path/to/directory/
- Проверьте с помощью:
Может ли пользователь SFTP прочитать файл?
- Проверьте с помощью:
sudo -u sftpuser cat /path/to/file - Исправьте с помощью:
chmod o+r /path/to/fileилиsetfacl -m u:sftpuser:r /path/to/file
- Проверьте с помощью:
Может ли пользователь 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
- Используйте принцип наименьших привилегий: Предоставляйте только минимально необходимые разрешения
- Регулярно проверяйте разрешения: Используйте такие инструменты, как
find, для выявления файлов с ненадлежащими разрешениями - Документируйте структуру разрешений: Отслеживайте, какие пользователи и группы имеют доступ к каким каталогам
- Рассмотрите возможность использования chroot-тюрем SFTP: Для производственных сред ограничьте пользователей определенными каталогами
- Тестируйте с точки зрения пользователя: Всегда проверяйте разрешения, тестируя от имени фактического пользователя SFTP
Резюме
В этом руководстве вы узнали, как настроить SFTP-сервер, создавать пользователей с соответствующими разрешениями и устранять распространенные ошибки "Permission denied" (Отказано в доступе). Вы получили практический опыт работы с:
- Установкой и настройкой SFTP-сервера на Ubuntu
- Пониманием разрешений на файлы Linux и их влияния на доступ к SFTP
- Обнаружением и диагностикой ошибок "Permission denied" (Отказано в доступе)
- Реализацией различных решений для устранения проблем с разрешениями
- Применением лучших практик управления разрешениями SFTP
Эти навыки помогут вам эффективно управлять передачей файлов в безопасной среде, сводя к минимуму проблемы, связанные с разрешениями. Помните, что надлежащее управление разрешениями необходимо для поддержания безопасного, но функционального SFTP-сервера, уравновешивая требования безопасности с потребностями доступа пользователей.



