mur*_*uru 24
您无法阻止用户定义他们喜欢的任何别名。考虑:
/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。
小智 10
防止用户创建别名的唯一方法是为他们提供一个不支持别名的 shell。这通常是一个X / Y的问题,其中X是一个真正的威胁模型应与适当的控制或架构来解决,而不是试图解决的问题事后给予用户共享系统上的后壳。
下面,我提供了一个技术上正确的答案,以及一些关于这将解决和不会解决哪些问题的指导。我还提供了一些关于替代控制的额外指导。
您可以通过将 rbash 指定为用户的登录 shell来使用 Bash 的受限shell。例如:
foo:x:2001:2001:restricted user:/home/foo:/bin/rbash
Run Code Online (Sandbox Code Playgroud)
然后,您必须为用户禁用内置别名,最好不要破坏其他人的外壳。例如,您可以将以下内容添加到诸如/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
Run Code Online (Sandbox Code Playgroud)
除非您已将用户置于 chroot jail 中或为他们提供了不包括对其他 shell 的访问的修改后的PATH,否则没有什么可以阻止用户简单地bash在提示符下键入并获得不受限制的 shell。
此外,受限制的 shell 被设计为可防止许多常见活动,例如更改目录:
$ cd /tmp
rbash: cd: restricted
Run Code Online (Sandbox Code Playgroud)
但不会阻止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
Run Code Online (Sandbox Code Playgroud)使用每键 SSH 强制命令。例如:
# ~foo/.ssh/authorized_keys
command="/usr/local/bin/foo.sh" [remainder of line]
Run Code Online (Sandbox Code Playgroud)将OpenSSH ForceCommand选项与条件匹配块一起使用。
使用chroot jail。
使用虚拟化(例如 Xen、OpenVZ、LXC、VMware、VirtualBox 或其他技术)来提供隔离的环境。
一旦您准确定义了威胁模型,您就可以确定最适合您的用例的控制措施。如果没有更有意义地理解为什么要防止混叠(例如,它解决了什么实际问题?),您就无法选择最合适的控件。
正如穆鲁的回答所示,这是一项毫无意义的努力。但是有一些选择,但它们并不完美。
根据bash手册,函数总是优先于别名,因此我们可以执行以下操作:
xieerqi@eagle:~$ function alias { echo "Aliases are no-no" ; }
xieerqi@eagle:~$ alias TEST='rm'
Aliases are no-no
Run Code Online (Sandbox Code Playgroud)
您可以将函数定义放入 systemwide 中.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:~$
Run Code Online (Sandbox Code Playgroud)
同样,在系统范围内使用bashrc是一个选项。