Есть ли способ предотвратить определение всех команд в качестве псевдонима?
Например, пользователь не должен быть в состоянии определить rm
или любую другую команду (команды по умолчанию Ubuntu) в качестве псевдонима.
~/.bashrc
.
Есть ли способ предотвратить определение всех команд в качестве псевдонима?
Например, пользователь не должен быть в состоянии определить rm
или любую другую команду (команды по умолчанию Ubuntu) в качестве псевдонима.
~/.bashrc
.
Ответы:
Вы не можете запретить пользователю определять псевдонимы, которые он предпочитает. Рассматривать:
/etc/bash.bashrc
. Они делают это везде, где хотят./etc/bash.bashrc
, и все ~/.bashrc
и ~/.bash_aliases
через скрипт. Они помещают свои псевдонимы в другой файл и получают его.PROMPT_COMMAND
которая отключает определенные псевдонимы. Они переопределяют или не определяют PROMPT_COMMAND
.DEBUG
и не определяете псевдонимы. Они удаляют ловушку.unset
, builtin
и enable
; сделать alias
функцию ; declare -rf alias
запретить пользователям изменять функцию; и экспортировать функцию. Они работают /bin/bash
с --rcfile
и --init-file
начать новую оболочку, в которой сказал встроенные функции теперь включены.Вы можете отключить псевдонимы во время компиляции, тогда вам будет необходимо обновлять bash и следить за тем, чтобы на вас не повлиял следующий Shellshock. Конечно, пользователи могут создавать свои собственные bash.
unalias alias
.
\unalias unalias
.
Единственный способ запретить пользователю создавать псевдонимы - предоставить ему оболочку, которая не поддерживает псевдонимы. Как правило, это проблема X / Y, где X на самом деле представляет собой модель угрозы, которую следует решать с помощью соответствующих элементов управления или архитектур, а не пытаться решить проблему постфактум после того, как пользователь получит оболочку в общей системе.
Ниже я приведу технически правильный ответ, а также несколько советов о том, какие проблемы это будет и не будет решать. Я также даю некоторые дополнительные рекомендации по альтернативным средствам управления.
Вы можете использовать ограниченную оболочку 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 или другие технологии, чтобы обеспечить отдельную среду.
После того, как вы точно определили свою модель угрозы, вы можете определить наиболее подходящие элементы управления для вашего варианта использования. Без более осмысленного понимания того, почему вы хотите предотвратить алиасинг (например, какую реальную проблему это решает?), Вы не сможете выбрать наиболее подходящие элементы управления.
Это довольно бессмысленная попытка, как показывает ответ Муру. Но есть несколько вариантов, но они не идеальны.
Согласно 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
системы здесь вариант.
rm
, он проверяет список. Учитывая, что списки были бы довольно большими, для их запуска потребовалось бы много времени, ваши пользователи будут часто жаловаться на вас и ненавидеть вас как системного администратора :)
Вы можете определить (в /etc/profile
) функцию, вызываемую, alias
которая выполняет требуемую проверку (возможно, с использованием type -p
) (после того, как все «команды по умолчанию в Ubuntu» являются «исполняемыми файлами в $PATH
»), перед вызовом встроенной функции alias
, НО, как указали другие, ваши пользователи могут получить вокруг этого. Почему бы не получить другой набор пользователей или не обучить их («Определение alias
переопределения команды - очень хороший способ выстрелить себе в ногу и вызвать путаницу (например, почему ls
запрашивается мой пароль?))?