Запретить определение всех команд как псевдонима


10

Есть ли способ предотвратить определение всех команд в качестве псевдонима?

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


Что ты конкретно имеешь ввиду? Вы ищете что-то вроде «мягкого блока», чтобы случайно не сделать это случайно?
Кос

4
Я не уверен, какой смысл делать это, даже если бы это было возможно.
Муру

4
какая логика для этого? Это не мешает пользователю вводить фактическую команду ... так что я не вижу причин для кого-либо блокировать псевдонимы?
Rinzwind

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

Не блокируя все псевдонимы, только запретите ему / ей не использовать имя команды по умолчанию в качестве псевдонима. Я знаю, что мы можем избежать псевдонимов многими способами, такими как использование \ с той же командой псевдонимов для запуска фактической команды. Это все
αғsнιη

Ответы:


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. Конечно, пользователи могут создавать свои собственные bash.


4
У меня была немного забавная идея: вы можете использовать псевдоним: =)
Rinzwind

4
И они unalias alias.
Муру

4
@muru конечно, но вы также можете использовать псевдоним unalias: +
Rinzwind

8
@Rinzwind и они бегут \unalias unalias.
Муру

10

TL; DR

Единственный способ запретить пользователю создавать псевдонимы - предоставить ему оболочку, которая не поддерживает псевдонимы. Как правило, это проблема X / Y, где X на самом деле представляет собой модель угрозы, которую следует решать с помощью соответствующих элементов управления или архитектур, а не пытаться решить проблему постфактум после того, как пользователь получит оболочку в общей системе.

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

Использование Bash Restricted Shell

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

Предостережения

Если вы не поместили пользователя в изолированную тюрьму или не предоставили ему измененную переменную 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 с условным блоком Match.

  • Используйте специальные инструменты, такие как Gitolite или 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в целом, однако, как указал muru, умные пользователи найдут способ получить псевдонимы, например, используя другой 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системы здесь вариант.


Не блокирует все псевдонимы, только встроенные команды, а не сам псевдоним :)
αғsнιη

@ 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.