Не дозволяйте всім командам визначатись як псевдонім


10

Чи є спосіб запобігти визначенню всіх команд як псевдонім?

Наприклад, користувач не повинен мати змогу визначати rmбудь-яку іншу команду (команди за замовчуванням Ubuntu) як псевдонім.


Що саме ви маєте на увазі? Ви шукаєте щось на кшталт "м'якого блоку", щоб не допустити цього випадково?
kos

4
Я не впевнений, у чому сенс цього робити, навіть якщо це було можливо.
муру

4
яка була б логіка для цього? Це не заважає користувачеві вводити фактичну команду ... тож я не бачу причин комусь потрібно блокувати псевдоніми?
Rinzwind

2
Як сказав Муру і Рінцвінд, у чому сенс? Псевдоніми не можуть робити більш небезпечні речі, ніж ті, що користувачеві вже дозволено, але блокування псевдонімів просто ускладнює життя користувача. Крім того, яким би не було рішення (наприклад, використання псевдоніму / функції для заміщення вбудованого), я не можу придумати спосіб зробити так, щоб його не обходили самі користувачі, якщо тільки не заблокувати їх ~/.bashrc.
kos

Не блокуючи всіх псевдонімів, лише заважайте йому / їй не використовувати ім'я команд за замовчуванням як ім'я псевдоніма. Я знаю, що ми можемо уникнути псевдонімів багатьма способами, такими як використання \ з такою ж псевдонімою для виконання фактичної команди. Це все
αғsnιη

Відповіді:


24

Ні в якому разі не можна перешкоджати користувачеві визначати псевдоніми, які він надає перевагу. Поміркуйте:

  1. Ви вимкнете псевдоніми в /etc/bash.bashrc. Вони дозволяють зробити це де завгодно.
  2. Ви видаляєте всі згадки псевдонімів /etc/bash.bashrc, а також усі ~/.bashrcта ~/.bash_aliasesза допомогою сценарію. Вони розміщують свої псевдоніми в інший файл і джерело його.
  3. Ви запускаєте команду, PROMPT_COMMANDяка вимикає певні псевдоніми. Вони переосмислюють або не визначають PROMPT_COMMAND.
  4. Ви захоплюєте DEBUGта не визначаєте псевдоніми. Вони знімають пастку.
  5. Ви порушуєте всі файли, отримані при виклику до root. Вони використовують інший файл і джерело його вручну в якості першої команди, яку вони виконують.
  6. Ви вимикаєте вбудовані unset, builtinі enable; зробити aliasфункцію ; declare -rf aliasне дозволяти користувачам змінювати функцію; і експортувати функцію. Вони працюють /bin/bashз --rcfileі --init-fileпочати нову оболонку, в якій сказав вбудовані функції тепер включені.
  7. ...

Ви можете вимкнути псевдоніми під час компіляції, тоді вам слід буде постійно оновлювати bash та переконайтесь, що наступний Shellshock не вплине на вас. Звичайно, користувачі могли б створити власний баш.


4
Хоч у мене була трохи кумедна ідея: ти можеш псевдонім псевдонім: =)
Rinzwind

4
І вони unalias alias.
муру

4
@muru впевнений, але ви також можете отримати псевдонім unalias: +
Rinzwind

8
@Rinzwind і вони біжать \unalias unalias.
муру

10

TL; DR

Єдиний спосіб запобігти користувачеві створювати псевдоніми - це надати їм оболонку, яка не підтримує псевдонім. Це, як правило, проблема X / Y, де X - це дійсно модель загрози, яку слід вирішувати за допомогою відповідних елементів керування чи архітектури, а не намагатися вирішити проблему постфакту після того, як користувачеві надано оболонку в загальній системі.

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

Використання обмеженої оболонки Bash

Ви можете використовувати обмежену оболонку Bash, призначивши rbash як оболонку входу користувача. Наприклад:

foo:x:2001:2001:restricted user:/home/foo:/bin/rbash

Потім потрібно вимкнути вбудований псевдонім для користувача, бажано, не порушуючи також оболонки інших. Як приклад, ви можете додати наступне до файлу, такого як /etc/profile.d/rbash.sh :

# Limit effect to users in a specific UID range.
if ((UID >= 2000)) && ((UID < 3000)); then
    # Check shell options; disable alias builtins when shell is restricted.
    if [[ $- =~ r ]]; then
        enable -n alias
        enable -n unalias
    fi
fi

Коваджі

Якщо ви не помістили користувача у в'язницю chroot або не надали їм модифікований PATH , який не включає доступ до інших оболонок, ніщо не зупиняє користувача просто вводити bashпідказку та отримувати необмежену оболонку.

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

$ cd /tmp
rbash: cd: restricted

але не заважає цим робити інші сценарії чи програми в PATH . Це означає, що ви повинні ретельно опрацювати середовище користувача, а саме, що вам потрібно не допустити їх зміни в PATH у файлах запуску, оскільки, хоча rbash робить PATH лише для читання, це робиться після ініціалізації.

Кращий вибір

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

  • Запобігання нетехнічних користувачів від випадкового посилаються небезпечних команд, надаючи псевдоніми по замовчуванням , такі як rm -i, mv -iі cp -iв /etc/bash.bashrc файл.

    • З огляду на ваш оригінальний приклад, це, мабуть, найбільш розумне рішення.
    • Ви можете комбінувати це, enable -n aliasякщо хочете.
    • Це не завадить знаючим користувачам змінювати псевдоніми, але це може бути достатньо для того, щоб не-технічні користувачі могли робити все, що вас цікавить.
  • Традиційні дозволи Unix або POSIX ACL для захисту файлів і каталогів.

  • Логіни, які виконують одну неінтерактивну команду. Наприклад:

    foo:x:2001:2001:run foo.sh:/home/foo:/usr/local/bin/foo.sh
  • Використовуйте примусові команди SSH за ключ. Наприклад:

    # ~foo/.ssh/authorized_keys
    command="/usr/local/bin/foo.sh" [remainder of line]
  • Використовуйте опцію OpenSSH ForceCommand з блоком умовного матчу.

  • Використовуйте спеціальні інструменти, такі як гітоліт або scponly, розроблені для вашого конкретного випадку використання.

  • Використовуйте в'язницю Chroot .

  • Використовуйте віртуалізацію, наприклад Xen, OpenVZ, LXC, VMware, VirtualBox або інші технології, щоб забезпечити відокремлене середовище.

Після того, як ви точно визначили модель загрози, ви зможете визначити найбільш підходящий елемент управління для вашого випадку використання. Без більш осмисленого розуміння того, чому ви хочете запобігти згладжування (наприклад, яку проблему в реальному світі вона вирішує?), Ви не можете вибрати найбільш відповідні елементи управління.


+1 загалом, але також спеціально для класифікації цього як X / Y проблеми.
Джо

5

Це досить безглузде починання, як свідчить відповідь Муру. Але є деякі варіанти, але вони не є ідеальними.

Згідно з bashпосібником, функції завжди мають перевагу над псевдонімами, тому ми можемо зробити наступне:

xieerqi@eagle:~$ function alias { echo "Aliases are no-no" ; }
xieerqi@eagle:~$ alias TEST='rm'
Aliases are no-no

Ви можете розмістити визначення функції в загальносистемній системі .bashrc, однак, як зазначив Муру, розумні користувачі знайдуть спосіб отримати псевдоніми, bashrcнаприклад, зібравши інший файл.

Ще одна ідея, з якою я грав, є enableвбудованою. aliasце вбудована оболонка і bashмає гарну enableкоманду, яка дозволяє вмикати або вимикати вбудовані файли. Наприклад, ось мене відключення alias.

xieerqi@eagle:~$ enable -n alias
xieerqi@eagle:~$ alias
No command 'alias' found, did you mean:
 Command '0alias' from package 'zeroinstall-injector' (universe)
alias: command not found
xieerqi@eagle:~$ alias TEST='rm'
No command 'alias' found, did you mean:
 Command '0alias' from package 'zeroinstall-injector' (universe)
alias: command not found
xieerqi@eagle:~$ enable alias
xieerqi@eagle:~$ alias
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias ls='ls --color=auto'
xieerqi@eagle:~$ 

Знову ж таки, використання bashrcтут є системою.


Не блокуючи всіх псевдонімів, лише вбудовані команди не псевдонім :)
αғsnιη

@ Afshin.Hamedi Ну, що таке команда за замовчуванням? Той, що поставляється з ubuntu? Це означає, що вам доведеться мати список усіх команд (бінарних файлів), які поставляються із встановленням за замовчуванням. Потім кожен раз, коли користувач завантажує оболонку або намагається щось псевдоніму rm, він перевіряє список. Враховуючи, що списки були б досить великими, починати потрібно багато часу, ваші користувачі будуть багато скаржитися на вас і ненавидіти вас як системного адміністратора :)
Сергій Колодяжний,

Це веселе, дивовижне питання, яке мені подобається! Вибіркове псевдонім було б непогано. Але я сумніваюся, що це досяжно, якщо тільки розробники оболонок не знайдуть необхідності в його реалізації :)
Сергій Колодяжний,

Ідея функції була приємною. Це підійшло найближче.
муру

0

Ви можете визначити (в /etc/profile) функцію, aliasяка називається, яка робить перевірку, яку ви хочете (можливо, використовуєте type -p) (адже "Команди за замовчуванням Ubuntu" є "виконуваними $PATH"), перш ніж викликати вбудований alias, АЛЕ, як зазначали інші, ваші користувачі могли отримати навколо цього. Чому б не отримати інший набір користувачів або не навчити їх ("Визначення команди, aliasщо перекриває команду, - це дуже хороший спосіб стріляти в ногу і викликати плутанину (наприклад, чому lsзапит на пароль?))?

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