
У меня возникли трудности с использованием gcsfuse при монтировании контейнера хранилища в каталог, который используется для загрузок SFTP на виртуальной машине CentOS 7 compute engine в GCP. Сначала я попытался смонтировать его с помощью основных инструкций, которые монтировались следующим образом:
GOOGLE_APPLICATION_CREDENTIALS=/root/service_account.json gcsfuse al-dev-sftp /sftp
но я не мог создать файлы/каталоги в смонтированном каталоге. После исследования я смонтировал диск следующим образом:
GOOGLE_APPLICATION_CREDENTIALS=/root/service_account.json gcsfuse -o allow_other --gid 0 --uid 0 --file-mode 777 --dir-mode 777 al-dev-sftp /sftp
что позволяло создавать файлы и каталоги. Однако я не мог chown/chmod ни одного из файлов или каталогов, как это было необходимо для chroot каталогов пользователей jail в обычном случае использования SFTP.
Чтобы попытаться обойти это, я создал символические ссылки на смонтированный диск хранения SFTP, что было нормально, пока мы не заметили, что размещение файлов на SFTP синхронизировалось правильно, но если мы помещали файл в корзину, он не синхронизировался обратно в смонтированный каталог SFTP. Я пробовал делать rsync, но независимо от того, в каком направлении я пробовал, мы теряли файлы в любом случае. (Позже я прочитал, что gcsfuse не поддерживает связывание).
Проведя еще немного исследований, я нашел проект на GitHubдля настройки sftp kubernetes gcsэто выглядело многообещающе. Я не использую контейнеры никоим образом, но мне было интересно, как было сделано монтирование, а также какая конфигурация SFTP использовалась. Это привело меня к созданию монтирования следующим образом:
gcsfuse --uid 1000 --gid 1001 -o nonempty wraheem /test_sftp/wraheem/upload
что позволит смонтировать мой каталог загрузки в отдельный контейнер для каждого пользователя (не идеально, но если я смогу это сделать, то ладно), и я могу назначить владельца root для папки пользователя, одновременно предоставив пользователю разрешение на папку загрузки, идеально заперев пользователя в SFTP.
Проблема в том, что когда пользователь входит в систему через SFTP (в Filezilla) и пытается перейти в папку загрузки, он получает сообщение об ошибке:
Status: Retrieving directory listing of "/test_sftp/wraheem/upload"...
Command: cd "/test_sftp/wraheem/upload"
Error: Directory /test_sftp/wraheem/upload: no such file or directory
который, очевидно, существует.
Моя запись конфигурации sshd выглядит так:
Match User wraheem
ForceCommand internal-sftp
PasswordAuthentication yes
ChrootDirectory /test_sftp/wraheem
AllowTcpForwarding no
который отлично работает с любым другим обычным каталогом с шаблоном jail, где root владеет каталогом пользователя, а пользователь владеет подкаталогами.
Я посмотрел на само крепление и увидел следующее:
wraheem on /test_sftp/wraheem/upload type fuse (rw,nosuid,nodev,relatime,user_id=0,group_id=0,default_permissions)
и что бросилось мне в глаза, так это то, что user_id и group_id установлены в ноль (root), хотя я могу добавлять файлы, а при выполнении ls -l устанавливаются права доступа к папкам и файлам:
drwxr-xr-x. 1 wraheem wraheem 0 Aug 22 20:16 upload
Интересно, если даже при наличии разрешений точка монтирования принадлежит root, так что это даже не имеет значения. В качестве теста я попробовал установить удаленный каталог по умолчанию на /media (принадлежит root) и получил ту же самую ошибку в filezilla, что и раньше.
Кто-нибудь использовал gcsfuse таким образом для SFTP? Или кто-нибудь может увидеть, где я пропустил шаг настройки?
Спасибо за любую помощь, которую вы можете придумать; мне интересно, можно ли вообще использовать это для SFTP на данном этапе...