防止所有命令被定义为别名

αғs*_*нιη 10 bash alias

有没有办法防止所有命令都被定义为别名?

例如,用户不应该能够定义rm或任何其他命令(Ubuntu 默认命令)作为别名。

mur*_*uru 24

您无法阻止用户定义他们喜欢的任何别名。考虑:

  1. 您在/etc/bash.bashrc. 他们在任何他们选择的地方启用它。
  2. 您删除所有提到的别名/etc/bash.bashrc,以及所有~/.bashrc~/.bash_aliases通过脚本。他们将别名放在另一个文件中并获取它。
  3. 您在PROMPT_COMMAND其中运行禁用某些别名的命令。他们重新定义或取消定义PROMPT_COMMAND
  4. 您可以捕获DEBUG和取消定义别名。他们移除陷阱。
  5. 您将调用时的所有文件都 chown 到 root。他们使用另一个文件并手动获取它作为他们运行的第一个命令。
  6. 您禁用内置函数unset,builtinenable; alias一个函数declare -rf alias防止用户修改功能;并导出函数。他们跑/bin/bash--rcfile,并--init-file开始一个新的外壳,其中说,现在建宏被启用。
  7. ...

您可以在编译时禁用别名,然后由您来保持 bash 最新并确保您不受下一个 Shellshock 的影响。当然,用户可以构建自己的 bash。

  • @Rinzwind 他们运行 `\unalias unalias`。 (8认同)
  • 不过,我有一个有趣的想法:您可以使用别名别名 :=) (4认同)
  • 他们`unalias alias`。 (4认同)
  • @muru 当然,但你也可以别名 unalias :+ (4认同)

小智 10

TL; 博士

防止用户创建别名的唯一方法是为他们提供一个不支持别名的 shell。这通常是一个X / Y的问题,其中X是一个真正的威胁模型应与适当的控制或架构来解决,而不是试图解决的问题事后给予用户共享系统上的后壳。

下面,我提供了一个技术上正确的答案,以及一些关于这将解决和不会解决哪些问题的指导。我还提供了一些关于替代控制的额外指导。

使用 Bash 受限 Shell

您可以通过将 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 -imv -icp -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选项与条件匹配块一起使用。

  • 使用专为您的特定用例设计的特殊工具,如gitolitescponly

  • 使用chroot jail

  • 使用虚拟化(例如 Xen、OpenVZ、LXC、VMware、VirtualBox 或其他技术)来提供隔离的环境。

一旦您准确定义了威胁模型,您就可以确定最适合您的用例的控制措施。如果没有更有意义地理解为什么要防止混叠(例如,它解决了什么实际问题?),您就无法选择最合适的控件。


Ser*_*nyy 5

正如穆鲁的回答所示,这是一项毫无意义的努力。但是有一些选择,但它们并不完美。

根据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是一个选项。