Как ограничить пользователей SSH предопределенным набором команд после входа в систему?
это идея для безопасности. Наши сотрудники должны иметь доступ к некоторым командам на сервере linux, но не ко всем. Они должны, например, иметь возможность доступа к файлу журнала (less logfile) или запустить разные команды (shutdown.sh/run.sh).
Справочная информация:
все сотрудники получают доступ к серверу с тем же именем пользователя: наш продукт работает с "нормальными" разрешениями пользователя, не требуется "установка". Просто распакуйте его в свой пользовательский каталог и запустите его. Мы управляем несколькими серверы, на которых "установлено"наше приложение. На каждой машине есть пользователь johndoe. Наши сотрудники иногда нуждаются в доступе к приложению в командной строке, чтобы получить доступ и проверить файлы журнала или перезапустить приложение вручную. Только некоторые люди должны иметь полный доступ к командной строке.
мы используем аутентификацию ppk на сервере.
было бы здорово, если employee1 может получить доступ только к файлу журнала и employee2 также может сделать X так далее...
устранение:
В качестве решения я буду использовать command опция, как указано в принят ответ. Я сделаю свой собственный маленький скрипт оболочки, который будет единственным файлом, который может быть выполнен для какой-то человек. Скрипт предложит несколько команд, которые могут быть выполнены, но не другие. Я буду использовать следующие параметры в authorized_keys как заявил здесь:
command="/bin/myscript.sh",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty
ssh-dss AAAAB3....o9M9qz4xqGCqGXoJw= user@host
этого достаточно для нас. Спасибо, сообщество!
8 ответов:
вы также можете ограничить ключи допустимыми командами (в файле authorized_keys).
т. е. пользователь не будет входить в систему через ssh, а затем иметь ограниченный набор команд, а скорее будет разрешено выполнять эти команды только через ssh (например, "ssh somehost bin/showlogfile")
sshследуетrshтрадиция с помощью программы оболочки пользователя из файла пароля для выполнения команд.это означает, что мы можем решить это без участия
sshнастройки в любом случае.если вы не хотите, чтобы пользователь имел доступ к оболочке, просто замените оболочку этого пользователя скриптом. Если вы посмотрите в
/etc/passwdвы увидите, что есть поле, которое назначает интерпретатор команд оболочки для каждого пользователя. Сценарий используется в качестве оболочки для их интерактивного входаssh user@hostа также для командssh user@host command arg ....вот пример. Я создал пользователя
fooчья оболочка является скриптом. Скрипт печатает сообщениеmy arguments are:далее следуют его аргументы (каждый в отдельной строке и в угловых скобках) и завершается. В журнале в случае, если нет аргументов. Вот что происходит:webserver:~# ssh foo@localhost foo@localhost's password: Linux webserver [ snip ] [ snip ] my arguments are: Connection to localhost closed.если пользователь пытается выполнить команду, это выглядит так:
webserver:~# ssh foo@localhost cat /etc/passwd foo@localhost's password: my arguments are: <-c> <cat /etc/passwd>наши "оболочка" получает
-cвызов стиля, со всей командой в качестве одного аргумента, точно так же, как/bin/shполучили бы его.Итак, как вы можете видеть, что мы можем сделать сейчас, это развить скрипт дальше, чтобы он распознал случай, когда он был вызван с помощью
-cаргумент, а затем анализирует строку (скажем, путем сопоставления с шаблоном). Те строки, которые разрешены, могут быть переданы в реальную оболочку путем рекурсивного вызова/bin/bash -c <string>. В случае отклонения может напечатать сообщение об ошибке сообщение и завершение (включая случай, когда-cотсутствует).вы должны быть осторожны, как вы пишете это. Я рекомендую писать только положительные матчи, которые позволяют только очень конкретные вещи, и запретить все остальное.
Примечание: если вы
root, вы все еще можете войти в эту учетную запись, переопределив оболочку вsuкоманда, вот такsu -s /bin/bash foo. (Замените оболочку выбора.) Non-root не может этого сделать.здесь пример сценария: ограничьте пользователя только с помощью
sshнаgitдоступ к репозиториям под/git.#!/bin/sh if [ $# -ne 2 ] || [ "" != "-c" ] ; then printf "interactive login not permitted\n" exit 1 fi set -- if [ $# != 2 ] ; then printf "wrong number of arguments\n" exit 1 fi case "" in ( git-upload-pack | git-receive-pack ) ;; # continue execution ( * ) printf "command not allowed\n" exit 1 ;; esac # Canonicalize the path name: we don't want escape out of # git via ../ path components. gitpath=$(readlink -f "") # GNU Coreutils specific case "$gitpath" in ( /git/* ) ;; # continue execution ( * ) printf "access denied outside of /git\n" exit 1 ;; esac if ! [ -e "$gitpath" ] ; then printf "that git repo doesn't exist\n" exit 1 fi "" "$gitpath"конечно, мы верим, что эти программы Git
git-upload-packиgit-receive-packнет отверстий или аварийных люков, которые дадут пользователям доступ к системе.что присуще такого рода схеме ограничения. Пользователь аутентифицируется для выполнения кода в определенном домене безопасности, и мы включаем ограничение, чтобы ограничить это домен в поддомен. Например, если вы разрешаете пользователю запускать
vimкоманда на конкретный файл для его редактирования, пользователь может просто получить оболочку с:!sh[Enter].
то, что вы ищете называется Ограниченную Оболочку. Bash предоставляет такой режим, в котором пользователи могут выполнять только команды, присутствующие в их домашних каталогах (и они не могут перемещаться в другие каталоги), что может быть достаточно хорошо для вас.
Я нашел этой теме чтобы быть очень иллюстративным, если немного устарел.
вы должны приобрести' rssh', ограниченная оболочка
вы можете следовать инструкциям по ограничению, упомянутым выше, все они довольно понятны и просты в использовании. Поймите термины "chroot jail", и как эффективно реализовать конфигурации sshd/terminal, и так далее.
поскольку большинство ваших пользователей получают доступ к вашим терминалам через sshd, вы также, вероятно, должны заглянуть в sshd_conifg, файл конфигурации демона SSH, чтобы применить определенные ограничения через SSH. Однако будьте осторожны. Правильно поймите, что вы пытаетесь реализовать, поскольку последствия неправильных конфигураций, вероятно, довольно ужасны.
почему бы вам не написать свой собственный логин-Шелл? Было бы достаточно просто использовать Bash для этого, но вы можете использовать любой язык.
пример в Баш
используйте свой любимый редактор, чтобы создать файл
/root/rbash.sh(это может быть любое имя или путь, но должно бытьchown root:rootиchmod 700):#!/bin/bash commands=("man" "pwd" "ls" "whoami") timestamp(){ date +'%Y-%m-%s %H:%M:%S'; } log(){ echo -e "$(timestamp)\t\t$(whoami)\t" > /var/log/rbash.log; } trycmd() { # Provide an option to exit the shell if [[ "$ln" == "exit" ]] || [[ "$ln" == "q" ]] then exit # You can do exact string matching for some alias: elif [[ "$ln" == "help" ]] then echo "Type exit or q to quit." echo "Commands you can use:" echo " help" echo " echo" echo "${commands[@]}" | tr ' ' '\n' | awk '{print " " }' # You can use custom regular expression matching: elif [[ "$ln" =~ ^echo\ .*$ ]] then ln="${ln:5}" echo "$ln" # Beware, these double quotes are important to prevent malicious injection # For example, optionally you can log this command log COMMAND "echo $ln" # Or you could even check an array of commands: else ok=false for cmd in "${commands[@]}" do if [[ "$cmd" == "$ln" ]] then ok=true fi done if $ok then $ln else log DENIED "$cmd" fi fi } # Optionally show a friendly welcome-message with instructions since it is a custom shell echo "$(timestamp) Welcome, $(whoami). Type 'help' for information." # Optionally log the login log LOGIN "$@" # Optionally log the logout trap "trap=\"\";log LOGOUT;exit" EXIT # Optionally check for '-c custom_command' arguments passed directly to shell # Then you can also use ssh user@host custom_command, which will execute /root/rbash.sh if [[ "" == "-c" ]] then shift trycmd "$@" else while echo -n "> " && read ln do trycmd "$ln" done fiвсе, что вам нужно сделать, это установить этот исполняемый файл в качестве оболочки входа. Например, отредактируйте
/etc/passwdфайл, и заменить текущую оболочку входа этого пользователя/bin/bashс/root/rbash.sh.это всего лишь простой пример, но вы можете сделать его как продвинутый, как вы хотите, идея есть. Будьте осторожны, чтобы не заблокировать себя, изменив оболочку входа вашего собственного и только пользователя. И всегда проверяйте странные символы и команды, чтобы увидеть, действительно ли это безопасно.
вы можете проверить его с помощью:
su -s /root/rbash.sh.будьте осторожны, убедитесь, что соответствует всей команде, и будьте осторожны с подстановочными знаками! Лучше исключить Bash-символы, такие как
;,&,&&,||,$, и задние палочки, чтобы быть уверенным.в зависимости от Свободы, которую вы даете пользователю, это не будет намного безопаснее, чем это. Я обнаружил, что часто мне нужно было только сделать пользователя, который имеет доступ только к нескольким соответствующим командам, и в этом случае это действительно лучшее решение. Однако, вы хотите дать больше свободы, тюрьма и разрешения могут быть более подходящими. Ошибки легко сделать, и только заметили, когда это уже слишком поздно.
вы можете посмотреть на настройки тюрьмы.
другой способ взглянуть на это с помощью POSIX ACLs, он должен поддерживаться вашей файловой системой, однако вы можете иметь мелкозернистую настройку всех команд в linux так же, как у вас есть тот же элемент управления в Windows (только без более приятного пользовательского интерфейса). ссылке
еще одна вещь, чтобы посмотреть в это PolicyKit.
вам придется сделать совсем немного гуглить, чтобы все работало, так как это определенно не сила Linux на момент.
Google-наш друг. Среди первых хитов:
- однажды я попробовал это, и это сработало: http://www.onlamp.com/pub/a/bsd/2003/01/23/chroot.html
- http://www.webhostingtalk.com/archive/index.php/t-112326.html
- http://ask.metafilter.com/48951/How-to-restrict-shell-access
- http://www.cyberciti.biz/tips/howto-linux-unix-rssh-chroot-jail-setup.html
HTH
Comments