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

摘要:
并且使用su命令切换到root后将拥有root用户的所有权限,而sudo的权限是可以通过配置文件进行控制的。visudo会在保存时对语法进行检查,如有错误将会进行提示,这样可以避免因语法错误造成该文件失效。在CentOS中,visudo调用的是Vi,所以操作同Vi。/usr/bin/su另外需要注意的是,如果一个用户或组在配置文件中有多条配置且这些配置中有重合的地方,则下面一条配置将覆盖上面的配置,如:#fangyu用户有以下两条配置fangyuALL=ALL,!

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:自定义变量
# 修改安全路径

免责声明:文章转载自《青蛙学Linux—sudo和它的配置文件》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇intellij code coverage (转)XCode 初次使用下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

linux 安装mysql(rpm文件安装)

三 卸载旧版本的MySql (没有的话,则跳过此步骤)       1、查看旧版本MySql       rpm -qa | grep mysql       将会列出旧版本MySql的组件列表,如:             我的电脑这里只显示一个,有可能会有多个。       2、逐个删除掉旧的组件       使用命令rpm -e --nodeps {...

MySQL双主热备问题处理

1. Slave_IO_Running: No mysql> show slave statusG *************************** 1. row *************************** Slave_IO_State: Master_Host:...

[转载]Linux C编程-实现文件夹的递归拷贝

copy(读取的路径或名字,目标文件的路径或名字) {        if(读取的是一个文件夹)        {     创造一个文件夹              打开文件夹,读取文件夹的内容              判断是否是一个文件夹  是:递归copy(xx,xx);               否,说明是个文件,拷贝文件            ...

iOS cocoapods升级及问题

安装 安装RubyCocoaPods基于Ruby语言开发而成,因此安装CocoaPods前需要安装Ruby环境。幸运的是Mac系统默认自带Ruby环境,如果没有请自行查找安装。检测是否安装Ruby:$ gem -v2.0.14 安装则会提示当前Ruby版本。gem介绍:gem是一个管理Ruby库和程序的标准包,它通过Ruby Gem(如 http://r...

Linux中hadoop配置hdfs

.前提是hadoop已经安装配置成功 2.主要是修改core-site.xml和hdfs-site.xml这两个配置文件 3.我使用的是notepad++连接Linux进行修改的 4.进入notepad++中查看目录找到这两个配置文件 5.首先要在Linux中建立存放name和data的文件 进入Linux输入命令如下 创建三个文件夹 6.编辑core...

使用gpg来加密数据

一、数据的加密方式 数据加密有三种方式: 1、对称加密(算法有:DES、AES、3DES、)加密和解密使用同一个密钥 2、非对称加密(RSA、DSA、ELGamal等等)一共四把钥匙,用公钥加密数据,只能使用与之配对的私钥解密;反之亦然 3、单项加密(md5  sha1 sha2 sha128 sha256 sha512等)算出数据的hash值,当数据发生...