Назад | Перейти на главную страницу

Управление разрешениями каталогов Linux и SFTP

Доброе утро; У меня есть веб-сервер 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 является членом этой группы).

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