我知道如何通过删除该命令的执行权限来限制标准用户运行该命令。但是否可以限制标准用户运行带有特定选项/参数的命令?
例如,标准用户应该能够运行以下命令:
ls
但不是:
ls -l
我认为这是可能的,因为有一些命令,例如chsh
或passwd
标准用户可以运行它们,但当他运行chsh root
或 时,他的权限被拒绝passwd -a -S
。
答案1
我认为唯一的方法是将您自己的包装器写入有问题的命令/实用程序,并让它根据启动它的用户的 (E)UID 来决定允许或不允许什么。您提到的工具可以执行此操作,例如chsh
或passwd
将此功能内置到其实现中。
如何编写包装器ls
#!/usr/bin/perl
use strict;
use warnings;
my $problematic_uid = 1000; # For example
my $is_problematic = $< == $problematic_uid;
unless(/ -l / ~~ @ARGV or $is_problematic){
exec qq{/new/path/to/ls }.join '',@ARGV
}else{
die "Sorry, you are not allowed to use the -l option to ls\n"
}
您需要确保原始路径ls
不在您的用户的PATH
.这就是我写的原因/new/path/to/ls
。问题是,这个包装器要求您的用户能够执行原始包装器ls
,因此用户仍然可以通过ls
直接调用原始包装器来规避它。
答案2
chsh
像和 这样的命令passwd
是专门编码的。他们以额外的特权运行(他们是设定值) root) 并包含自己的授权机制。两者都会检查哪个用户正在调用它们,并仅允许非 root 用户使用其功能的子集。
chsh
并且passwd
是例外。大多数命令并不关心谁调用它们。
禁止用户运行某个特定命令是毫无意义的:他们可以通过其他方式执行该命令执行的任何操作,例如通过提供自己的可执行文件。
您可以创建一个受限帐户,只允许运行一组列入白名单的命令:使用受限外壳,或仅用于数据传输的帐户,rssh 或 scponly。
如果您希望允许用户以提升的权限运行某个命令(通常通过sudo
),但仅限于某些选项组合,则编写一个包装器脚本来检查选项并允许用户运行该包装器脚本。
答案3
Rahul 的答案与您的问题相关,因为您想要的是 a) 不是一个好主意 b) 可能只能通过创建自定义 shell 来实现。像这样的可执行文件ls
是单独的、独立的程序,它们自行处理它们的参数 - 如果您想阻止用户使用ls -l
,您必须编写并编译您自己的自定义ls
.正如您可能想象的那样,这并不容易,而且还需要花费大量时间,因为您必须对要更改的每个命令执行此操作。
你可以或许bash
尝试用过滤用户命令的不同 shell 完全替换整个 shell(在您的情况下可能)。例如,它可以尝试在实际调用之前-l
从命令行中删除.但这并不像听起来那么容易,因为 shell 以及可以从 shell 运行的命令通常具有非常强大且复杂的语法,并且尝试过滤可能会留下漏洞并破坏内容。ls
ls
我认为这是可能的,因为有一些命令,例如
chsh
或passwd
标准用户可以运行它们,但当他运行chsh root
或 时,他的权限被拒绝passwd -a -S
。
这完全是另一回事,因为这些程序就是这样编写的。如果您想像更改 的行为一样更改它们的行为ls
,则必须修改它们的源代码并重新编译它们。