Додавання користувача, який може виконувати лише сценарії віддалено


14

Я хотів би створити користувача, який може робити лише одне: через ssh вкажіть скрипт (і аргументи командного рядка до сценарію), який знаходиться в одній конкретній папці (для цілей цього питання назвемо це /local/remote_only_scripts/foo) і виконати цей сценарій і повернути його вихід.

Щоб було зрозуміло кілька прикладів того, що я не хочу, щоб користувач міг робити:

  • Локально увійдіть до облікового запису. Додаток для входу є /bin/login. Це не скрипт у /local/remote_only_scripts/fooпапці, тому його не слід викликати користувачем.
  • Віддалене увійдіть в обліковий запис. Знову логін (це те, що викликається ssh?) - це не скрипт у відповідній папці.
  • Перерахуйте вміст каталогу. ls в /bin/ls. Це не сценарій у відповідному каталозі.
  • Відредагуйте файл у цьому каталозі. emacs, vi, gedit більшість інших редакторів не є сценаріями в цій дирекції.
  • Перегляньте вміст файлу в цьому каталозі.
  • Виконайте файл у тому каталозі, який у нього немає дозволу на виконання.

Зауважте, що це приклади , є багато інших дій, які я не хочу, щоб користувач міг зробити. Розглядаючи дію, запитайте: "Це робиться за сценарієм у /local/remote_only_scripts/foo?" якщо відповідь немає, користувач не повинен це зробити. Якщо відповідь "так", то користувач повинен це зробити.

PS: Дозвольте мені уточнити, що я маю на увазі під "додаванням користувача". Я не маю на увазі додавання користувача до якоїсь підсистеми ssh. Я швидше маю на увазі додавання користувача до комп'ютерної системи. Так, наприклад, у мене система debian стабільна, називайте її за її адресою, www.hg.bar.com. Я хочу додати користувача (через kuser, users-admin або useradd чи якимсь подібним способом) назвати його hg_guest. hg_guest не може ввійти локально або робити щось із наведеного вище списку. Все, що може зробити hg_guest, - це виконувати сценарії "віддалено". Я сказав, що він повинен це зробити через ssh, але, думаючи про це зараз, можливо, дозволити йому використовувати ssh, можливо, він дозволить йому ввійти локально, тому може знадобитися якийсь інший механізм.

Відповіді:


12

У файлі санкціонованих ключів є командний параметр. Здається, цей параметр робить саме те, що ви хочете.

Зауважте, що це не chroot чи обмежена оболонка. Це дозволяє виконувати лише ті команди за допомогою ssh. З вашим прикладом це було б:

ssh somehost /local/remote_only_scripts/foo

Для цього дозволеного файлу ключів:

command="/local/remote_only_scripts/foo",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ...public key... 

Існує багато способів, якщо ви не хочете, щоб ваш користувач міг увійти в систему на локальному рівні. Ви можете:

  • просто встановіть його оболонку на / bin / false (можливо, вам знадобиться / bin / true, оскільки ssh потребує дійсного входу)
  • заблокувати свій пароль, див passwd -l

EDIT : додано більше варіантів обмежень та поясніть, як ви видалите локальний доступ.


Я не думаю, що вам потрібно вказувати цю команду в ssh на стороні клієнта, це команда "примусово", щоб вона завжди виконувалася;) Користувачеві на віддаленому сайті все ще потрібна дійсна оболонка, визначена в / etc / passwd.
джиріб

1
Крім того command=, потрібні варіанти no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty, щоб дійсно обмежити рахунок.
Джофель

Добре. Я прокинувся посеред ночі і вирішив перевірити відповіді. Оскільки я дрімаю, я не засвоюю всієї відповіді, але попрошу щось, що мене бентежить. Як це запобігає входу hg_quest із tty?
HandyGandy

@HandyGandy Це найпростіша частина. Я додав 2 способи це зробити, але думаю, що є більше
Coren

0

Спробуйте це як оболонку для входу для користувача:

#!/bin/sh
basedir=/local/remote_only_scripts
while read -p '$ ' prog args; do
    if [ ! -x "$basedir/$prog" ]; then
        echo "Invalid program: $prog"
    else
        case "$prog $args" in
            *\**|*\?*|*\^*|*\&*|*\<*|*\>*|*\|*|*\;*|*\`*|*\[*|*\]*)
                echo "Invalid character in command";;
            *)
                eval "$prog $args"
                echo;; # force a trailing newline after the program
        esac
    fi
done

Напевно, ви також хочете, щоб це було у authorized_keysфайлі явно, як у відповіді Корен; але замініть '... / foo; з програмою тут. Це дозволить запобігти команди від SSH , як sftp, scpі ssh hostname command.


Якщо ви хочете, щоб користувач міг виконувати команди з вашого каталогу (а їх не так вже й багато), ви можете взяти "прог" з прочитаного вище і використовувати оператор select, щоб запропонувати текстове меню з варіантами цих програм, а потім прочитайте аргументи. Я б також перевірив це, щоб переконатися, що станеться, якщо ви введете купу Ctrl-Cs в різні точки сценарію. Ви можете також захотіти команду пастки.
Джо

0

За випадковості їм потрібно отримати доступ лише до одного сценарію, для мене це дуже добре працює. Додайте користувача та змініть його за замовчуванням на шлях сценарію. Коли вони з'єднаються через ssh, він виконає сценарій та закриє сеанс.

server1:/ # useradd -s "/local/remote_only_scripts/foo/script.sh" hg_guest

server1:/ # grep hg_guest /etc/passwd

hg_guest: x: 2002: 100 :: / home / hg_guest: /local/remote_only_scripts/foo/script.sh

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.