有没有一种方法可以防止将所有命令定义为别名?
例如,用户不应将rm
别名或任何其他命令(Ubuntu默认命令)定义为别名。
~/.bashrc
。
有没有一种方法可以防止将所有命令定义为别名?
例如,用户不应将rm
别名或任何其他命令(Ubuntu默认命令)定义为别名。
~/.bashrc
。
Answers:
您无法阻止用户定义他们喜欢的任何别名。考虑:
/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
一起运行并启动一个新的Shell,现在已启用其中的内置功能。您可以在编译时禁用别名,然后由您决定是否保持bash的最新状态,并确保您不受下一次Shellshock的影响。当然,用户可以构建自己的bash。
unalias alias
。
\unalias unalias
。
阻止用户创建别名的唯一方法是为他们提供不支持别名的外壳。通常,这是一个X / Y问题,其中X实际上是一种威胁模型,应该使用适当的控件或体系结构来解决,而不是在为用户提供共享系统上的Shell之后尝试事后解决问题。
下面,我提供一个技术上正确的答案,以及有关将解决哪些问题以及不会解决哪些问题的一些指导。我还提供了有关替代控件的其他指导。
您可以通过将rbash分配为用户的登录shell 来使用Bash的受限 shell。例如:
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监狱或为他们提供了不包含对其他shell的访问权限的修改后的PATH,否则没有什么可以阻止用户简单地bash
在提示符下键入并获得不受限制的shell。
此外,通过设计,受限制的外壳程序可防止许多常见的活动,例如更改目录:
$ cd /tmp
rbash: cd: restricted
但不会阻止PATH中的其他脚本或程序这样做。这意味着您必须精心设计用户的环境,尤其是需要防止他们能够在其启动文件中修改PATH,因为即使rbash 在初始化后也将PATH设置为只读。
即使使用rbash,您也需要将其作为更广泛的控件集的一部分。一些示例可能包括:
通过在/etc/bash.bashrc文件中提供默认别名(例如,),防止非技术用户意外调用危险命令。rm -i
mv -i
cp -i
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块一起使用。
使用chroot监狱。
使用Xen,OpenVZ,LXC,VMware,VirtualBox等虚拟化技术或其他技术来提供隔离的环境。
准确定义威胁模型后,您可以为您的用例确定最合适的控制。如果对为什么要防止混淆(例如,它解决了什么现实问题?)没有更有意义的理解,您将无法选择最合适的控件。
正如muru的回答所示,这是一项毫无意义的工作。但是有一些选择,但并不完美。
根据bash
手册,函数始终优先于别名,因此我们可以执行以下操作:
xieerqi@eagle:~$ function alias { echo "Aliases are no-no" ; }
xieerqi@eagle:~$ alias TEST='rm'
Aliases are no-no
您可以将函数定义放到系统范围内.bashrc
,但正如muru指出的那样,聪明的用户将找到方法来获取别名bashrc
,例如通过提供不同的文件。
我玩过的另一个想法是enable
内置的。
alias
是内置的Shell,并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
,它都会检查列表。考虑到列表很大,启动需要很长时间,您的用户会抱怨很多,并且讨厌您作为系统管理员:)