限制标准用户运行带有特定参数的命令

限制标准用户运行带有特定参数的命令

我知道如何通过删除该命令的执行权限来限制标准用户运行该命令。但是否可以限制标准用户运行带有特定选项/参数的命令?

例如,标准用户应该能够运行以下命令:

ls

但不是:

ls -l

我认为这是可能的,因为有一些命令,例如chshpasswd标准用户可以运行它们,但当他运行chsh root或 时,他的权限被拒绝passwd -a -S

答案1

我认为唯一的方法是将您自己的包装器写入有问题的命令/实用程序,并让它根据启动它的用户的 (E)UID 来决定允许或不允许什么。您提到的工具可以执行此操作,例如chshpasswd将此功能内置到其实现中。

如何编写包装器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 运行的命令通常具有非常强大且复杂的语法,并且尝试过滤可能会留下漏洞并破坏内容。lsls

我认为这是可能的,因为有一些命令,例如chshpasswd标准用户可以运行它们,但当他运行chsh root或 时,他的权限被拒绝passwd -a -S

这完全是另一回事,因为这些程序就是这样编写的。如果您想像更改 的行为一样更改它们的行为ls,则必须修改它们的源代码并重新编译它们。

相关内容