# 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
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:~$
您无法阻止用户定义他们喜欢的任何别名。考虑:
/etc/bash.bashrc
。他们在任何他们选择的地方启用它。/etc/bash.bashrc
,以及所有~/.bashrc
和~/.bash_aliases
通过脚本。他们将别名放在另一个文件中并获取它。PROMPT_COMMAND
禁用某些别名的命令。他们重新定义或取消定义PROMPT_COMMAND
。DEBUG
和取消定义别名。他们移除了陷阱。unset
,builtin
并且enable
; 做alias
一个函数;declare -rf alias
防止用户修改功能;并导出函数。它们运行/bin/bash
并启动一个新的 shell--rcfile
,--init-file
现在启用了所说的内置函数。您可以在编译时禁用别名,然后由您来确保 bash 保持最新并确保您不受下一次 Shellshock 的影响。当然,用户可以构建自己的 bash。
TL;博士
阻止用户创建别名的唯一方法是为他们提供不支持别名的 shell。这通常是一个 X/Y 问题,其中 X 实际上是一个威胁模型,应该通过适当的控制或架构来解决,而不是在为用户提供共享系统上的 shell 之后尝试事后解决问题。
下面,我提供了一个技术上正确的答案,以及一些关于这将解决和不会解决哪些问题的指导。我还提供了一些关于替代控制的额外指导。
使用 Bash 受限外壳
您可以通过将 rbash 指定为用户的登录 shell来使用 Bash 的受限shell。例如:
然后,您必须禁用该用户的内置别名,最好不要破坏其他人的外壳。例如,您可以将以下内容添加到/etc/profile.d/rbash.sh等文件中:
注意事项
除非您已将用户放入 chroot 监狱或为他们提供不包括访问其他 shell的修改后的PATH
bash
,否则没有什么可以阻止用户在提示符下简单地键入并获得不受限制的 shell。此外,通过设计,受限 shell 可以防止许多常见活动,例如更改目录:
但不会阻止PATH中的其他脚本或程序这样做。这意味着您必须仔细设计用户的环境,特别是您需要防止他们能够修改其启动文件中的PATH,因为即使 rbash 将PATH设为只读,它也会在初始化后这样做。
更好的选择
即使您使用 rbash,您也需要将其作为更广泛的控件集的一部分。一些例子可能包括:
通过在/etc/bash.bashrc文件中提供默认别名(例如、和)来防止非技术用户意外调用危险命令。
rm -i
mv -i
cp -i
enable -n alias
如果你愿意,你可以把它和它结合起来。用于保护文件和目录的传统 Unix 权限或 POSIX ACL。
执行单个非交互式命令的登录。例如:
使用 per-key SSH 强制命令。例如:
使用带有条件匹配块的OpenSSH ForceCommand选项。
使用为您的特定用例设计的特殊工具,例如gitolite或scponly 。
使用chroot 监狱。
使用 Xen、OpenVZ、LXC、VMware、VirtualBox 等虚拟化技术或其他技术来提供隔离环境。
准确定义威胁模型后,您可以确定最适合您的用例的控制措施。如果没有更有意义地了解为什么要防止混叠(例如,它解决了哪些实际问题?),您将无法选择最合适的控件。
正如穆鲁的回答所示,这是一项毫无意义的努力。但是有一些选择,但它们并不完美。
根据
bash
手册,函数总是优先于别名,因此我们可以执行以下操作:您可以将函数定义放入系统范围内
.bashrc
,但是正如 muru 指出的那样,聪明的用户会找到方法来获取别名bashrc
,例如通过获取不同的文件。我玩过的另一个想法是
enable
内置的。alias
是一个内置的外壳,并且bash
有很好的enable
命令,允许启用或禁用内置。例如,这是我禁用alias
.同样,
bashrc
在这里使用系统范围是一个选项。您可以在调用 builtin 之前定义 (in
/etc/profile
) 一个调用的函数,该函数alias
执行您想要的验证(可能使用type -p
)(毕竟“Ubuntu 默认命令”是“可执行文件”) ,但是正如其他人指出的那样,您的用户可以获得周围。为什么不获取一组不同的用户,或者教育他们(“定义一个覆盖命令的方法是一种很好的自爆方式,并引起混乱(例如,为什么提示我输入密码?))?$PATH
alias
alias
ls