RHEL 7/CentOS 7 sudo示例

1.允许非root用户访问执行systemctl命令

在此示例中,我们假设您知道要授予用户 sudo 访问权限的命令

jack ALL=(ALL) /usr/bin/systemctl restart crond.service

2.允许非root用户运行多个命令

在这里,我们可以给出由逗号分隔的命令列表,如下所示

jack ALL=(ALL) /usr/bin/systemctl restart crond.service, /usr/bin/systemctl status crond.service, /usr/bin/systemctl reload crond.service

或者我们可以创建一个 Cmnd_Alias 并将这些命令添加到 Cmnd_Alias 变量中,如下所示

Cmnd_Alias  CROND_SERVICE  = /usr/bin/systemctl restart crond.service, /usr/bin/systemctl status crond.service, /usr/bin/systemctl reload crond.service
jack ALL=(ALL) CROND_SERVICE

3.允许非root用户访问运行所有systemctl命令

我们可以在给出 systemctl 的路径后使用星号 (*) 通配符,这意味着允许 systemctl 后的任何内容,如下所示

jack ALL=(ALL) /usr/bin/systemctl *
 

sudo 允许在 sudoers 文件中的主机名、路径名和命令行参数中使用 shell 样式的通配符(又名元或者全局字符)。
通配符匹配是通过

 *         匹配任何一组零个或者多个字符(包括空格)。
 ?         匹配任何单个字符(包括空格)。
 [...]     匹配指定范围内的任何字符。
 [!...]    匹配不在指定范围内的任何字符。
 x         对于任何字符“x”,计算结果为“x”。这用于转义特殊字符,例如:‘*’, ‘?’, ‘[’, and ‘]’.

4. 允许非 root 用户访问运行除一个命令之外的所有 systemctl 命令

这里我们可以使用星号(*)来允许所有与systemctl相关的命令,并在你不希望被允许的命令前面使用(!),如下所示

jack  ALL=(ALL)  /usr/bin/systemctl *, !/usr/bin/systemctl restart crond.service

让我们验证我们的语法
所以这里我们可以执行network.service相关命令

[jack@golinuxhub ~]$sudo systemctl status network.service
● network.service - LSB: Bring up/down networking
   Loaded: loaded (/etc/rc.d/init.d/network; bad; vendor preset: disabled)
   Active: active (exited) since Sat 2016-12-30 18:43:08 IST; 3h 7min ago
     Docs: man:systemd-sysv-generator(8)
  Process: 786 ExecStart=/etc/rc.d/init.d/network start (code=exited, status=0/SUCCESS)

Dec 30 18:43:07 golinuxhub.lab systemd[1]: Starting LSB: Bring up/down networking...
Dec 30 18:43:07 golinuxhub.lab network[786]: Bringing up loopback interface:  [  OK  ]
Dec 30 18:43:08 golinuxhub.lab network[786]: Bringing up interface eth0:  [  OK  ]
Dec 30 18:43:08 golinuxhub.lab systemd[1]: Started LSB: Bring up/down networking.

正如预期的那样 sudo 不允许我重新启动 crond 服务

[jack@golinuxhub ~]$sudo systemctl restart crond.service
Sorry, user jack is not allowed to execute '/bin/systemctl restart crond.service' as root on golinuxhub.lab.

5. 允许一个系统组运行一些命令

假设我们有希望允许访问某些脚本或者命令的系统组,然后使用下面语法

%groupname   ALL=(ALL)   /path/to/command1 /path/to/command2

例如,我有一个管理员组,希望允许其重新启动网络和sshd服务

%administrator  ALL=(ALL)  /usr/bin/systemctl * sshd.service, /usr/bin/systemctl * network.service

6.允许多个非root用户执行同一组命令

这可以通过将所有这些用户添加到单个组并向该组授予权限来实现,如上述步骤所述
或者,您可以在sudoers文件中使用User_Alias创建一个变量,如下所示

User_Alias ADMIN = jack, bill, jack

这里我创建了一个包含三个用户的变量ADMIN,现在我将使用ADMIN变量为这三个用户分配sudo权限

ADMIN ALL=(ALL)  /usr/bin/systemctl * network.service

因此,现在所有三个用户都可以为network.service执行systemctl命令

7.允许非root用户以root权限运行所有命令

我们可以将此用户添加到 %wheel 组,对于 %wheel 组,我们在 sudoers 文件中已经有一个规则

## 允许wheel组中的人员运行所有命令
 %wheel  ALL=(ALL)       ALL
或者,如果只允许一个用户,您可以添加如下规则
jack  ALL=(ALL)  ALL

8.允许非root用户运行系统上的所有命令,除了一些受限命令

在下面的示例中,我允许“jack”运行所有系统级命令,而不是sshd服务的所有systemctl命令。您可以将其替换为任何其他命令,只需确保添加(!)在命令/脚本的开头。

jack  ALL=(ALL)  ALL, !/usr/bin/systemctl * sshd.service

重要提示:使用‘!’运算符从 ALL 中“减去”命令通常是无效的。
用户可以通过将所需的命令复制到不同的名称然后执行相同的命令来轻松规避这一点,因为他已经拥有 ALL 权限

9.所有用户以不同的用户或者组运行命令/脚本

假设我们有两个用户,user1 和 user2,其中我们希望 user1 执行一些实际上由 user2 拥有的脚本
这可以通过使用以下规则在 sudoers 文件中授予 user1 RunAs 权限

user1   ALL=(user2)   /path/to/script

例如,我有一个测试脚本,它属于“jack”用户

[root@onitroad ~]# ls -l /tmp/jack_script.sh
-rwxr-xr--. 1 jack jack 47 Dec 30 17:14 /tmp/jack_script.sh

正如您所看到的,该脚本的用户和组都是“jack:jack”,并且都具有该脚本的可执行权限

如果我以用户“jack”身份运行此脚本

[jack@golinuxhub ~]$/tmp/jack_script.sh
Hello This is jack's fIle

现在 bill 尝试使用 sudo 访问运行脚本,看起不起作用

[bill@golinuxhub ~]$sudo /tmp/jack_script.sh
[sudo] password for bill:

bill不在sudoers文件中。所以这是不起作用的。

在sudoers文件中添加以下规则

bill  ALL=(jack) /tmp/jack_script.sh

现在尝试使用“-ujack”运行脚本,如下所示

[bill@onitroad ~]$sudo -u jack /tmp/jack_script.sh
 [sudo] password for bill:
 Hello This is jack's fIle

10.允许非root用户在不提示输入密码的情况下执行sudo命令

您可以使用以下语法使用NOPASSWD来实现这一点

User    HOST=RunAs  NOPASSSWD:COMMAND

例如:

jack ALL=(ALL)  NOPASSWD:/usr/bin/systemctl *

允许用户jack运行所有systemctl命令,而无需提示输入密码

11. sudo事件日志在哪个文件中?

当非root用户允许以sudo的形式运行某些未经授权的命令时,会在/var/log/secure内生成警报
例如,不允许我的用户执行以下命令

[jack@golinuxhub ~]$sudo systemctl restart crond.service
[sudo] password for jack:
Sorry, user jack is not allowed to execute '/bin/systemctl restart crond.service' as root on golinuxhub.com.

该事件立即在 /var/log/secure 中报出现:

Dec 30 22:27:34 golinuxhub sudo:  jack : command not allowed ; TTY=pts/0 ; PWD=/home/jack ; USER=root ; COMMAND=/bin/systemctl restart crond.service

12.为sudo用户分配自定义环境变量

这可以通过使用 /etc/environment 文件来实现,我们可以其中定义在为相应用户执行 sudo 时要传递的变量

默认情况下,我的HOME 变量是

[jack@onitroad ~]$echo $HOME
/home/jack

现在我改成/tmp

[root@onitroad ~]# cat /etc/environment
 HOME=/tmp

现在让我们验证上述更改

[root@onitroad ~]# sudo -u jack bash
 bash-4.2$echo $HOME
 /tmp

所以这是有效的。。

日期:2020-06-02 22:18:43 来源:oir作者:oir