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


17

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

Ответы:


9

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

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


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",…

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:

Но такой сценарий в основном ломается 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»?
Стив Ди
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.