Я хотел бы создать пользователя, который может делать только одно: через ssh указывать скрипт (и аргументы командной строки для скрипта), который находится в одной конкретной папке (для целей этого вопроса назовем ее /local/remote_only_scripts/foo
), и заставить этот скрипт выполниться и вернуть свой вывод.
Для ясности приведу несколько примеров того, что я не хочу, чтобы пользователь мог делать:
- Локально войдите в учетную запись. Приложение для входа —
/bin/login
. Это не скрипт в/local/remote_only_scripts/foo
папке, поэтому не должен вызываться пользователем. - Удаленно войдите в учетную запись. Опять же, вход (так называется по ssh?) не является скриптом в соответствующей папке.
- Выведите список содержимого каталога. ls находится в
/bin/ls
. Это не скрипт в соответствующем каталоге. - Редактировать файл в этом каталоге. emacs, vi, gedit и большинство других редакторов не являются скриптами в этом каталоге.
- Просмотр содержимого файла в этом каталоге.
- Запустите в этом каталоге файл, на выполнение которого у него нет прав.
Обратите внимание, что этоПримерыесть много других действий, которые я не хочу, чтобы пользователь мог выполнять. При рассмотрении действия спросите: «Это делается скриптом в /local/remote_only_scripts/foo
?», если ответ «нет», пользователь не должен иметь возможности выполнить это. Если ответ «да», то пользователь должен иметь возможность выполнить это.
PS: Позвольте мне пояснить, что я имею в виду под «добавлением пользователя». Я не имею в виду добавление пользователя в какую-то подсистему ssh. Скорее я имею в виду добавление пользователя в компьютерную систему. Так, например, у меня есть система, работающая под управлением Debian Stable, назовите ее по ее адресу, www.hg.bar.com. Я хочу добавить пользователя (через kuser, users-admin или useradd или каким-то похожим способом), назовите его hg_guest. hg_guest не может войти в систему локально или сделать что-либо из вышеприведенного списка. Все, что может сделать hg_guest, это выполнить скрипты «удалено». Я сказал, что он должен иметь возможность делать это через ssh, но если подумать об этом сейчас, возможно, разрешение использовать ssh позволит ему войти в систему локально, так что может потребоваться какой-то другой механизм.
решение1
Естькомандаопция в файле authorized_keys. Эта опция, кажется, делает именно то, что вам нужно.
Обратите внимание, что это не chroot или ограниченная оболочка. Она позволяет выполнять только эти команды через ssh. В вашем примере это будет:
ssh somehost /local/remote_only_scripts/foo
Для этого файла author_keys:
command="/local/remote_only_scripts/foo",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ...public key...
Есть много способов, если вы не хотите, чтобы ваш пользователь мог войти локально. Вы можете:
- просто установите его оболочку на/bin/ложь(возможно вам понадобится/bin/истинатак как ssh требует действительного входа в систему)
- заблокируйте его пароль, см.
passwd -l
РЕДАКТИРОВАТЬ: добавлены дополнительные параметры ограничения и разъяснено, как удалить локальный доступ.
решение2
Попробуйте использовать это в качестве оболочки входа для пользователя:
#!/bin/sh
basedir=/local/remote_only_scripts
while read -p '$ ' prog args; do
if [ ! -x "$basedir/$prog" ]; then
echo "Invalid program: $prog"
else
case "$prog $args" in
*\**|*\?*|*\^*|*\&*|*\<*|*\>*|*\|*|*\;*|*\`*|*\[*|*\]*)
echo "Invalid character in command";;
*)
eval "$prog $args"
echo;; # force a trailing newline after the program
esac
fi
done
Вы, вероятно, также захотите иметь это в файле authorized_keys
явно, как в ответе Корена; но замените '.../foo; на программу здесь. Это предотвратит команды из SSH, такие как sftp
, scp
, и ssh hostname command
.
решение3
В том случае, если им нужен только один скрипт, это работает для меня очень хорошо. Добавьте пользователя и измените его оболочку по умолчанию на путь к скрипту. Когда они подключаются через ssh, он выполнит скрипт и закроет их сеанс.
server1:/ # useradd -s "/local/remote_only_scripts/foo/script.sh" hg_guest
server1:/ # grep hg_guest /etc/passwd
hg_guest:x:2002:100::/home/hg_guest:/local/remote_only_scripts/foo/script.sh