Варіант команди 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, The Secure Shell: The Final Guide від O'Reilly, у восьмій главі, є хороший приклад із застосуванням сценарію, наприклад:

#!/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і всі інші речі, які вам можуть здатися корисними в якийсь день.
Якову

3
@Jakuje Чи не це взагалі дійсно для цієї commandопції?
gf_

1

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

Інша стаття описує загальний сценарій, який також дозволяє аргументи командного рядка дозволеним командам, але дозволяє блокувати їх правилами, вираженими як регулярні вирази.

Цей приклад виражатиметься наступним чином:

command="only systemctl shutdown"

І буде створено .onlyrulesфайл із цим вмістом:

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

Перевага такого "єдиного" підходу полягає в тому, що немає необхідності писати окремі сценарії для кожного користувача та ситуації.


Проблема із зміною оболонки полягає в тому, що вона застосовуватиметься до всіх логінів, навіть тих, що мають ключ, який не планується обмежувати. Крім того, якщо ви використовуєте лише вхід в оболонку і не маєте доступу до адміністратора, ви не можете просто змінити налаштовану оболонку на те, що вам потрібно. Але ви все одно можете редагувати файл, який має дозволений_кіс.
kasperd

Ви можете використовувати "обмежену оболонку" якForcedCommand
Георг Ленер

Мені трапляється, якщо ситуація, коли використовуваний обліковий запис є звичайним обліковим записом користувача, а необхідні дії є привілейованими, що можна покластися на sudo для перевірки і встановити параметр команди command_keys на "sudo $ SSH_ORIGINAL_COMMAND"?
Стів Ді
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.