Доброе утро; У меня есть веб-сервер RHEL 5.7, настроенный на разрешение SSH / SFTP только для определенных групп. Я бы хотел, чтобы менеджеры контента загружали контент в свои соответствующие каталоги и чтобы этот контент унаследовал право собственности пользователя / группы на каталог независимо от метода загрузки или приложения. Например:
Если Джон загружает обновление в существующий файл в "веб-материал", право собственности на файл остается "apache: финансы". Если Джон загрузит новый файл в "веб-материал", право собственности на файл "Джон: финансы".
Я хочу, чтобы любой файл от Джона был загружен в "веб-материал" для смены владельца каталога. Я пробовал с setuid и setgid, но права собственности не были приняты. Я видел упоминания в ServerFault об использовании ACL или chrooted jail для SFTP, но мне еще предстоит их настроить и протестировать, и я не знаю, являются ли они жизнеспособным решением (они могли бы быть, я просто не знаю, потому что я тоже никогда не делал). Будем признательны за любые мысли и помощь.
Проблема в том, что sftp запускается как идентификатор пользователя - сначала ssh-клиент sftp подключается к целевому хосту от имени данного пользователя, а затем запускает sftp-server. Поскольку sftp-сервер работает от имени обычного пользователя, у него нет возможности «отдать» файл (сменить владельца файла).
Однако, если вы можете использовать scp и назначить пару ключей каждому пользователю, вы можете обойти это. Это включает добавление пользовательского ключа в файл ~ / .ssh / authorized_keys root с параметром command =, чтобы заставить его запустить сценарий, который очищает и изменяет аргументы серверной программы scp. Я использовал эту технику раньше, чтобы настроить анонимный scp dropbox, который позволял кому угодно отправлять файл и гарантировать, что никто не сможет получить отправленные файлы, а также предотвратить перезапись.
Если вы открыты для этой техники, дайте мне знать, и я дополню этот пост быстрым рецептом.
Изменить: на основе комментариев вот мой рецепт, который я изначально использовал для настройки анонимного Dropbox. Но он должен работать и для этой цели.
Если вы хотите, чтобы Джон писал для загрузки файлов в /var/www/webstuff
, и все файлы, записанные в него, принадлежат идентификатору пользователя apache
, затем:
1) Создайте пару ключей ssh:
ssh-keygen -t rsa -f john-scp-key
2) Отредактируйте файл открытого ключа "john-scp-key.pub" и вставьте в начало оператор "command =" следующим образом:
command="/usr/local/bin/strictscp ^/var/www/webstuff" ssh-rsa AAAA..... (reset
of key follows)
3) Добавьте содержимое john-scp-key.pub
к ~apache/.ssh/authorized_keys
file (создайте файл, если он не существует, убедившись, что и каталог .ssh, и authorized_keys принадлежат apache
, и не доступен для записи ни группой, ни миром)
4) Создайте скрипт /usr/local/bin/strictscp
следующим образом:
#!/bin/sh
read cmd arg1 arg2 <<EOT
$SSH_ORIGINAL_COMMAND
EOT
if [ "$cmd" = scp -a "$arg1" = -t ] && echo "$arg2" |grep "$1" >/dev/null 2>&1
then
eval $cmd $arg1 $arg2
fi
5) Теперь дайте файл закрытого ключа john-scp-key
Джону и попросите его скопировать файлы на ваш веб-сервер следующим образом:
scp -i john-scp-key some_file.html apache@yourserver:/var/www/webstuff/
Это работает так: когда вы используете scp для копирования файла на сервер, клиент scp использует ssh для выполнения «scp -t / path / name» на сервере. При использовании пары ключей вы можете переопределить выполняемую команду и принудительно запустить конкретную команду при использовании этого ключа. Исходная запрошенная команда вместе с ее аргументами находится в переменной среды «$ SSH_ORIGINAL_COMMAND». Итак, мы указываем COMMAND=
в сценарий, который проверяет допустимые аргументы (в этом случае он проверяет, что третий аргумент - это конкретный каталог, в который мы хотим записывать данные), так что этот ключ подходит только для его предполагаемой цели и не может использоваться для запуска произвольные команды на сервере.
Вы можете заблокировать strictscp
скрипт немного дальше, проверив, существует ли целевой файл или нет, и вы также можете добавить chgrp
до конца, чтобы установить принадлежность файла группе (при условии, что apache
является членом этой группы).
Надеюсь, это поможет - если у вас возникнут проблемы, дайте мне знать, и я посмотрю, смогу ли я улучшить этот ответ.