Подтвердить что ты не робот

Как ограничить пользователей SSH предопределенным набором команд после входа в систему?

Это идея безопасности. Наши сотрудники должны иметь доступ к некоторым командам на сервере linux, но не ко всем. Они должны, например, имеют возможность доступа к файлу журнала (less logfile) или запускать разные команды (shutdown.sh/run.sh).

Фоновая информация:

Все сотрудники получают доступ к серверу с тем же именем пользователя: наш продукт работает с "обычными" разрешениями пользователя, не требуется "установка". Просто разархивируйте его в своем каталоге пользователя и запустите его. Мы управляем несколькими серверами, где наше приложение "установлено". На каждой машине есть пользователь johndoe. Наши сотрудники иногда нуждаются в доступе к приложению в командной строке для доступа и проверки файлов журнала или для перезапуска приложения вручную. Только некоторые люди должны иметь полный доступ к командной строке.

Мы используем аутентификацию ppk на сервере.

Было бы здорово, если employee1 может получить доступ только к logfile, а employee2 также может выполнять X и т.д.

Решение: В качестве решения я буду использовать параметр command, как указано в принятом ответе. Я создам свою небольшую оболочку script, которая будет единственным файлом, который может быть выполнен для некоторых сотрудников. script предложит несколько команд, которые могут быть выполнены, но нет других. Я буду использовать следующие параметры в authorized_keys, как указано здесь:

command="/bin/myscript.sh",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty
ssh-dss AAAAB3....o9M9qz4xqGCqGXoJw= [email protected]

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

4b9b3361

Ответ 1

Вы также можете ограничить ключи допустимыми командами (в файле authorized_keys).

т.е. пользователь не будет входить в систему через ssh, а затем имеет ограниченный набор команд, а может быть разрешен только для выполнения этих команд через ssh (например, "ssh somehost bin/showlogfile" )

Ответ 2

ssh следует традиции rsh, используя программу оболочки пользователя из файла пароля для выполнения команд.

Это означает, что мы можем решить эту проблему без участия конфигурации ssh.

Если вы не хотите, чтобы у пользователя был доступ к оболочке, просто замените эту оболочку на script. Если вы посмотрите в /etc/passwd, вы увидите, что есть поле, которое каждому интерпретатору присваивает интерпретатор командной строки. script используется как оболочка как для их интерактивного входа ssh [email protected], так и для команд ssh [email protected] command arg ....

Вот пример. Я создал пользователя foo, чья оболочка script. script печатает сообщение my arguments are:, за которым следуют его аргументы (каждый на отдельной строке и в угловых скобках) и завершается. В случае журнала нет аргументов. Вот что происходит:

webserver:~# ssh [email protected]
[email protected] password:
Linux webserver [ snip ]
[ snip ]
my arguments are:
Connection to localhost closed.

Если пользователь пытается запустить команду, он выглядит так:

webserver:~# ssh [email protected] cat /etc/passwd
[email protected] password:
my arguments are:
<-c>
<cat /etc/passwd>

Наша "оболочка" получает вызов стиля -c, причем вся команда как один аргумент, точно так же, как /bin/sh получит его.

Итак, как вы можете видеть, теперь мы можем продолжить разработку script, чтобы он распознавал случай, когда он был вызван с аргументом -c, а затем анализирует строку (скажем, путем сопоставления с образцом), Те строки, которые разрешены, могут быть переданы в реальную оболочку путем рекурсивного вызова /bin/bash -c <string>. Случай отклонения может печатать сообщение об ошибке и заканчиваться (включая случай, когда -c отсутствует).

Вы должны быть осторожны, как вы это пишете. Я рекомендую писать только положительные совпадения, которые допускают только очень специфические вещи и запрещают все остальное.

Примечание. Если вы root, вы можете войти в эту учетную запись, переопределив оболочку в команде su, например, su -s /bin/bash foo. (Заменить оболочку выбора.) Не-root не может этого сделать.

Вот пример script: запретить пользователю использовать ssh для git доступ к репозиториям в /git.

#!/bin/sh

if [ $# -ne 2 ] || [ "$1" != "-c" ] ; then
  printf "interactive login not permitted\n"
  exit 1
fi

set -- $2

if [ $# != 2 ] ; then
  printf "wrong number of arguments\n"
  exit 1
fi

case "$1" 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 "$2")  # 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

"$1" "$gitpath"

Конечно, мы верим, что эти Git программы git-upload-pack и git-receive-pack не имеют дыр или экранов вылета, которые предоставят пользователям доступ к системе.

Это присуще такой схеме ограничения. Пользователь аутентифицируется для выполнения кода в определенном домене безопасности, и мы блокируем ограничение для ограничения этого домена на субдомен. Например, если вы разрешаете пользователю запускать команду vim для определенного файла для ее редактирования, пользователь может просто получить оболочку с :!sh[Enter].

Ответ 3

То, что вы ищете, называется Restricted Shell. Bash предоставляет такой режим, при котором пользователи могут выполнять только команды, присутствующие в своих домашних каталогах (и они не могут перемещаться в другие каталоги), что может быть достаточно для вас.

Я нашел этот поток, чтобы быть очень иллюстративным, если немного устарел.

Ответ 4

Вы должны приобрести `rssh ', ограниченную оболочку

Вы можете следовать приведенным выше руководствам по ограничениям, они все довольно понятны и просты для подражания. Понимать термины "chroot jail" и как эффективно реализовывать конфигурации sshd/terminal и т.д.

Будучи так, как большинство ваших пользователей получают доступ к вашим терминалам через sshd, вы также должны, вероятно, посмотреть в sshd_conifg, файл конфигурации демона SSH, чтобы применить определенные ограничения через SSH. Однако будьте осторожны. Правильно понимайте, что вы пытаетесь реализовать, поскольку последствия неправильных конфигураций, вероятно, довольно тяжелые.

Ответ 5

Почему бы вам не написать свою собственную оболочку для входа? Для этого было бы довольно просто использовать Bash, но вы можете использовать любой язык.

Пример в 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$1\t$(whoami)\t$2" > /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 "  " $0}'

    # 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 "[email protected]"

# 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 [email protected] custom_command, which will execute /root/rbash.sh
if [[ "$1" == "-c" ]]
then
    shift
    trycmd "[email protected]"
else
    while echo -n "> " && read ln
    do
        trycmd "$ln"
    done
fi

Все, что вам нужно сделать, это установить этот исполняемый файл в качестве вашей оболочки входа. Например, отредактируйте файл /etc/passwd и замените текущую оболочку для входа этого пользователя /bin/bash на /root/rbash.sh.

Это простой пример, но вы можете сделать его настолько продвинутым, насколько хотите, идея есть. Будьте осторожны, чтобы не блокировать себя, изменяя оболочку входа собственного и единственного пользователя. И всегда проверяйте странные символы и команды, чтобы убедиться, что они действительно защищены.

Вы можете протестировать его с помощью su -s /root/rbash.sh.

Остерегайтесь, убедитесь, что он соответствует всей команде, и будьте осторожны с подстановочными знаками! Лучше исключить Bash -символы, такие как ;, &, &&, ||, $ и обратные ссылки.

В зависимости от свободы, которую вы предоставляете пользователю, она не будет намного безопаснее, чем эта. Я обнаружил, что часто мне нужно только сделать пользователя, который имеет доступ только к нескольким соответствующим командам, и в этом случае это действительно лучшее решение. Однако вы хотите предоставить больше свободы, тюрьма и разрешения могут быть более уместными. Ошибки легко создаются и замечаются только в том случае, если уже слишком поздно.

Ответ 6

Возможно, вам захочется взглянуть на настройку jail.

Ответ 7

Еще один способ взглянуть на это с помощью POSIX ACL, он должен поддерживаться вашей файловой системой, однако вы можете иметь тонкую настройку всех команд в Linux так же, как у вас есть один и тот же элемент управления в Windows (только без более удобный пользовательский интерфейс). ссылка

Еще одна вещь, которую нужно изучить: PolicyKit.

Вам нужно будет сделать довольно много поискового запроса, чтобы все работало, поскольку на данный момент это определенно не сила Linux.

Ответ 8

[Раскрытие: я написал sshdo, который описан ниже]

Если вы хотите, чтобы логин был интерактивным, тогда настройка ограниченной оболочки, вероятно, является правильным ответом. Но если существует фактический набор команд, которые вы хотите разрешить (и ничего больше), и вполне нормально, чтобы эти команды выполнялись индивидуально через ssh (например, ssh user @host cmd arg blah blah), тогда универсальный элемент управления списком команд для SSH может быть то, что вам нужно. Это полезно, когда команды каким-то образом написаны на стороне клиента и не требуют, чтобы пользователь действительно вводил команду ssh.

Для этого есть программа sshdo. Он контролирует, какие команды могут выполняться через входящие ssh-соединения. Доступно для скачивания по адресу:

http://raf.org/sshdo/  (читайте справочные страницы здесь) https://github.com/raforg/sshdo/

Он имеет режим обучения, позволяющий разрешать все команды, и опцию --learn для создания конфигурации, необходимой для постоянного разрешения изученных команд. Тогда режим тренировки можно отключить, и любые другие команды не будут выполняться.

Он также имеет опцию --unlearn, чтобы прекратить разрешать использование команд, которые больше не используются, чтобы поддерживать строгие наименьшие привилегии при изменении требований со временем.

Это очень суетливо о том, что это позволяет. Это не позволит команду с любыми аргументами. Допускаются только полные команды оболочки.

Но он поддерживает простые шаблоны для представления аналогичных команд, которые различаются только цифрами в командной строке (например, порядковыми номерами или отметками даты/времени).

Это как брандмауэр или элемент управления белым списком для команд ssh.

И он поддерживает разные команды, разрешенные для разных пользователей.

Ответ 9

GNU Rush может быть наиболее гибким и безопасным способом достижения этой цели:

GNU Rush - это оболочка для ограниченных пользователей, разработанная для сайтов, которые предоставляют ограниченный удаленный доступ к своим ресурсам, таким как svn или git-репозитории, scp или тому подобное. Используя сложный файл конфигурации, GNU Rush дает вам полный контроль над командными строками, которые выполняют пользователи, а также над использованием системных ресурсов, таких как виртуальная память, процессорное время и т.д.