Вопрос или проблема
Мне нужно, чтобы пользователь в моей системе Linux выполнял некоторые команды в .bash_profile
. Но я не хочу, чтобы этот пользователь имел доступ к sftp
, ftp
и другим протоколам. Также нельзя выполнять какие-либо команды, кроме некоторых в .bash_profile
.
Поэтому я хочу создать пользователя, который не сможет использовать никакой протокол, кроме ssh, и не сможет выполнять никакие команды, кроме команд из .bash_profile. Что мне делать?
Обновление:
Я попробовал rbash
, но, похоже, я могу выйти из него, набрав bash
.
[root@centos-7 ~]# which rbash
/usr/bin/rbash
[root@centos-7 ~]# ls
a anaconda-ks.cfg
[root@centos-7 ~]# cd a
[root@centos-7 a]# pwd
/root/a
[root@centos-7 a]# cd
[root@centos-7 ~]# rbash
[root@centos-7 ~]# cd a
rbash: cd: restricted
[root@centos-7 ~]# bash
[root@centos-7 ~]# cd a
[root@centos-7 a]# pwd
/root/a
1. Создайте ограниченную оболочку.
cp /bin/bash /bin/rbash
- Измените оболочку целевого пользователя на ограниченную оболочку
При создании пользователя:
# useradd -s /bin/rbash localuser
Для существующего пользователя:
# usermod -s /bin/rbash localuser
Для более подробной информации, пожалуйста, ознакомьтесь со статьей KBase 8349
Затем пользователь localuser оказывается в chroot и не может получить доступ к ссылкам за пределами своей домашней директории /home/localuser
-
Создайте каталог в /home/localuser/, например, programs
mkdir /home/localuser/programs
-
Теперь, если вы проверите, пользователь localuser может получить доступ ко всем командам, выполнение которых он разрешил. Эти команды берутся из переменной окружения PATH, которая задается в /home/localuser/.bash_profile. Измените её следующим образом.
cat /home/localuser/.bash_profile
.bash_profileПолучите псевдонимы и функции
если [ -f ~/.bashrc ]; то
. ~/.bashrc
fi
Специфичные для пользователя программы окружения и запуска
PATH=$HOME/programs
export PATH
Здесь переменная PATH устанавливается в каталог ~/programs, так как /usr/local/bin связывается с /home/username/bin и /bin связывается с /home/username/bin, поэтому заменяйте это.
-
Теперь после входа с именем пользователя localuser, пользователь не может выполнить даже простую команду. Вывод будет таким,
[localuser@example ~]$ ls
-rbash: ls: command not found
[localuser@example ~]$ less file1
-rbash: less: command not found
[localuser@example ~]$ clear
-rbash: clear: command not found
[localuser@example ~]$ date
-rbash: date: command not found
[localuser@example ~]$ ping redhat.com
-rbash: ping: command not found -
Теперь создайте символические ссылки на команды, которые требуются пользователю localuser для выполнения в каталоге /home/localuser/programs
ln -s /bin/date /home/localuser/programs/
ln -s /bin/ls /home/localuser/programs/
ll /home/localuser/programs/
total 8
lrwxrwxrwx 1 root root 9 Oct 17 15:53 date -> /bin/date
lrwxrwxrwx 1 root root 7 Oct 17 15:43 ls -> /bin/ls
Здесь представлены примеры использования команд date и ls
-
Снова войдите с именем пользователя localuser и попробуйте выполнить команды.
[localuser@example ~]$ date
Mon Oct 17 15:55:45 IST 2011
[localuser@example ~]$ ls
file1 file10 file2 file3 file4 file5 file6 file7 file8 file9 programs
[localuser@example ~]$ clear
-rbash: clear: command not found -
Можно добавить еще один шаг, чтобы ограничить пользователя от внесения изменений в его .bash_profile, так как пользователи могут его изменить.
Выполните следующую команду, чтобы сделать файл .bash_profile пользователя localuser неизменяемым, так что root/localuser не сможет его изменить, пока root не уберет это право.
# chattr +i /home/localuser/.bash_profile
Чтобы убрать неизменяемый флаг,
# chattr -i /home/localuser/.bash_profile
Сделайте файл .bash_profile неизменяемым, чтобы пользователь localuser не мог изменять пути окружения.
Ответ или решение
Создание ограниченного пользователя в Linux – это задача, требующая аккуратного подхода для соблюдения баланса между предоставлением необходимых инструментов и ограничением избыточных привилегий. Это особенно важно в ситуациях, когда требуется предотвратить доступ пользователя к различным сетевым протоколам и командам, за исключением специально определенного набора. В данном руководстве мы рассмотрим, как правильно создать такого пользователя, используя возможности ограниченной оболочки (restricted shell), а также настройку окружения.
Теория
Многие системы Linux предлагают специальную оболочку, известную как rbash
(restricted bash), которая позволяет ограничивать возможности пользователя в командной строке. В отличие от обычной оболочки Bash, rbash
запрещает выполнение ряда команд, включая смену директории, изменение значений переменных PATH и другую модернизацию окружения.
Однако, как указано в описании проблемы, есть потенциал для обхода ограничений rbash
, например, через вызов команды bash
, которая позволяет выйти за рамки ограниченной среды. Основная задача здесь – обеспечить, чтобы пользователь оставался в рамках установленных ограничений.
Пример
-
Создание ограниченной оболочки:
Создайте копию bash по следующему пути:
# cp /bin/bash /bin/rbash
Далее измените оболочку целевого пользователя на restricted shell:
Для нового пользователя:
# useradd -s /bin/rbash localuser
Для уже существующего пользователя:
# usermod -s /bin/rbash localuser
-
Ограничение окружения пользователя:
Теперь нам необходимо настроить пользовательскую среду таким образом, чтобы была доступна только определенная команда, как указано в
.bash_profile
. Для этого создайте специальную директорию для программ:mkdir /home/localuser/programs
Затем настройте
.bash_profile
пользователя таким образом, чтобы путь PATH указывал только на эту директорию:# cat /home/localuser/.bash_profile if [ -f ~/.bashrc ]; then . ~/.bashrc fi PATH=$HOME/programs export PATH
Это изменение гарантирует, что ни одна команда не будет выполнена, если она не находится в директории
/home/localuser/programs
. -
Создание символических ссылок на разрешенные команды:
На этом этапе необходимо создать символические ссылки внутри директории программ на команды, которые разрешено выполнять пользователю. Пример с командами
date
иls
:ln -s /bin/date /home/localuser/programs/ ln -s /bin/ls /home/localuser/programs/
Эти команды будут доступны пользователю при входе.
-
Защита
.bash_profile
:Для предотвращения изменений в файле
.bash_profile
пользователем, можно установить на него атрибутimmutable
, что сделает его неизменяемым без соответствующих привилегий:# chattr +i /home/localuser/.bash_profile
Чтобы снять этот атрибут, если потребуется внести изменения:
# chattr -i /home/localuser/.bash_profile
Применение
После выполнения этих шагов, пользователь localuser
сможет работать только в жестко регламентированном окружении. При каждом входе такая настройка ограничит выполнение только предусмотренного круга команд, а применение атрибута immutable
на .bash_profile
обеспечит сохранность этих настроек.
Эта методология подходит для систем, где требуется четкий контроль доступа к функциям системы и минимизация потенциальных угроз безопасности. Также важно поддерживать обновленные списки разрешенных команд и периодически пересматривать их в соответствии с изменяющимися требованиями безопасности или функциональности.
Здесь необходимо учитывать, что данный подход предполагает некоторую инертность во внедрении сетевых протоколов и, при условии наличия определенных разрешений, эффективен в обеспечении безопасности на уровне пользователей системы.