Как ограничить пользователей 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


этого достаточно для нас. Спасибо, сообщество!

790   8  

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 на момент.

Comments

    Ничего не найдено.