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

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

Я хотел бы создать пользователя, который может делать только одно: через 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 Stable, назовите ее по ее адресу, www.hg.bar.com. Я хочу добавить пользователя (через kuser, users-admin или useradd или каким-то похожим способом), назовите его hg_guest. hg_guest не может войти в систему локально или сделать что-либо из вышеприведенного списка. Все, что может сделать hg_guest, это выполнить скрипты «удалено». Я сказал, что он должен иметь возможность делать это через ssh, но если подумать об этом сейчас, возможно, разрешение использовать ssh позволит ему войти в систему локально, так что может потребоваться какой-то другой механизм.

решение1

Естькомандаопция в файле authorized_keys. Эта опция, кажется, делает именно то, что вам нужно.

Обратите внимание, что это не 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/ложь(возможно вам понадобится/bin/истинатак как ssh требует действительного входа в систему)
  • заблокируйте его пароль, см.passwd -l

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

решение2

Попробуйте использовать это в качестве оболочки входа для пользователя:

#!/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.

решение3

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

Связанный контент