有谁知道是否可以通过目录的点斜杠符号来限制命令的执行?
环境是Linux上的bash。
例如,我有一个目录/usr/local/app/bin
。 In/usr/local/app/bin
是一个名为 foo 的命令。对于某些用户,我在登录期间为 foo 创建一个别名,将 foo 重定向到其他地方。
我不希望这些用户能够通过 cd'ing/usr/local/app/bin
并运行来直接运行 foo:
$ ./foo
这些用户需要能够在 /usr/local/app/bin 中运行其他命令,但如果他们被阻止通过./
.
最后,我的目标是限制某些用户在交互登录时交互执行 foo 。例如(大致),在 .bashrc 中:
if [ -z "$PS1" ]; then
:
else
alias foo="echo access denied!"
fi
这有效,除非用户可以使用 ./ 从 /usr/local/app/bin 直接运行 foo 该文件需要可执行,但仅当使用完整路径时。我希望有人知道一个聪明的方法来完成这个
答案1
一切皆有可能,取决于你想走多深。假设您不想侵入您的 shell、内核或进入 selinux 或 AppArmour。不,您无法在不更改文件系统权限或 acl 的情况下阻止人们执行 foo (通过 ./foo 或其他方式)。
在 Linux 上,可执行文件是根据文件权限和 posix acls 来执行的。如果他们可以执行它,那么他们就可以执行它,只有可执行文件本身可以检查它是否应该以完整路径运行。如果只是一个简单的路径问题,您可以将其包装在 shell 中并检查 $0 参数,但为了安全起见,这实际上只是一种混淆,任何有线索的人都会在几秒钟内绕过。
否则,这是通过 acls 以及用户和组可执行性来处理的。但是,您必须管理用户帐户、文件系统 ACL 和组。
通常文件由管理员帐户拥有,因此对于大多数用户帐户来说,他们通过组或其他权限执行操作。
删除“其他”的执行权限。
chmod o-x /path/to/foo
将 foo 的组成员身份移至受信任的组,并确保设置了组执行权限。
chgrp trusted /path/to/foo
chmod g+x /path/to/foo
现在您必须将所有用户应该能够将 foo 运行到受信任的组中。
for eachUser in a potentially a big long list of user accounts
do
usermod --append --groups trusted $eachUser
done
而这带来的管理开销就是传统 Unix 权限糟糕的原因。
对于 posix acls,您可以简单地将用户添加到文件中,但没有执行权限。使用 getfacl 读取访问控制列表。
for eachUser in a smaller list of restricted users
do
setfacl -m user:$eachUser:000 /path/to/foo
done
因为 acl 条目是针对用户帐户的,所以它优先于默认的用户/组/其他文件系统权限,并且用户对该文件没有权限。其他人都可以像平常一样使用该文件。
不过,从数学角度来说,更好的方法是将所有受限制的帐户放入一个组中,然后将该组添加到没有权限的文件中,而不是单个用户。