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


10

有没有一种方法可以防止将所有命令定义为别名?

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


你到底是什么意思 您是否正在寻找诸如“软块”之类的东西来防止自己意外地这样做?
kos

4
我不确定这样做的意义何在,即使有可能。
大师

4
这样做的逻辑是什么?它不会阻止用户键入实际命令……因此,我认为没有理由让任何人需要阻止别名吗?
Rinzwind '16

2
就像穆鲁和林兹温德(Rinzwind)说的那样,这有什么意义?别名不能做比允许用户已经做的事情更糟糕的事情,阻止别名只会使用户的生活更加艰难。同样无论解决方案是什么(例如使用别名/函数覆盖内置函数),我都无法想到一种使用户自己无法绕过它的方法,除非通过锁定他们的~/.bashrc
kos

不阻止所有别名,仅阻止他/她不使用默认命令名作为别名。我知道我们可以通过多种方式对别名进行转义,例如使用\与相同的别名命令来运行实际命令。这是所有
αғsнιη

Answers:


24

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

  1. 您在中禁用了别名/etc/bash.bashrc。他们可以在任何选择的地方启用它。
  2. 您删除所有提到的别名/etc/bash.bashrc,以及所有~/.bashrc~/.bash_aliases通过脚本。他们将别名放在另一个文件中并提供源文件。
  3. 您在PROMPT_COMMAND其中运行命令以禁用某些别名。他们重新定义或未定义PROMPT_COMMAND
  4. 您捕获DEBUG并取消定义别名。他们清除了陷阱。
  5. 您将所有在调用时来源的文件都切成根。他们使用另一个文件,并将其作为运行的第一个命令手动获得该文件。
  6. 您禁用内置函数unsetbuiltin并且enable; 发挥alias作用 ; declare -rf alias防止用户修改功能;并导出功能。它们/bin/bash--rcfile--init-file一起运行并启动一个新的Shell,现在已启用其中的内置功能。
  7. ...

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


4
不过我有一个有趣的主意:您可以为别名别名==)
Rinzwind

4
而且他们unalias alias
大师

4
@muru当然可以,但您也可以为unalias加上别名:+
Rinzwind

8
@Rinzwind他们跑了\unalias unalias
大师

10

TL; DR

阻止用户创建别名的唯一方法是为他们提供不支持别名的外壳。通常,这是一个X / Y问题,其中X实际上是一种威胁模型,应该使用适当的控件或体系结构来解决,而不是在为用户提供共享系统上的Shell之后尝试事后解决问题。

下面,我提供一个技术上正确的答案,以及有关将解决哪些问题以及不会解决哪些问题的一些指导。我还提供了有关替代控件的其他指导。

使用Bash受限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 -imv -icp -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块一起使用。

  • 像使用专用工具gitolitescponly专为您的具体使用情况。

  • 使用chroot监狱

  • 使用Xen,OpenVZ,LXC,VMware,VirtualBox等虚拟化技术或其他技术来提供隔离的环境。

准确定义威胁模型后,您可以为您的用例确定最合适的控制。如果对为什么要防止混淆(例如,它解决了什么现实问题?)没有更有意义的理解,您将无法选择最合适的控件。


通常为+1,但也专门用于将其分类为X / Y问题。

5

正如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在这里使用系统范围也是一种选择。


不堵的所有别名,仅内置不是别名本身:)命令
αғsнιη

@ Afshin.Hamedi那么,默认命令是什么?ubuntu附带的一个?这意味着您必须拥有默认安装随附的所有命令(二进制文件)的列表。然后,每当用户加载shell或尝试为别名时rm,它都会检查列表。考虑到列表很大,启动需要很长时间,您的用户会抱怨很多,并且讨厌您作为系统管理员:)
Sergiy Kolodyazhnyy

您有一个有趣,令人敬畏的问题,我喜欢!选择性别名会很好。但是我怀疑它是否可以实现,除非shell开发人员发现需要实现它:)
Sergiy Kolodyazhnyy 2016年

函数的想法很好。最接近。
大师

0

可以定义(中/etc/profile)被调用函数alias该做你想要的(可能使用验证type -p)(所有的“Ubuntu的默认命令”之后是“可执行文件中$PATH调用内建之前”) alias,但是,正如其他人指出,您的用户可以得到在那附近。为什么不获得一组不同的用户或进行培训(“定义一个alias覆盖命令的用户是一个很好的方式,使自己陷入困境,并引起混乱(例如,为什么ls提示输入密码?)”)?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.