Параметр команды авторизованных_ключей SSH: несколько команд?

В authorized_keys есть опция command = "...", которая ограничивает ключ одной командой. Есть ли способ ограничить ключ несколькими командами? Например, имея там регулярное выражение или отредактировав другой файл конфигурации?

15
задан 16 January 2016 в 22:16
4 ответа

Нет. Это не «разрешенная» команда, а «принудительная» команда (как опция ForceCommand ).

Единственная возможность - использовать разные клавиши для разных команд или считывать параметры из stdin .

8
ответ дан 2 December 2019 в 20:45

В великолепной книге SSH, Secure Shell: The Definitive Guide О'Рейли, в восьмой главе, есть хороший пример использования сценария, подобного следующему. :

#!/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:
7
ответ дан 2 December 2019 в 20:45

Вы можете получить только одну команду на ключ, потому что команда "принудительна".

Но вы можете использовать оберточный скрипт. Вызываемая команда получает исходную командную строку в виде переменной окружения $SSH_ORIGINAL_COMMAND, которую она может оценить.

Например, поместите это в ~/.ssh/allowed-comandnds. 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",…
24
ответ дан 2 December 2019 в 20:45

Другие подходы используют, например, ограниченную оболочку для данного пользователя или обертку, которая ограничивает команды Al файлами/скриптами, находящимися в определенном каталоге, что позволяет расширить список команд, не изменяя обертку.

Другая статья описывает общий сценарий, который также разрешает аргументы командной строки к разрешенным командам, но позволяет блокировать их правилами, выраженными в виде регулярных выражений.

Этот пример был бы выражен следующим образом:

command="only systemctl shutdown"

И файлы .onlyrules были бы созданы с таким содержанием:

\:^systemctl restart cups$:{p;q}
\:^shutdown -r now$:{p;q}

Преимущество такого "единственного" подхода заключается в том, что нет необходимости писать отдельные сценарии для каждого пользователя и ситуации.

.
1
ответ дан 2 December 2019 в 20:45

Теги

Похожие вопросы