您的位置:首页 > 其它

sudoers的深入介绍与用户权限控制

2017-09-26 04:14 253 查看
linux是多用户多任务的分时操作系统,共享该系统的用户往往不只一个。但由于root账户密码的敏感性和root账号的无限制权限, 有必要通过
useradd
创建一些普通用户, 只让他们拥有不完全的权限; 如有必要,再来申请执行一些root权限的指令。sudo就是来解决这个需求的。sudo命令的执行流程是: 当前用户转换到root, 然后以root身份执行命令, 执行完成后, 直接退回到当前用户.需要注意的是: 执行sudo时输入的密码, 是当前用户的密码, 并非root密码.

赋予用户sudo操作的权限

关于Linux用户和用户组管理的知识点不是本篇文章要讨论的, 如对
useradd
usermod
passwd
groupadd
等指令生疏,可移步链接, 那里有详细的讲解了。通过
useradd
添加的用户,并不具备sudo权限。在ubuntu/centos等系统下,需要将用户加入admin组, 才能使其能够输入自己的账号密码来使用sudo。可通过以下命令来将用户加入admin组:(以root用户执行,
#
号开头的指令说明是在root用户下执行)
# usermod -a -G admin [用户]
如果提示admin组不存在,则还需要先创建该组:
# groupadd admin

ubuntu桌面版默认禁止root账号

需要提一点, ubuntu桌面版创建的第一个用户具有sudo权限,该用户能够通过
sudo + 其他命令
,然后输入自己的用户密码,来执行一些root才能够执行的命令。ubuntu桌面版默认禁止root账号,自然也不会开启root账号的远程登录(ssh登录)。如果需要切换到root账号, 可以使用命令
sudo -i
, 然后输入自己的用户密码来从而切换成root身份。但如果使用命令
su - root
来切换root身份就行不通了,因为你输入的密码压根就不是root的密码。当然,你可以通过
sudo passwd root
修改root用户的密码从而解锁root用户, 只是从安全性角度考虑不推荐这么干。

用公式讲解/etc/sudoers的内容

sudo的权限控制可以在
/etc/sudoers
文件中查看到.如果想要控制某个用户(或某个组用户)只能执行root权限中的一部分命令, 或者允许某些用户使用sudo时不需要输入密码,就需要对该文件有所了解。一般来说,通过
cat /etc/sudoers
指令来查看该文件, 会看到如下几行代码:
root   ALL=(ALL:ALL) ALL%admin ALL=(ALL) ALL%sudo  ALL=(ALL:ALL) ALL
/etc/sudoers
文件进行编辑的代码公式可以概括为:
授权用户/组 主机=[(切换到哪些用户或组)] [是否需要输入密码验证] 命令1,命令2,...
凡是
[ ]
中的内容, 都能省略; 命令和命令之间用
,
号分隔;为了方便说明, 将公式的各个部分称呼为字段1 - 字段5:
授权用户/组 主机  =[(切换到哪些用户或组)] [是否需要输入密码验证] 命令1,命令2,...
字段1      字段2 =[(字段3)] [字段4] 字段5
在上面的默认例子中, "字段1"不以
%
号开头的表示"将要授权的用户", 比如例子中的
root
;
%
号开头的表示"将要授权的组", 比如例子中的
%admin
%sudo
;"字段2"表示允许登录的主机, ALL表示所有; 如果该字段不为ALL,表示授权用户只能在某些机器上登录本服务器来执行sudo命令.比如:
jack mycomputer=/usr/sbin/reboot,/usr/sbin/shutdown
表示: 普通用户jack在主机mycomputer上, 可以通过sudo执行reboot和shutdown两个命令."字段3"如果省略,表示切换到root用户; 如果为ALL, 表示能够切换到任何用户; 例子中的
(ALL:ALL)
是允许任何
(用户:组)
的意思.请注意,"字段3"如果没省略,必须使用
( )
双括号包含起来.
sudo -u 用户名 command
允许使用特定用户来执行后面command, 只是大多数时候都是以root身份来执行,所以使用
sudo command
即可, 省略-u选项."字段4"的可能取值是
NOPASSWD:
。请注意有双引号。表示执行sudo时可以不需要输入密码。比如:
lucy ALL=(ALL) NOPASSWD: /bin/useradd
表示: 普通用户lucy可以在任何主机上,通过sudo执行允许范围内的命令,并且不需要输入密码.又比如:
peter ALL=(ALL) NOPASSWD: ALL
表示: 普通用户peter可以在任何主机上,通过sudo执行任何命令,并且不需要输入密码."字段5"是使用逗号分开一系列命令,这些命令就是授权给用户的操作; ALL表示允许所有操作.你可能已经注意到了,命令都是使用绝对路径,这是为了避免目录下有同名命令被执行,从而造成安全隐患.如果你将授权写成如下安全性欠妥的格式:
lucy ALL=(ALL) chown,chmod,useradd
那么用户就有可能创建一个他自己的脚本, 也命名为userad, 然后放在它的本地路径中, 如此一来他就能够使用root来执行这个"名为useradd的本地脚本". 这是相当危险的!命令的绝对路径可通过
which
指令查看到: 比如
which useradd
可以查看到命令
useradd
的绝对路径:
/usr/sbin/useradd

公式还要扩充

例子1:
papi ALL=(root) NOPASSWD: /bin/chown,/usr/sbin/useradd
表示: 用户papi能在所有可能出现的主机上, 切换到root下执行/bin/chown, 不必输入密码; 但运行/usr/sbin/useradd 命令时需要密码.这是因为
NOPASSWD:
只影响了其后的第一个命令1.上面给出的公式只是简化版,完整的公式如下。其实只需要记住简化版的公式就足够了,这里使用该例子仅仅是为了让读者在实践中不要困惑而已。
授权用户/组 主机=[(切换到哪些用户或组)] [是否需要输入密码验证] 命令1, [(字段3)] [字段4] 命令2, ...
在具有sudo操作的用户下, 执行
sudo -l
可以查看到该用户允许和禁止运行的命令.

通配符和取消命令

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

噢,编辑/etc/sudoers没权限

“你讲了这么多,但是在实践中,我去编辑/etc/sudoers文件,系统提示我没权限啊,怎么办?”这是因为
/etc/sudoers
的内容如此敏感,以至于该文件是只读的。所以,编辑该文件前,请确认清楚,你知道自己正在做什么。可以输入
visudo
命令, 采用nano编辑器来编辑该文件。也可以使用
sudo vi /etc/sudoers
来编辑该文件,保存时需要使用
:wq!
强制保存。当然,也可以先使用
chmod
修改该文件的权限, 修改文件后再恢复原来权限。不过,系统文档推荐的做法,不是直接修改
/etc/sudoers
文件,而是将修改写在
/etc/sudoers.d/
目录下的文件中。任何在
/etc/sudoers.d/
目录下,不以
~
号结尾的文件和不包含
.
号的文件,都会被解析成
/etc/sudoers
的内容。如果使用这种方式修改sudoers,需要在
/etc/sudoers
文件的最后行,加上
#includedir /etc/sudoers.d
语句(默认已有):
#includedir /etc/sudoers.d
注意了,这里的指令
#includedir
是一个整体, 前面的
#
号不能丢,也不能在
#
号后有空格。并且,尽可能使用
visudo
来编辑sudoers, 因为有相关的错误识别机制。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  visudo