青蛙学Linux—sudo和它的配置文件

sudo用于普通用户执行只有超级用户才有权限执行的命令。命令语法如下:

sudo [选项] 执行的命令

使用sudo执行命令时,系统会提示用户输入密码,注意,此时输入的密码为当前执行sudo用户的密码,而非root用户的密码。这也是为什么需要sudo命令的原因。使用su命令切换到root时,需要输入的是root用户的密码,这就造成了很大的安全隐患,root用户不应该把自己的密码告诉普通用户。并且使用su命令切换到root后将拥有root用户的所有权限,而sudo的权限是可以通过配置文件进行控制的。

sudo的配置文件为:

/etc/sudoers

在该配置文件中,可以对用户通过sudo执行的命令进行控制。以下为/etc/sudoers的权限控制部分:

## Next comes the main part: which users can run what software on 
## which machines (the sudoers file can be shared between multiple
## systems).
## Syntax:
##
## 	user	MACHINE=COMMANDS
##
## The COMMANDS section may have other options added to it.
##
## Allow root to run any commands anywhere 
root	ALL=(ALL) 	ALL

## Allows members of the 'sys' group to run networking, software, 
## service management apps and more.
# %sys ALL = NETWORKING, SOFTWARE, SERVICES, STORAGE, DELEGATING, PROCESSES, LOCATE, DRIVERS

## Allows people in group wheel to run all commands
%wheel	ALL=(ALL)	ALL

## Same thing without a password
# %wheel	ALL=(ALL)	NOPASSWD: ALL

## Allows members of the users group to mount and unmount the 
## cdrom as root
# %users  ALL=/sbin/mount /mnt/cdrom, /sbin/umount /mnt/cdrom

## Allows members of the users group to shutdown this system
# %users  localhost=/sbin/shutdown -h now

该部分遵循以下语法:

who where=(whom) [NOPASSWD:]command
  • who,哪个用户
  • where,从哪里登录
  • whom,以什么身份
  • NOPASSWD,使用sudo时不用输入密码
  • command,执行的命令;可设置多条命令,命令之间使用,分隔;在命令前使用!代表不能执行这条命令

这里我们回到上面的配置文件,查看里面生效的两条配置:

root    ALL=(ALL)   ALL
%wheel  ALL=(ALL)   ALL

根据上面的语法,我们可以分析出这两条配置的含义:root用户和wheel组(%wheel)可以在任何地方以任何的身份执行任何命令。

注意:在修改该配置文件时,建议使用visudo工具打开并修改,而不推荐使用Vi/Vim直接进行修改。visudo会在保存时对语法进行检查,如有错误将会进行提示,这样可以避免因语法错误造成该文件失效。在CentOS中,visudo调用的是Vi,所以操作同Vi。

一些例子:

设置用户fangyu可以在任何地方以root用户的身份执行所有命令:

在设置之前,先切换到fangyu用户,并执行useradd:

[fangyu@localhost ~]$ whoami
fangyu
[fangyu@localhost ~]$ useradd test
-bash: /usr/sbin/useradd: 权限不够
[fangyu@localhost ~]$ sudo useradd test
[sudo] fangyu 的密码:
fangyu 不在 sudoers 文件中。此事将被报告。

提示fangyu用户不在sudoers文件中,无法使用sudo。那么我们按要求在/etc/sudoers中加上以下配置:

fangyu ALL=(root) ALL

测试:

[fangyu@localhost ~]$ whoami
fangyu
[fangyu@localhost ~]$ sudo useradd test
[sudo] fangyu 的密码:
[fangyu@localhost ~]$ id test
uid=1001(test) gid=1001(test) 组=1001(test)

fangyu用户已经可以使用sudo命令执行useradd命令了,说明配置成功。

在上面设置的基础上,我们要使fangyu用户不能使用sudo时不能执行useradd命令,而且在使用sudo时不用输入密码,配置如下:

fangyu ALL=(root) NOPASSWD:ALL,!/usr/sbin/useradd

测试:

# 先删除test用户,测试是否可以使用其他命令并不用输入密码
[fangyu@localhost ~]$ whoami
fangyu
[fangyu@localhost ~]$ sudo userdel -r test
[fangyu@localhost ~]$ id test
id: test: no such user
# 配置成功,可以使用userdel命令并且不需要密码

# 测试是否可以使用useradd命令
[fangyu@localhost ~]$ sudo useradd test
对不起,用户 fangyu 无权以 root 的身份在 localhost.localdomain 上执行 /sbin/useradd test。
# 配置成功,无法执行useradd命令
允许fangyu用户不需要输入密码执行所有命令,除了passwd后加任意字符、passwd root和su这三个操作:
fangyu  ALL=(root)      NOPASSWD:ALL,!/usr/bin/passwd [A-Za-z]*,!/usr/bin/passwd root,!/usr/bin/su

另外需要注意的是,如果一个用户或组在配置文件中有多条配置且这些配置中有重合的地方,则下面一条配置将覆盖上面的配置,如:

# fangyu用户有以下两条配置
fangyu ALL=(root) ALL,!/usr/sbin/useradd
fangyu ALL=(root) NOPASSWD:ALL
# 则上面一条配置将不生效,fangyu用户仍然可以使用useradd命令

# 验证
[fangyu@localhost ~]$ whoami
fangyu
[fangyu@localhost ~]$ sudo useradd test5
[fangyu@localhost ~]$ id test5
uid=1003(test5) gid=1003(test5) 组=1003(test5)

额外的:sudo的环境变量问题

在自定义了环境变量之后,直接执行没有问题,但是使用sudo执行的时候却提示无法找到命令。这是sudo的设置问题,我们可以通过以下命令查看sudo的默认设置:

[root@localhost ~]# sudo -l
匹配 %2$s 上 %1$s 的默认条目:
    !visiblepw, always_set_home, match_group_by_gid, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS",
    env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT
    LC_MESSAGES", env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS
    _XKB_CHARSET XAUTHORITY", secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin

用户 root 可以在 localhost 上运行以下命令:
    (ALL) ALL

注意上面的env_reset和secure_path条目,意思为使用sudo时将环境变量更改为安全路径,然后给出安全路径的定义,导致我们自定义的环境变量无法生效。如果需要修改,只需要找到/etc/sudoers文件中的以下内容:

#
# Preserving HOME has security implications since many programs
# use it when searching for configuration files. Note that HOME
# is already set when the the env_reset option is enabled, so
# this option is only effective for configurations where either
# env_reset is disabled or HOME is present in the env_keep list.
#
Defaults    always_set_home
Defaults    match_group_by_gid

Defaults    env_reset
Defaults    env_keep =  "COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS"
Defaults    env_keep += "MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE"
Defaults    env_keep += "LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES"
Defaults    env_keep += "LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE"
Defaults    env_keep += "LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY"

#
# Adding HOME to env_keep may enable a user to run unrestricted
# commands via sudo.
#
# Defaults   env_keep += "HOME"

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin

修改:

Defaults    env_keep += "变量名"
# 添加环境变量保留

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin:自定义变量
# 修改安全路径

转载于:https://www.cnblogs.com/yu2006070-01/p/9963619.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值