Опция команды авторизованного ключа SSH: несколько команд?
Authorized_keys имеет параметр command="...", который ограничивает ключ одной командой. Есть ли способ ограничить ключ несколькими командами? Например, с помощью регулярного выражения или путем редактирования какого-либо другого файла конфигурации?
4 ответа
Нет. Это не "разрешенная" команда, а "принудительная" (как ForceCommand
опция).
Единственная возможность - использовать разные клавиши для разных команд или читать параметры из stdin
,
Вы можете иметь только одну команду для каждой клавиши, потому что команда "принудительная".
Но вы можете использовать скрипт-обертку. Вызываемая команда получает исходную командную строку в качестве переменной среды $SSH_ORIGINAL_COMMAND
, который он может оценить.
Например, положить это в ~/.ssh/allowed-commands.sh
:
#!/bin/sh
#
# You can have only one forced command in ~/.ssh/authorized_keys. Use this
# wrapper to allow several commands.
case "$SSH_ORIGINAL_COMMAND" in
"systemctl restart cups")
systemctl restart cups
;;
"shutdown -r now")
shutdown -r now
;;
*)
echo "Access denied"
exit 1
;;
esac
Затем укажите это в ~/.ssh/authorized_keys
с
command="/home/user/.ssh/allowed-commands.sh",…
В великолепной книге SSH "Безопасная оболочка: исчерпывающее руководство " О'Рейли в восьмой главе приведен хороший пример использования сценария, подобного следующему:
#!/bin/sh
/bin/echo "Welcome!
Your choices are:
1 See today's date
2 See who's logged in
3 See current processes
q Quit"
/bin/echo "Your choice:"
read ans
while [ "$ans" != "q" ]
do
case "$ans" in
1)
/bin/date
;;
2)
/usr/bin/who
;;
3)
/usr/bin/top
;;
q)
/bin/echo "Goodbye"
exit 0
;;
*)
/bin/echo "Invalid choice '$ans': please try again"
;;
esac
/bin/echo "Your choice:"
read ans
done
exit 0
Используя это в вашем .authorized_keys
файл как:
command="/path/to/your/script.sh" <ssh-key>
... дает вам это при выполнении ssh
:
Welcome!
Your choices are:
1 See today's date
2 See who's logged in
3 See current processes
q Quit
Your choice:
Другие подходы используют, например, ограниченную оболочку для данного пользователя, или используют оболочку, которая ограничивает команды для всех файлов / сценариев, найденных в определенном каталоге, что позволяет расширять список команд без изменения оболочки.
В другой статье описывается общий сценарий, который также разрешает аргументы командной строки разрешенным командам, но позволяет блокировать их с помощью правил, выражаемых в виде регулярных выражений.
Этот пример будет выражен следующим образом:
command="only systemctl shutdown"
И .onlyrules
файлы будут созданы с таким содержанием:
\:^systemctl restart cups$:{p;q}
\:^shutdown -r now$:{p;q}
Преимущество этого "единственного" подхода заключается в том, что нет необходимости писать индивидуальные сценарии для каждого пользователя и ситуации.