Я хочу дать кому-то разрешение на размещение некоторых простых файлов на моем веб-сервере Ubuntu. Это для бота, регистрирующего IRC. Я бы хотел предоставить им доступ по ssh / scp / rsync / sftp без пароля. Однако я хочу иметь возможность ограничивать их действия, другими словами, я не хочу предоставлять им полную оболочку ssh. Я также хотел бы иметь возможность ограничить объем дискового пространства, которое они могут занять, чтобы они не могли использовать более (скажем) 200 МБ всего моего диска.
Бонусные опции, которые не требуются, но могут быть полезны: ограничить, какие файлы они могут загружать? (Может быть, пантомима?) Регистрировать, когда они загружают файл? Ограничить их пропускную способность?
Какие у меня варианты?
В Ubuntu / Debian вы можете установить scponly
shell, чтобы ограничить их только scp / sftp. Просто установите пакет и измените его оболочку на /usr/bin/scponly
:
sudo aptitude install scponly sudo usermod -s /usr/bin/scponly USERNAME
Проблему дискового пространства, вероятно, лучше всего решить с помощью квот файловой системы. К сожалению, у меня мало опыта с ними.
Если вы хотите стать более интересным (ограничивая типы файлов и т. Д.), Вам, вероятно, потребуется написать свой собственный сценарий для проверки команд, передаваемых от клиента. Самым простым сценарием будет сценарий оболочки, который выполняет тест, подобный этому:
if [[ $SSH_ORIGINAL_COMMAND = "scp -f *txt" ]] then exec $SSH_ORIGINAL_COMMAND fi
Это позволит скачивать файлы .txt. Быстрые тесты показывают, что имя файла не передается как часть команды scp при отправке. Так что в этом случае это может быть невозможно.
Сценарий будет установлен как принудительная команда для пользовательского ключа. (Поле `command =" blah "'' в authorized_keys.) Его также можно установить как параметр" ForceCommand "для группы Match в sshd_config, например:
Соответствует группе scponly ForceCommand / usr / local / sbin / scpwrapper
Затем добавьте пользователей, которые будут таким образом ограничены, в группу «scponly».
РЕДАКТИРОВАТЬ: По запросу вот сценарий, который я использую для обеспечения доступа только для rsync:
#!/bin/bash # # Verify that rsync command appears to be a legitimate rsnapshot command. # Requires >= bash 3.x # # Ben Beuchler # 6/4/07 # rsync needs to be operating in "server" mode. re_server='rsync --server' # Match both -x and --word options re_options=' +-{1,2}[[:alpha:]-]+' # Match legal paths re_paths=' +[-[:alnum:]_./]+' # Build the full regex r="^${re_server}(${re_options})+(${re_paths}){2}$" echo $SSH_ORIGINAL_COMMAND >> ssh_log if [[ $SSH_ORIGINAL_COMMAND =~ $r ]] then exec $SSH_ORIGINAL_COMMAND else echo "Invalid rsync command." fi
Используйте этот сценарий как принудительную команду (либо с помощью «command =» в ~ / .ssh / authorized_keys, либо с помощью блока «Match» в sshd_config, как указано выше), и он отклонит все, кроме команд rsync. После небольшой настройки его можно было заставить принимать только определенные команды rsync.
Возможное решение - поместить их в chroot-jail с помощью фиктивной оболочки ssh.
http://www.ssh.com/support/documentation/online/ssh/adminguide-zos/53/ssh-dummy-shell.html
http://en.wikipedia.org/wiki/Chroot_jail
Я видел, как это успешно реализовано ранее в этом контексте, хотя сам не делал этого.
SSH предоставляет механизм для создания пар ключей, которые могут быть ограничены одной командой или набором команд. См. Эту статью о linuxjournal сайт для хорошая статья в нем рассказывается, как создавать выделенные ключи ssh для использования, например, в сценариях и для заданий cron. Это также может применяться для предоставления пользователю возможности беспарольного доступа к серверу и удаленного выполнения определенной команды.
это вопрос о переполнении стека также есть несколько хороших примеров того, как сделать то же самое, что обсуждается в статье lj. В частности, вы используете файл authorized_keys для добавления ключей, к которым разрешен доступ, но ограничивая эти ключи, включая команды в одно из полей в файле authorized_keys.
Я не мог заставить bash скрипт работать и правильно дезинфицировать ввод rsync, возможно, я что-то пропустил, вместо этого я обнаружил программу perl под названием authprogs
Это делает то же самое более сложным способом, но идет намного дальше и позволяет также защитить его от IP.