Опция команды авторизованного ключа SSH: несколько команд?

17

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

dkaeae
источник

Ответы:

9

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

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

Jakuje
источник
27

Вы можете иметь только одну команду для каждой клавиши, потому что команда «принудительная».

Но вы можете использовать скрипт-обертку. Вызываемая команда получает исходную командную строку в качестве переменной среды $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",…
HFS
источник
1
Полезно. Может быть, стоит прояснить, что сам sshd добавляет SSH_ORIGINAL_COMMAND(per man sshd), чтобы он был доступен в скриптах. Также приведем пример для автоматизированных сценариев, которые позволяют запускать определенные шаблоны SSH_ORIGINAL_COMMAND. См. Также unixwars.blogspot.com/2014/12/getting-sshoriginalcommand.html
Седрик Найт
7

В великолепном 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:
gf_
источник
Но такой сценарий в основном ломается scp, sftpи все остальное, что вы можете найти полезным когда-нибудь.
Jakuje
3
@Jakuje Разве это не подходит для commandварианта в целом?
gf_
1

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

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

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

command="only systemctl shutdown"

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

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

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

Георг Ленер
источник
Проблема с изменением оболочки заключается в том, что она будет применяться ко всем входам в систему, даже к тем, у которых ключ не предназначен для ограничения. Более того, если вы входите только в оболочку и не имеете доступа администратора, вы не можете просто изменить настроенную оболочку на ту, которая вам нужна. Но вы все равно можете отредактировать свой файл author_keys.
Касперд
Вы можете использовать «ограниченную оболочку» какForcedCommand
Георг Ленер
Мне приходит в голову, что для ситуации, когда используемая учетная запись является обычной учетной записью пользователя, а необходимые действия являются привилегированными, можно полагаться на sudo для выполнения проверки и установить для опции санкционированного ключа «sudo $ SSH_ORIGINAL_COMMAND»?
Стив Ди