Блокировать определенную команду в Linux для конкретного пользователя

27

Как заблокировать команду, скажем, mkdirдля конкретного пользователя?

То, что я сделал, только что создал функцию только для чтения и сохранил в профиле пользователя ~/.bashrc

/bin/mkdir() {
        echo "mkdir command not allow for you"

}

mkdir() {
        echo "mkdir command not allow for you"

}
./mkdir() {

        echo "mkdir command not allow for you"
}

readonly -f /bin/mkdir
readonly -f mkdir
readonly -f ./mkdir

Тест:

rahul@ubuntu:~$ cd /bin/
rahul@ubuntu:/bin$ ./mkdir /home/rahul/ggg
mkdir command not allow for you
rahul@ubuntu:/bin$ cd
rahul@ubuntu:~$ mkdir testing
mkdir command not allow for you
rahul@ubuntu:~$ /bin/mkdir testing
mkdir command not allow for you

Итак, мой вопрос: каким должен быть способ достижения этого? есть ли инструмент для этого?

Обновление 1 # Но если пользователь умен, он может скопировать двоичный файл mkdir, переименовать его и использовать. Так как этого добиться?

Рахул Патил
источник
7
Ваш пример потерпит неудачу, потому что пользователь может скомпилировать свой собственный mkdirи переименовать его, или даже просто скопировать и переименовать существующий двоичный файл. Также есть встроенная оболочка для переопределения псевдонимов и функций.
стружка
хм это правильно, так есть ли вообще?
Рахул Патил
также пользователю не нужно компилировать, он может легко скопировать и cp /bin/mkdir mkdir2использовать его :(
Rahul Patil
Создание каталога является настолько распространенной / фундаментальной задачей, что есть несколько способов сделать это, и было бы почти невозможно заблокировать их все (кроме того, что не позволил пользователю создавать файлы; т. Е. Защищал от записи все каталоги против него). Например, cp -r /usr/local/lib gggбудет создан каталог с именем ggg(содержащий копию содержимого /usr/local/lib, если таковое имеется, которое пользователь затем может просто удалить). Вы можете использовать, find / -type d -emptyчтобы найти пустой каталог для копирования.
G-Man говорит: «Восстановите Монику»

Ответы:

21

Я не знаю, как это сделать с помощью bash, но я знаю другую оболочку, которая ограничивает пользовательскую среду: lshell (ограниченная оболочка) .

Краткий обзор конфигурации

Lshell настраивается через INI-файл. По умолчанию он содержит белый список разрешенных команд, но его можно легко настроить, чтобы запретить пользователю использовать определенную команду.

Эта конфигурация (настройка по умолчанию /etc/lshell.conf) запрещает пользователю fooиспользовать mkdir:

[foo]
allowed = 'all' - ['mkdir', 'bash', 'sh', 'csh', 'dash', 'env']

Чтобы настроить учетную запись пользователя для использования lshell по умолчанию, необходимо:

 chsh -s /usr/bin/lshell foo

Lshell может сделать больше, например:

  • 3 уровня детализации: пользователь, группа, все.
  • Может ограничивать доступ к определенным путям в системе.
  • Можно ограничить использование определенных символов (например |).
  • Можно ограничить использование определенных команд только через SSH.

И больше.

Обновление 1 # Добавлен результат теста:

rahul:~$ which bash
/bin/bash
rahul:~$ dd if=$(which bash) of=my_bash
*** forbidden syntax: dd if=$(which bash) of=my_bash
rahul:~$ bash
*** forbidden command: bash
rahul:~$ cp /bin/bash my_bash
*** forbidden path: /bin/bash
rahul:~$ /bin/bash
*** forbidden command: /bin/bash
rahul:~$ sh
*** forbidden command: sh
rahul:~$ dash
*** forbidden command: dash
rahul:~$ env bash
*** forbidden command: env
rahul:~$ cp /bin/mkdir mycreatedir
*** forbidden path: /bin/mkdir
rahmu
источник
3
с allowed = 'all' - ['mkdir'], вы не можете просто казнить bashи быть неограниченным снова?
Дауд
3
Простите, извините, но есть еще много способов обойти ограничения, налагаемые этим списком, например dd if=$(which bash) of=my_bash && chmod u+x my_bash && ./my_bash. Я думаю, что проблема заключается в отсутствии ограничительной политики по умолчанию, т. Е. В этом сценарии вы предоставляете разрешения по умолчанию, затем разрешения DENY на основе списка, когда это должно быть наоборот: по умолчанию DENY, затем GRANT на основе политики ,
Дауд
1
@dawud: Я согласен с тем, что лучше поддерживать белый список разрешенных команд, чем иметь черный список, и надеяться, что пользователь не обойдет его, обойдя администратора.
Рахму
2
@ Марко, посмотрите пример, приведенный в моем ответе. Я предоставляю белый список разрешенных команд, и в этом сценарии пользователь не может просто cpдвоичный файл в его / ее PATH ( rootсобственный каталог rxдля пользователя) и rbashпрепятствует выполнению ./executables. Это отвечает на ваш вопрос?
Давуд
2
@ Dawud Это действительно так. Я пропустил каталог bin только для чтения.
Марко
15

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

  • Пользователь не принадлежит к 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выполнять ли mkdirего / ее от своего имени (через ссылку в личном ~/binкаталоге, предоставляемую через /etc/skel, как описано выше), от имени другого пользователя (через sudo) или вообще ничего.

Дауд
источник
4

Добавить фиктивную группу, добавьте пользователя в эту группу, chown root:somegroup /bin/mkdir, chmod g-x /bin/mkdir. Обратите внимание, что это зависит от того, что пользователь не может изменять свои группы. IIRC это верно в GNU / Linux, но не в некоторых других Unices.

strugee
источник
2
В большинстве файловых систем вы также можете использовать расширенные списки ACL для более детального контроля - количество необходимых групп будет расти в геометрической прогрессии в зависимости от количества пользователей (из-за возможных комбинаций), не говоря уже о проблемах именования.
Петер
2
добавить еще один пункт, а также удалить разрешение на чтение от других пользователей 710, чтобы пользователь не мог копировать и переименовывать этот двоичный файл, не так ли?
Рахул Патил
1
@RahulPatil да, и, конечно, вам нужно ограничить использование компилятора.
Петер
1

Лучшее, что я тестировал, это использовать Profile.d лучший и самый безопасный способ

Шаг № 1 (создание файла псевдонимов)

[root@newrbe ~]# vim /etc/customalias.sh

Добавить ниже линии:

alias rm="echo remove contenet is restricted"
alias poweroff="echo Poweroff is restricted"
alias chmod="echo Change Permission is restristed"

Сохранить и выйти

Шаг № 2 (Создать загрузчик профиля)

/etc/profile.d/ это место содержит файлы для завершения bash

[root@newrbe ~]# vim /etc/profile.d/customsource.sh

Добавьте строки ниже под файлами, эти строки будут блокировать упомянутые команды для пользователей ниже

if [ `whoami` == "user1" ] && [ `whoami` == "user2" ]; then
    source /etc/customalias.sh
fi

сохранить и выйти

Теперь выйдите и перезапустите

С уважением, -Mansur

Мансур Али
источник
/etc/profile.d/не для bashзавершения , это место для размещения настроек сеанса входа для пользователей, использующих POSIX-подобные оболочки входа, так что обычно это не то место, куда bashпошли /etc/bash.bashrcбы настройки псевдонимов (что было бы лучше ), и он должен иметь синтаксис оболочки POSIX (так, как правило, .вместо из sourceи =вместо ==).
Стефан Шазелас
-1

установить sudoers и попытаться настроить там, чьи пользователи и какая команда.

mark.praktisero
источник
4
Добро пожаловать в SX. Пожалуйста, добавьте детали к вашему ответу; ОП или кто-либо еще, кто будет читать этот вопрос в будущем, может не знать об этом sudo.
Джозеф Р.
Этот ответ просто неверен
kiltek