Предотвращать, чтобы все команды определялись как псевдоним

9

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

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

    
задан αғsнιη 09.01.2016 в 17:13
источник

4 ответа

23

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

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

Вы можете отключить псевдонимы во время компиляции, тогда вам будет необходимо обновить bash и убедиться, что следующий Shellshock не затронут. Конечно, пользователи могли бы создать свой собственный bash.

    
ответ дан muru 09.01.2016 в 17:48
источник
9

TL; DR

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

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

Использование оболочки Bash Restricted

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

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

$ cd /tmp
rbash: cd: restricted

, но не предотвращает выполнение других сценариев или программ в PATH . Это означает, что вы должны тщательно обрабатывать среду пользователя и, в частности, чтобы вы не могли модифицировать PATH в своих файлах запуска, потому что, хотя rbash делает PATH только для чтения он делает это после инициализации.

Лучший выбор

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

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

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

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

    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 с условным блоком соответствия.

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

  • Используйте тюрьму chroot .

  • Используйте виртуализацию, такую ​​как Xen, OpenVZ, LXC, VMware, VirtualBox или другие технологии для обеспечения изолированной среды.

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

ответ дан CodeGnome 09.01.2016 в 20:12
5

Это довольно бессмысленное усилие, как показывает ответ муру. Но есть некоторые варианты, но они не идеальны.

Согласно руководству bash , функции всегда имеют приоритет над псевдонимами, поэтому мы могли бы сделать следующее:

[email protected]:~$ function alias { echo "Aliases are no-no" ; }
[email protected]:~$ alias TEST='rm'
Aliases are no-no

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

Еще одна идея, с которой я играл, - это enable встроенный. alias - это встроенная оболочка, а bash имеет хорошую команду enable , которая позволяет включать или отключать встроенные функции. Например, я отключил alias .

[email protected]:~$ enable -n alias
[email protected]:~$ alias
No command 'alias' found, did you mean:
 Command '0alias' from package 'zeroinstall-injector' (universe)
alias: command not found
[email protected]:~$ alias TEST='rm'
No command 'alias' found, did you mean:
 Command '0alias' from package 'zeroinstall-injector' (universe)
alias: command not found
[email protected]:~$ enable alias
[email protected]:~$ 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'
[email protected]:~$ 

Опять же, использование системного bashrc здесь является опцией.

    
ответ дан Sergiy Kolodyazhnyy 09.01.2016 в 18:00
0

Вы могли определить (в /etc/profile ) функцию с именем alias , которая делает требуемую проверку (возможно, используя type -p ) (ведь «команды по умолчанию Ubuntu» являются «исполняемыми файлами в $PATH ") перед вызовом встроенного alias , НО, как указывали другие, ваши пользователи могут обойти это. Почему бы не получить другой набор пользователей или не обучить их («Определение alias , которое переопределяет команду, является очень хорошим способом съемки в ногу и вызывает путаницу (например, почему ls запрашивает мой пароль ?))?     

ответ дан waltinator 09.01.2016 в 18:00