Есть ли способ, чтобы все файлы, созданные конкретным пользователем в sftp, имели определенные группы и права доступа к файлам? Данный пользователь, конечно, будет членом группы, но это не его основная группа. Другими словами, есть ли способ для sftp автоматически дублировать эффекты umask и newgrp?
4 ответа
В (Open)SSH есть такая вещь, как подсистема : это программа, которая запускается, когда вы запрашиваете что-то, кроме интерактивной оболочки. Технически это просто исполняемый файл на удаленном хосте , который exec
«d от sshd
ребенка после проведения аутентификации и вызова УИП.
Вы можете найти стандартное определение подсистемы для sftp
в вашей конфигурации SSH:
Subsystem sftp /usr/lib/openssh/sftp-server
Так как это простой исполняемый файл, а не SUID или какой-либо другой, вы можете написать сценарий оболочки, который изменит любые необходимые вам атрибуты, а затем просто запустить оригинальный обработчик подсистемы.
Поместите следующий скрипт в папку /usr/lib/openssh
например, sftp-fperm-server
(это не требуется, просто чтобы хранить вещи в одном месте):
#!/bin/sh
umask 026
exec /usr/lib/openssh/sftp-server
Затем добавьте строку в конец /etc/ssh/sshd_config
:
Subsystem sftp-fperm /usr/lib/openssh/sftp-fperm-server
А затем перезапустить sshd
(он не убивает сессий на перезапуске) и запустить sftp
с опцией -s sftp-fperm
Вуаля! файлы получают новый указанный umask.
Если вы не хотите указывать эту опцию каждый раз, просто измените определение стандартной подсистемы. Интерактивные сеансы не будут затронуты этим, поэтому нет шансов что-то сломать.
Если вы хотите использовать команду newgrp
, все будет немного сложнее. newgrp
всегда запускает новую интерактивную оболочку, тупо не позволяя передавать ей какие-либо параметры, поэтому вы не можете использовать ее как umask
в предыдущем примере. Но вы можете заменить последнюю строку в скрипте на:
SHELL=/usr/lib/openssh/sftp-server newgrp git
На самом деле вызов newgrp
для некоторой группы, к которой я принадлежу, отправляет запрос пароля, поэтому я не смог проверить это решение (я имею в виду только newgrp
), но он работает, когда я передаю /bin/id
на моем ноутбуке (без SSH), так что если у вас есть newgrp
работающий на пользователя, никаких проблем возникнуть не должно.
Чтобы добавить к тому, что говорит whitequark, вы можете построить решение в том же духе, но использовать вместо команды newgrp команду sg, которая является своего рода su для групп. Посмотрите это как "man sg" в любой системе Linux, по крайней мере.
chmod g+s directory
Предоставит право собственности группе пользователей для всех каталогов и файлов, созданных в будущем.
Я бы предположил, что это зависит от сервера. Проверьте конфигурацию сервера на наличие возможных вариантов конфигурации.