Блокувати окремі команди в 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і перейменувати його, або навіть просто скопіювати та перейменувати існуючий бінарний файл. Також є вбудована оболонка для перекриття псевдонімів та функцій.
strugee

хм, це правильно, так це все-таки?
Рахул Патіль

також користувачеві не потрібно збирати, він може легко скопіювати, 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

3
з allowed = 'all' - ['mkdir'], хіба ви не можете просто виконати bashі знову не обмежуватись?
dawud

3
Вибачте, просто вибачте, але є ще багато способів обійти обмеження, накладені цим списком, наприклад dd if=$(which bash) of=my_bash && chmod u+x my_bash && ./my_bash. Я думаю, що проблема полягає у відсутності обмежувальної політики за замовчуванням, тобто в цьому сценарії ви надаєте дозволи за замовчуванням, а потім DENY дозволів на основі списку, коли це має бути навпаки: DENY за замовчуванням, то GRANT на основі політики .
dawud

1
@dawud: Я погоджуюся, що підтримка білого списку дозволених команд є кращим підходом, ніж наявність чорного списку та сподівання, що користувач не обійде його, вигадавши адміністратора.
rahmu

2
@Marco, подивись приклад, поданий у моїй відповіді. Я надаю білий список дозволених команд, і в цьому сценарії користувач не може просто cpдвійковий код до свого PATH ( rootвласника каталогу rxдля користувача) і rbashне дозволяє виконувати ./executables. Це відповідає на ваше запитання?
dawud

2
@dawud Дійсно. Я пропустив каталог лише для читання.
Марко

15

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

  • Користувач не належить до wheelгрупи, єдиний, дозволений до використання su(застосовується через PAM).
  • Користувачеві надається належним чином захищений rbashPATH лише для читання, що вказує на приватне ~/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.


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

зберегти та кинути

Тепер Вийдіть і перегляньте

З повагою, -Мансур


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

-1

встановіть sudoers і спробуйте налаштувати там, чиї користувачі та яка команда.


4
Ласкаво просимо до SX. Будь ласка, додайте деталі до своєї відповіді; ОП чи хтось, хто читає це питання в майбутньому, можуть не знати sudo.
Джозеф Р.

Ця відповідь явно неправильна
kiltek
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.