Назад | Перейти на главную страницу

Как ограничить оболочку пользователя, позволяющую запускать программы оболочки

Можно ли запретить любому пользователю использовать такие команды, как ls, rm и другие системные команды, которые могут нанести вред системе. Но пользователи должны иметь возможность запускать программы оболочки.

Ваш вопрос должен быть таким:

Я не доверяю своим пользователям. Глупые видят что-то в Интернете и пробуют, не понимая, что это делает. Коварные люди любят шпионить и просматривать файлы других людей и красть их идеи. И ленивые, не заставляйте меня начинать с ленивых.

Как мне защитить мою систему и моих пользователей от моих пользователей?


Во-первых, unix имеет очень всеобъемлющую систему разрешений для файловой системы. Кажется, это достойный учебник по разрешениям файловой системы unix.. Суть этого в том, что каталоги могут быть настроены таким образом, чтобы пользователь мог заходить в каталог и запускать программы из этого каталога, но не мог просматривать содержимое этого каталога. Если вы сделаете это, например, в / home, если пользователь запустит ls в / home, он получит ошибку «Доступ запрещен».

Если вы действительно боитесь своих пользователей и хотите засунуть их в сверхмакс Тип ограниченного окружения, используйте что-то вроде тюрьмы freebsd или зон solaris - каждый пользователь получает свою индивидуальную среду. Для добавленных точек используйте ZFS, чтобы вы могли сделать снимок среды при входе в систему, поэтому, если они удалят свои файлы, вы можете просто вытащить их из снимка.

Чтобы полностью выполнить то, о чем вы просите, необходимо выполнить три вещи:

  1. Пользовательская оболочка, в которой отсутствуют интересующие вас команды. Это сложно сделать, но если вы действительно не хотите, чтобы пользователи имели доступ к некоторым примитивам оболочки, это единственный способ удалить их.
  2. Правильно установите права доступа к файлам. Не хотите, чтобы пользователи повредили систему? Установите разрешения, чтобы они не могли повредить систему, даже если у них есть нужные инструменты. Из этих трех шагов это самый простой шаг.
  3. Используйте технологию обязательного контроля доступа, такую ​​как AppArmor. MAC-адреса, такие как AppArmor и SELinux, встраивают разрешения в ядро. Это мешает пользователям запускать нужные инструменты, даже если они где-то их находят (и, как и права доступа к файлам, не позволяют им использовать их за пределами ограниченного поля).

Пояс, подтяжки и степлер на всякий случай. Тут сложно ошибиться.

AppArmor интересен тем, что MAC для конкретного исполняемого файла наследуется всеми его дочерними элементами. Установите логин пользователя как /bin/bash-bob, установите профиль AppArmor для этого конкретного двоичного права, и единственный способ выйти из этой тюрьмы разрешений - использовать эксплойты ядра. Если остался какой-то скрипт ленивой установки /var/opt/vendor/tmp доступный для глобальной записи по какой-то глупой причине, пользователь, использующий /bin/bash-bob как их оболочка не смогу писать там. Установите профиль bash-bob, чтобы разрешить запись только в их домашний каталог и /tmp, и такие ошибки разрешения не могут быть использованы. Даже если они каким-то образом найдут пароль root, профиль AppArmor для /bin/bash-bob будет применяться даже после того, как они su с su и bash процесс, который он порождает, дети /bin/bash-bob.

Сложнее всего создать этот профиль AppArmor.

  1. Создайте профиль AppArmor для / bin / bash-bob и установите его в режим аудита
  2. Установите для входа в систему Боба / bin / bash-bob
  3. Войдите как Боб. Делайте все, что вы хотите, чтобы Боб мог делать.
  4. Используйте журнал аудита для создания профиля AppArmor (у SUSE есть инструменты для этого, но насчет других дистрибутивов Linux не уверен). Это чудовищно утомительно, но должно произойти, если вам нужен такой уровень безопасности.
    1. Вы будете делать что-то вроде:
      • Утверждение доступа для чтения к большинству системных библиотек
      • Утверждение прав чтения и выполнения для нескольких выбранных разрешенных системных команд
      • Утверждение доступа на запись к временным пространствам
      • Утверждение создания сокета, если необходимо
  5. Установите политику для принудительного применения.
  6. Войдите как Боб, делайте что-нибудь.
  7. Внесите коррективы.

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

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

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

Не пытайтесь ограничивать команды, ограничивайте права доступа к файлам. Вы не можете практически ограничить доступ людей к системным вызовам, поэтому все, что кому-то нужно сделать, - это предоставить свою собственную копию любых «опасных» команд, которые вы не хотите, чтобы они выполняли, и вы забиты.

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

Чтобы настроить оболочку с ограниченным доступом пользователей, установите /bin/rbash (или аналогичный, большинство оболочек входят в ограниченный режим, когда двоичный файл называется r *** name *) в качестве оболочки пользователя. Затем отредактируйте **. Bashrc (или эквивалент) и установите $PATH в каталог, где хранятся все разрешенные двоичные файлы / сценарии.

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

Однако стандартные разрешения в Linux делают практически невозможным для обычного пользователя «нанести вред системе». Какой вред вы пытаетесь предотвратить? Запретить пользователям устанавливать программное обеспечение или запускать программы за пределами их домашнего каталога тривиально, и вы можете использовать chroot, чтобы заблокировать систему еще больше.

Вы можете попробовать [lshell] [1] (ограниченная оболочка).

lshell - это оболочка, написанная на Python, которая позволяет вам ограничить среду пользователя ограниченным набором команд, выбрать включение / отключение любой команды через SSH (например, SCP, SFTP, rsync и т. д.), регистрировать команды пользователя, реализовать ограничение по времени, и больше.

[1]: http://lshell.ghantoos.org/Overview lshell

То, как я обычно устанавливаю такие ограничения, требует выполнения нескольких условий, в противном случае ограничение можно легко обойти:

  • Пользователь не принадлежит wheel группа, единственная авторизованная для использования su (применяется через PAM).
  • Пользователю дается должным образом закреплен rbash с доступом только для чтения PATH указывая на частный ~/bin, этот ~/bin/ Каталог содержит ссылки на простые утилиты:

    $ ll ~/bin
    total 0
    lrwxrwxrwx. 1 root dawud 14 Sep 17 08:58 clear -> /usr/bin/clear*
    lrwxrwxrwx. 1 root dawud  7 Sep 17 08:58 df -> /bin/df*
    lrwxrwxrwx. 1 root dawud 10 Sep 17 08:58 egrep -> /bin/egrep*
    lrwxrwxrwx. 1 root dawud  8 Sep 17 08:58 env -> /bin/env*
    lrwxrwxrwx. 1 root dawud 10 Sep 17 08:58 fgrep -> /bin/fgrep*
    lrwxrwxrwx. 1 root dawud  9 Sep 17 08:58 grep -> /bin/grep*
    lrwxrwxrwx. 1 root dawud 10 Sep 17 08:58 rview -> /bin/rview*
    lrwxrwxrwx. 1 root dawud 13 Sep 17 08:58 rvim -> /usr/bin/rvim*
    lrwxrwxrwx. 1 root dawud 13 Sep 17 08:58 sudo -> /usr/bin/sudo*
    lrwxrwxrwx. 1 root dawud 17 Sep 17 08:58 sudoedit -> /usr/bin/sudoedit*
    lrwxrwxrwx. 1 root dawud 13 Sep 17 08:58 tail -> /usr/bin/tail*
    lrwxrwxrwx. 1 root dawud 11 Sep 17 08:58 wc -> /usr/bin/wc*
    
  • пользователю предоставляется ограниченная среда только для чтения (подумайте о таких вещах, как LESSSECURE, TMOUT, HISTFILE переменные).

  • пользователь отображается на пользователя SELinux staff_u и получил права выполнять команды от имени другого пользователя по мере необходимости через sudo.
  • пользователь /home, /tmp и возможно /var/tmp создаются с помощью /etc/security/namespace.conf:

    /tmp       /tmp/.inst/tmp.inst-$USER-     tmpdir:create   root
    /var/tmp   /tmp/.inst/var-tmp.inst-$USER- tmpdir:create   root
    $HOME      $HOME/$USER.inst/              tmpdir:create   root
    

    Также, /etc/security/namespace.init делает все скелетные файлы доступными только для чтения пользователю и принадлежит root.

Таким образом, вы можете выбрать, $USER может выполнять любую команду от своего имени (по ссылке в личном ~/bin каталог, предоставленный через /etc/skel, как описано выше), от имени другого пользователя (через sudo) или вообще нет.

Да, просто измените разрешения для этих команд.

У вас может быть больше шансов на победу, если написать команду оболочки, которая ведет себя в соответствии с вашими требованиями.

Что не подходит для разрешений по умолчанию для обычных пользователей Linux?