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

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 может позволить ему войти в систему локально, поэтому может потребоваться какой-то другой механизм.

HandyGandy
источник

Ответы:

12

В файле авторизованных ключей есть опция команды . Эта опция, кажется, делает именно то, что вы хотите.

Обратите внимание, что это не chroot или ограниченная оболочка. Это позволяет выполнять только те команды через ssh. На вашем примере это будет:

ssh somehost /local/remote_only_scripts/foo

Для этого файла author_keys:

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

РЕДАКТИРОВАТЬ : добавлены дополнительные параметры ограничения и разъяснить, как вы удалите локальный доступ.

Корен
источник
Я не думаю, что вам нужно указывать эту команду в ssh на стороне клиента, это «принудительная» команда, поэтому она всегда будет выполняться;) Пользователю на удаленном сайте все еще нужна корректная оболочка, определенная в / etc / passwd.
Джириб
1
Кроме того command=, параметры no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-ptyнеобходимы, чтобы действительно ограничить учетную запись.
Джофель
Ok. Я проснулся среди ночи и решил проверить ответы. Поскольку я сонлив, я не буду усваивать весь ответ, а спрашиваю что-то, что оставляет меня в замешательстве. Как это предотвращает вход 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.

Arcege
источник
Если вы хотите, чтобы пользователь мог выполнять команды только из вашего каталога (а их не так уж много), вы можете вынуть «prog» из приведенного выше и использовать оператор select, чтобы предложить текстовое меню выбора. из этих программ, а затем сделать чтение аргументов. Я также проверил бы это, чтобы убедиться, что произойдет, если вы наберете кучу Ctrl-C в разных точках скрипта. Вы можете также хотеть команду ловушки там.
Джо
0

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

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

server1:/ # grep hg_guest /etc/passwd

hg_guest: х: 2002: 100 :: / Главная / hg_guest: /local/remote_only_scripts/foo/script.sh

2bc
источник