Linux用户程序提升权限

当设计的脚本需要调用某系统命令时,使用sudo后会提示输入密码,在自己明确自己在干什么时,这很不方便,会极大的降低效率。为解决这一问题,本文给出提升普通用户权限的方法。

sudo 的权限控制

sudo的权限控制位于配置文件/etc/sudoers中,如果想要控制某个用户(或某个组用户)只能执行root权限中的一部分命令, 或者允许某些用户使用sudo时不需要输入密码.

配置文件设置格式

一般格式 root ALL=(ALL) ALL

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
授权用户/组 主机  =[(切换到哪些用户或组)] [是否需要输入密码验证] 命令1,命令2,...
字段1 字段2 =[(字段3)] [字段4] 字段5

注意:凡是[ ]中的内容, 都能省略; 命令和命令之间用,号分隔;

字段1:
不以%号开头的表示"将要授权的用户" root
以%号开头的表示"将要授权的组" %wheel

字段2:表示允许登录的主机
ALL表示所有; 如果该字段不为ALL,表示授权用户只能在某些机器上登录本服务器来执行sudo命令
eg:jack mycomputer=/usr/sbin/reboot,/usr/sbin/shutdown
表示: 普通用户jack在主机(或主机组)mycomputer上, 可以通过sudo执行reboot和shutdown两个命令

字段3:
如果省略, 相当于(root:root),表示可以通过sudo提权到root; 如果为(ALL)或者(ALL:ALL), 表示能够提权到(任意用户:任意用户组)。
注意:如果没省略,必须使用( )双括号包含起来

字段4:
可能取值是NOPASSWD:。请注意NOPASSWD后面带有冒号:。表示执行sudo时可以不需要输入密码
eg:lucy ALL=(ALL) NOPASSWD: /bin/useradd
表示: 普通用户lucy可以在任何主机上, 通过sudo执行/bin/useradd命令, 并且不需要输入密码
比如:hyc ALL=(ALL:ALL) NOPASSWD:ALL
字段5:授权给用户的操作
逗号分开一系列命令或者ALL表示允许所有操作

高阶用法

1
2
3
4
5
6
7
8
9
10
11
12
如果写成这样:
papi ALL=(root) NOPASSWD: /bin/chown,/usr/sbin/useradd
表示: 用户papi能在所有可能出现的主机上, 提权到root下执行/bin/chown, 不必输入密码; 但运行/usr/sbin/useradd 命令时需要密码.

注意:因为NOPASSWD:只影响了其后的第一个命令: 命令1.
在具有sudo操作的用户下, 执行sudo -l可以查看到该用户被允许和被禁止运行的命令


通配符和取消命令
eg:papi ALL=/usr/sbin/*,/sbin/*,!/usr/sbin/fdisk
命令前面加上!号表示取消该命令
表示意思:用户papi在所有可能出现的主机上, 能够运行目录/usr/sbin和/sbin下所有的程序, 但fdisk除外.

系统文档推荐的做法是,修改/etc/sudoers.d 目录下的文件通过此方法修改sudoers ,需要在/etc/sudoers文件的最后行,加上

1
@includedir /etc/sudoers.d

注意: 这里的指令@includedir是一个整体, 具体参考 sudoers.5

任何在/etc/sudoers.d/目录下,不以~号结尾的文件和不包含.号的文件,都会被解析成/etc/sudoers的内容。 比如我新创建的用户 hyc 想要实现root权限,可在/etc/sudoers.d/下新建一个文件01_hyc 文件,输入以下语句hyc ALL=(ALL:ALL) NOPASSWD:ALL 。 此时新建的用户就能获取root权限。

参考文章