Управление разрешениями каталогов Linux и SFTP
Доброе утро; У меня есть веб-сервер RHEL 5.7, настроенный для разрешения SSH/SFTP только определенным группам. Я хотел бы, чтобы контент-менеджеры загружали контент в свои соответствующие каталоги и чтобы этот контент наследовал владельца каталога / пользователя независимо от способа загрузки или приложения. Например:
- Джон находится в группе "сеть" для прав SSH/SFTP и "финансы" для прав доступа к каталогу и загружает в каталог "веб-материал" через SFTP.
- Каталог "webstuff" имеет права доступа "2760" (rwxrws---) и право собственности на "apache: finance".
Если Джон загружает обновление в существующий файл в "webstuff", владельцем файла остается "apache: finance". Если Джон загружает новый файл в "webstuff", владельцем файла будет "john: finance".
Я хочу, чтобы любой файл от Джона был загружен в "webstuff" и стал владельцем каталога. Я пробовал с setuid и setgid оба набора, но владение пользователем не занимало. Я видел упоминания о ServerFault об использовании ACL или о изолированном джейле для SFTP, но мне еще предстоит настроить и протестировать их, и я не знаю, являются ли они жизнеспособным решением (они могут быть, я просто не знаю, потому что я никогда не делал). Любые мысли и помощь будет принята с благодарностью.
1 ответ
Проблема в том, что sftp запускается как идентификатор пользователя - сначала ssh-клиент sftp входит в целевой хост как заданный пользователь, затем запускает sftp-сервер. Поскольку sftp-сервер работает как обычный пользователь, он не может "отдать" файл (сменить владельца файла).
Однако, если вы можете использовать scp и назначить пару ключей каждому пользователю, вы можете обойти это. Это включает добавление пользовательского ключа в файл root ~/.ssh/ авторизованный_кейс с параметром "command=", чтобы заставить его запускать скрипт, который дезинфицирует и изменяет аргументы программы scp на стороне сервера. Я использовал эту технику прежде, чтобы настроить анонимный scp 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
файл (создайте файл, если он не существует, убедившись, что как каталог.ssh, так и author_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
является членом этой группы).
Надеюсь, это поможет - если у вас есть какие-то проблемы, дайте мне знать, и я посмотрю, смогу ли я улучшить этот ответ дальше.