Как ограничить пользователей 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]
Это достаточно для нас. Спасибо, сообщество!
Ответы
Ответ 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 дает вам полный контроль над командными строками, которые выполняют пользователи, а также над использованием системных ресурсов, таких как виртуальная память, процессорное время и т.д.
Ответ 10
Google - наш друг. Среди первых хитов:
НТН