CentOS7下sudo的配置说明

一、权限简单回顾

1.1、基本权限

关于基础命令,可以参考:
http://www.gnu.org/software/coreutils/manual/coreutils.html
在这里插入图片描述

http://www.gnu.org/software/coreutils/manual/coreutils.html#index-long-ls-format
这里ls -l输出的长格式进行说明。先回顾一下ls -l输出文件的含义。

-rw-r--r-- 1 root root  784 Dec 22 14:58 z.sh
第一部分:文件类型(the file type)
第二部分:文件权限位(file mode bits)
第三部分:文件硬链接数(number of hard links)
第四部分:文件属主(owner name)
第五部分:文件属组(group name)
第六部分:文件大小
第七部分:时间戳,默认是修改时间(即modify time,mtime)
第八部分:文件名(the name of file)

第一部分说明:(文件类型,用以下介绍的字符中的一个)
注解:下面每个符号都以引用引用表示,实际表现形式并没有引号。引号这里纯粹做字符串引用作用;
‘-’:常规文件,普通文件(regular file);
'b':块设备特殊文件(block file);
'c':字符设备文件(character file);
‘C’:高性能(连续数据的)文件(不常见,不太理解),这里做字面音译。原文:high performance (“contiguous data”) file
'd':目录(文件) (directory (file));
'D':出口 (没见过,只做音译).原文:door ,(Solaris 2.5 and up)。Solaris 2.5以及以上系统才有这种类型的文件;
'l':符号链接(文件),软链接(文件)。symbolic link (file)
'M':离线文件,没见过,只做音译。原文内容:off-line (“migrated”) file (Cray DMF)
'n':网络特殊文件(network special file),HP-UX上的文件类型;
'p':有名管道(文件),先进先出(文件).FIFO(first input first output),named fle;
'P':端口(port),Solaris 10 和以上版本才有;
's':套接字文件(socket file);
'?':其他文件类型;

第二部分:符号权限表示(符号权限表示含义如下)
分为三段,以上面的rw-rw----为了,可以看作默认符号'-'表示占位,其他非‘-’都有其特殊含义。我们就说一个占位表示一位,一共有9位,
前三位用来标识文件属主对该文件的权限,中间三位用来标识文件属组对该文件的权限,最后三位表示其他者(不是文件属主,也不是
文件属组的其他用户都是其他者)对该文件的权限。
r:表示对文件有可读的权限;
w:表示对文件有可写的权限;
x:表示对文件有可执行的权限;
-:表示符号占位,除了读写执行之外的权限;
还有可能出现特殊字符:'s','S','t','T'   #这些是特殊权限为,后边小结说明。

修改基本权限用到最多的两个命令就是:chmod和chown。这两个配合符号权限格式([ugoa…][-+=]perms…[,…])以及
配合数字权限格式(7,6,5,4,3,2,1,0)。默认的数字权限为有八进制用3位表示(111是八进制的最大数的二进制表示形式,7.所以
可以理解,每3位二进制数可以表示一位八进制的权限位。一般基础权限位有9位,如果要加上特殊权限位,还要用一位八进制数表示
所以完整意义上的权限位的个数,二进制数量一共有12位)。加上用户权限模型,进程运行上下文模型等,权限可以算是非常基础而又
复杂的知识点。具体设置方式可以参考:
http://www.gnu.org/software/coreutils/manual/coreutils.html#Directory-Setuid-and-Setgid

还有一个可以改变GNU或GNU/LINUX文件属性的命令是:chattr  (change file attributes on a Linux file system)
设置特殊权限,比如涉及到acl,Suid,Sgid,Sticky,Selinux(这个算一种权限机制)等,下面只会简单提及。

1.2、acl权限

原文:(因为总结的很概要简练,所以贴出原文以示尊重,谢谢。)
Following the file mode bits is a single character that specifies whether an alternate access method such as an access control list 
applies to the file. When the character following the file mode bits is a space, there is no alternate access method. When it is a printing
 character, then there is such a method.
GNU ls uses a ‘.’ character to indicate a file with a security context, but no other alternate access method.
A file with any other combination of alternate access methods is marked with a ‘+’ character.

紧跟在文件(权限)模式位后可能会有一个单一的符号用来指明知否文件有使用一个可选择的诸如访问控制列表(acl)的访问方法。如果
这个字符位是一个空格,表示文件并没有选择访问方法。如果有使用,其表示含义说明如下:
如果文件有Selinux权限,GNU的ls程序会显示一个点号"."来标识,Selinux又叫安全上下文(Security Context);
如果有访问控制列表权限,会标记一个加号"+";

Selinux不常见,我这里不举例子。对acl做举例说明:
[root@www tmp]# ls -l file 
-rw-r--r-- 1 root root 4 Dec 22 21:53 file
这里的文件file,文件属主是root用户,文件属组是root组。这里其他者比如(yanhui这个普通用户),如果要让yanhui对这个用户有写的权
限,除了修改权限位的权限,以及修改文件属主或属组。还可以设置acl权限。设置如下:
setfacl -m u:yanhui:w file

修改前yanhui普通用户写入(要使用管理员权限修改):
[root@www tmp]# su - yanhui
[yanhui@www ~]$ cd /tmp/
[yanhui@www tmp]$ ls -l file
-rw-r--r-- 1 root root 4 Dec 22 21:53 file
[yanhui@www tmp]$ cat file 
123
[yanhui@www tmp]$ echo "234" >> file 
-bash: file: Permission denied

修改后yanhui普通用户正常写入(要使用管理员权限修改):
说明,如果有加入acl访问控制权限,如果权限为有的权限,在acl访问控制列表没有,会以访问控制列表为准。比如:
第一次修改,只给yanhui访问控制file文件的权限为-w-,即只有可写权限。
[root@www tmp]# setfacl -m u:yanhui:w file
[root@www tmp]# getfacl file 
# file: file
# owner: root
# group: root
user::rw-
user:yanhui:-w-
group::r--
mask::rw-
other::r--
[yanhui@www tmp]$ ls -l file 
-rw-rw-r--+ 1 root root 4 Dec 22 21:53 file    #文件权限模型位后面多了一个加号,请注意。
[yanhui@www tmp]$ echo "234" >> file 
[yanhui@www tmp]$ cat file    #其他者有可读权限,发现加上acl权限后,这个权限不会生效。
cat: file: Permission denied

第二次修改:
[root@www tmp]# setfacl -m u:yanhui:rw file
[yanhui@www tmp]$ ls -l file 
-rw-rw-r--+ 1 root root 8 Dec 22 21:59 file
[yanhui@www tmp]$ cat file   #acl权限给yanhui对file有读权限后,才可以查看。
123
234

1.3、特殊权限

特殊权限为,有Suid,Sgid以及Sticky。分别含义是:设置uid权限,设置gid权限以及设置粘贴位权限。

功用:当目录属组有写权限,且有SGID权限时,那么所有属于此目录的属组,且以属组身份在此目录中新建文件或目录时,新文件的属组不是用户的基本组,而是此目录的属组;

管理文件的SGID权限:
chmod g+|-s FILE…
展示位置:属组的执行权限位
如果属组原本有执行权限,显示为小写s;
否则,显示为大写S;

SUID权限用的比较广一点。比如su和passwd这两个命令本身就有设置SUID权限:

[yanhui@www ~]$ which su
/bin/su
[yanhui@www ~]$ which passwd
/bin/passwd
[yanhui@www ~]$ ls -l /bin/su /bin/passwd
-rwsr-xr-x. 1 root root 27832 Jun 10  2014 /bin/passwd
-rwsr-xr-x. 1 root root 32064 Mar  6  2015 /bin/su

普通用户可以使用su命令来切换到管理员。可以使用passwd命令来修改自己的密码。passwd命令如果要修改密码,就涉及到写
/etc/passwd和/etc/shadow文件:
-rw-r--r-- 1 root root 1226 Dec 22 21:57 /etc/passwd
---------- 1 root root 1146 Dec 22 21:57 /etc/shadow
默认普通用户是无法直接写这两个文件的。

功用:对于属组或全局可写的目录,组内的所有用户或系统上的所有用户对在此目录中都能创建新文件或删除所有的已有文件;如果为此类目录设置Sticky权限,则每个用户能创建新文件,且只能删除自己的文件;
管理文件的Sticky权限:
chmod o+|-t FILE…
展示位置:其它用户的执行权限位
如果其它用户原本有执行权限,显示为小写t;
否则,显示为大写T;
应用:/tmp目录以及/var/tmp目录就有设置粘贴位。

[yanhui@www ~]$ ls -ld /var/tmp/
drwxrwxrwt. 6 root root 4096 Dec 22 17:55 /var/tmp/
[yanhui@www ~]$ ls -ld /tmp/
drwxrwxrwt. 9 root root 4096 Dec 22 22:05 /tmp/
每个普通用户都可以在上面这两个目录下创建文件,以及删除自己的文件。普通用户A正常不能删除普通用户B的文件,反之亦然。

1.4、进程安全上下文说明

进程安全上下文说明:
1、进程以某用户的身份运行; 进程是发起此进程用户的代理,因此以此用户的身份和权限完成所有操作;
2、权限匹配模型:
(1) 判断进程的属主,是否为被访问的文件属主;如果是,则应用属主的权限;否则进入第2步;
(2) 判断进程的属主,是否属于被访问的文件属组;如果是,则应用属组的权限;否则进入第3步;
(3) 应用other的权限;

权限:
    r:readable,读
    w:writable,写
    x:excutable,执行
    
基本权限相对于文件:
	r:可获取文件的数据;
	w:可修改文件的数据;
	x:可将此文件发起运行为进程;

基本权限相对于目录:
	r:可使用ls命令获取其下的所有文件列表;
 	w:可修改此目录下的文件列表;即创建或删除文件;
	x:可cd至此目录中,且可使用ls -l来获取所有文件的详细属性信息;

权限模型(基本的9位,ls -l可以看见的属性)以及从属关系:
    mode:rwxrwxrwx
    ownership:user,group


权限组合机制:八进制表示0~7,最大为7,二进制可以为111,最小为0,二进制可以为000:
    --- 二进制表示:000 转换成八进制:0
    r-- 二进制表示:100 转换成八进制:4
    rw- 二进制表示:110 转换成八进制:6
    r-x 二进制表示:101 转换成八进制:5
    -w- 二进制表示:010 转换成八进制:2
    -wx 二进制表示:011 转换成八进制:3
    --x 二进制表示:001 转换成八进制:1
    rwx 二进制表示:111 转换成八进制:7

附加特殊权限:
管理特殊权限的另一方式:
    suid sgid sticy     八进制权限
            0 0 0   0
            0 0 1   1
            0 1 0   2
            0 1 1   3
            1 0 0   4
            1 0 1   5
            1 1 0   6
            1 1 1   7
基于八进制方式赋权时,可于默认的三位八进制数字左侧再加一位八进制数字
例如:chmod 1777 

二、实验环境说明

[root@www ~]# cat /etc/redhat-release   #以CentOS 7.1发行版做实验
CentOS Linux release 7.1.1503 (Core) 
[root@www ~]# uname -a   #内核版本保持默认,没有升级
Linux www.yanhui.com 3.10.0-229.el7.x86_64 #1 SMP Fri Mar 6 11:36:42 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
[root@www ~]# ip addr show|sed -rn '/inet[[:space:]]+127/! s/^[[:space:]]+inet[[:space:]]+(.*)\/[[:digit:]]+[[:space:]]+.*$/\1/p'
172.16.0.77
[root@www ~]# getenforce   #Selinux机制关闭,没有启用。
Disabled
[root@www ~]# systemctl status firewalld.service #防火墙有启动
firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled)
   Active: active (running) since Sat 2018-12-22 03:11:34 CST; 19h ago
 Main PID: 859 (firewalld)
   CGroup: /system.slice/firewalld.service
           └─859 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid

Dec 22 03:11:34 localhost.localdomain systemd[1]: Started firewalld - dynamic firewall daemon.
Dec 22 12:06:21 www.yanhui.com firewalld[859]: 2018-12-22 12:06:21 ERROR: INVALID_SERVICE: php-fpm
Dec 22 12:06:26 www.yanhui.com firewalld[859]: 2018-12-22 12:06:26 ERROR: INVALID_SERVICE: php

三、管理员用户和普通用户做切换之su

su命令可以切换用户,可以切换用户并以指定用户的身份去运行命令。其中涉及到完全切换环境和不完全切换环境的问题。
下面两句话很关键,所以贴出原文:
When called without arguments su defaults to running an interactive shell as root.
For  backward  compatibility su defaults to not change the current directory and to only set the environment variables HOME and SHELL 
(plus USER and LOGNAME if the target user is not root).  It is recommended to always use the --login option (instead it's shortcut  -)  to  
avoid side effects caused by mixing environments.

如果调用su不加任何参数(表示su USERNAME),这种还是会以root环境去运行一个交互式的shell;
为了向后兼容考虑,su默认(不加任何参数)不会去改变当前工作目录,会改变HOME和SHELL环境的值(如果切换的用户是非root用户,
还会改变USER和LOGNAME环境变量的值)。切换的时候建议完全切换,使用--login选项或简写符号"-"去完全切换,即su - USERNAME,
因为不完全切换可能会因为环境混合造成副作用。

[root@www tmp]# pwd
/tmp
[root@www tmp]# su yanhui
[yanhui@www tmp]$ pwd
/tmp    #半切换,工作目录没有改变
[yanhui@www tmp]$ echo $HOME
/home/yanhui
[yanhui@www tmp]$ echo $SHELL
/bin/bash
[yanhui@www tmp]$ echo $USER
yanhui
[yanhui@www tmp]$ echo $LOGNAME
yanhui
[yanhui@www tmp]$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

[root@www tmp]# su - yanhui
Last login: Sat Dec 22 22:22:56 CST 2018 on pts/0
[yanhui@www ~]$ pwd
/home/yanhui
[yanhui@www ~]$ echo $HOME
/home/yanhui
[yanhui@www ~]$ echo $SHELL
/bin/bash
[yanhui@www ~]$ echo $USER
yanhui
[yanhui@www ~]$ echo $LOGNAME
yanhui
[yanhui@www ~]$ echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/yanhui/.local/bin:/home/yanhui/bin #看到这里的区别了吗,完全切换是与不完全切换不同的。
[yanhui@www ~]$ 


su命令使用语法结构:
su [options] [-] [USER [arg]...]

只要涉及用户登录都与pam有关系,这里的su也是如此,也会调用pam的功能,这里不深入。su常见的两个语法形式:
su  -l  user (或su --login user 或 su - user) #完全切换用户(和用户的环境)
su  -l  user  -c   'COMMAND'  #以另外一个用户的身份(以及环境)去执行指定的命令;

四、sudo概述

sudo允许根据指定的安全策略,运行一个用户以其他用户身份或管理员身份去执行某个命令;
对于安全的策略设定和登入和登出,sudo支持插件的结构管理。为了无缝的与sudo的前端一起更好的工作,第三方机构可以自己开发和
发布自己的安全策略设定以及登入登出插件。默认的安全策略是sudoers,通过配置文件/etc/sudoers来配置,并且支持LDAP协议。

如果有的话,安全策略检测用户有什么权限去运行。这个sudo策略可能需要用户使用其他认证机制或密码认证机制去认证他们自己的
密码。如果认证需要的时候,等待用户输入用户密码超出了配置文件的时间限制,默认sudo会退出。这个限制是由sudo策略指定,
默认的交互式密码输入的超时时间安全策略是5分钟。

安全策略可以支持保存凭据,这种缓存机制能够让用户在一小段时间内反复调用sudo去执行命令而不需要反复多次确认密码。默认
sudoers策略缓存凭据时间是5分钟。(如果sudoers被重写,缓存凭据要重新计算,使用sudo的-v选项也可以在不运行命令的情况下更新
这个平均缓存时间)。-k会在运行命令的时候是的sudo的缓存凭据失效,即每一次使用sudo去调用命令,配合-k,如果要认证密码,默认
情况下不管时间间隔有多短,都需要用户去确认密码。

    

五、sudo配置

5.1、sudo软件包和sudoers的配置文件/etc/sudoers

sudo软件包:

[root@www tmp]# rpm -qi sudo
Name        : sudo
Version     : 1.8.6p7
Release     : 13.el7
Architecture: x86_64
Install Date: Mon 03 Dec 2018 11:26:46 PM CST
Group       : Applications/System
Size        : 2520314
License     : ISC
Signature   : RSA/SHA256, Sat 14 Mar 2015 04:37:15 PM CST, Key ID 24c6a8a7f4a80eb5
Source RPM  : sudo-1.8.6p7-13.el7.src.rpm
Build Date  : Fri 06 Mar 2015 01:42:19 PM CST
Build Host  : worker1.bsys.centos.org
Relocations : (not relocatable)
Packager    : CentOS BuildSystem <http://bugs.centos.org>
Vendor      : CentOS
URL         : http://www.courtesan.com/sudo/
Summary     : Allows restricted root access for specified users
Description :
Sudo (superuser do) allows a system administrator to give certain
users (or groups of users) the ability to run some (or all) commands
as root while logging all commands and arguments. Sudo operates on a
per-command basis.  It is not a replacement for the shell.  Features
include: the ability to restrict what commands a user may run on a
per-host basis, copious logging of each command (providing a clear
audit trail of who did what), a configurable timeout of the sudo
command, and the ability to use the same configuration file (sudoers)
on many different machines.

[root@www tmp]# rpm -ql sudo
/etc/pam.d/sudo  #sudo程序的pam的配置文件
/etc/pam.d/sudo-i
/etc/sudo-ldap.conf  #sudo配合LADP协议的配置文件
/etc/sudo.conf #sudo前端的配置文件
/etc/sudoers #默认sudo安全策略模块的配置文件(我们要在这个配置文件中配置实现相关功能)
/etc/sudoers.d #sudo安全策略模块的子配置文件
/usr/bin/sudo #执行程序
/usr/bin/sudoedit #执行程序
/usr/bin/sudoreplay #重放sudo会话的日志的程序
/usr/libexec/sesh
/usr/libexec/sudo_noexec.so #模块文件
/usr/libexec/sudoers.so #默认块文件
/usr/sbin/visudo #编辑sudoers 文件的工具,可以检测语法,建议使用工具调用编辑配置文件
......
......省略了很多安装的文档文件。
/var/db/sudo #sudo配置的用户数据库数据文件目录
sudoers的模板配置文件:
[root@www ~]# cat /etc/sudoers
## Sudoers allows particular users to run various commands as
## the root user, without needing the root password.
### 添加翻译:sudoers可以让特定用户以root身份去运行各种各样的命令而不需要root用户的密码;(root用户是默认管理员用户)
##
## Examples are provided at the bottom of the file for collections
## of related commands, which can then be delegated out to particular
## users or groups.
## 
### 添加翻译:在下文的示例中,有收集一些相关的命令,然后可以将这些特定的用户委托或授权给特定的用户或组。

## This file must be edited with the 'visudo' command.
## 添加翻译:这个文件必须使用visudo命令编辑。(强烈建议)


## Host Aliases ##主机别名
## Groups of machines. You may prefer to use hostnames (perhaps using 
## wildcards for entire domains) or IP addresses instead.
###在主机组别名组内。你可以使用主机名(或许可以使用整个域的通配表示)和IP地址。

# Host_Alias     FILESERVERS = fs1, fs2
# Host_Alias     MAILSERVERS = smtp, smtp2
###Host_Alias这个是关键字,要按照这个来写。表示定义主别名。后边跟着一个空格,然后跟自定义的全大写(必须全大写)的英文,建议
使用特定含义的单词或缩写,后边加入对应的主机ip或名称,不同的主机地址以逗号隔开。上面示例定义了两个主机别名,一个是
FILESERVERS,含义表示文件服务器,有主机fs1和fs2。


## User Aliases   ##用户别名
## These aren't often necessary, as you can use regular groups
## (ie, from files, LDAP, NIS, etc) in this file - just use %groupname 
## rather than USERALIAS
# User_Alias ADMINS = jsmith, mikem
### 示例定义了一个用户别名,叫ADMINS,这个用户别名中包含了用户jsmith和mikem两个用户。

## Command Aliases  ##命令别名
## These are groups of related commands...
###这些通常是一组相关的命令(组合在一起)

## Networking  #和网络相关的命令的别名
# Cmnd_Alias NETWORKING = /sbin/route, /sbin/ifconfig, /bin/ping, /sbin/dhclient, /usr/bin/net, /sbin/iptables, /usr/bin/rfcomm, /usr/bin/wvdial, /sbin/iwconfig, /sbin/mii-tool
##上面定义了一个命令别名,叫NETWORKING,其含义表示网络。比如route,ifconfig,ping等。注意这些命令一定要是文件的绝对路径,
否则会有语法错误。

## Installation and management of software  ###软件包安装和管理的命令别名
# Cmnd_Alias SOFTWARE = /bin/rpm, /usr/bin/up2date, /usr/bin/yum
##上面定义了一个命令别名,叫SOFTWARE,其含义表示软件包。比如rpm,yum包管理器工具和包管理器前端工具。


## Services  ###服务相关的前端命令别名
# Cmnd_Alias SERVICES = /sbin/service, /sbin/chkconfig
### 上面定义了一个命令别名叫SERVICES,中间包含的命令有service和chkconfig


## Updating the locate database   #和更新locate数据库相关的别名组。
# Cmnd_Alias LOCATE = /usr/bin/updatedb
定义一个命令别名,叫LOCATE,目前有updatedb命令加入。

## Storage #和存储管理相关的命令别名
# Cmnd_Alias STORAGE = /sbin/fdisk, /sbin/sfdisk, /sbin/parted, /sbin/partprobe, /bin/mount, /bin/umount
###上面定义了一个命令别名,叫STORAGE,加入的命令有fdisk,parted,mount,umount等。

## Delegating permissions  #和权限委派相关的命令别名
# Cmnd_Alias DELEGATING = /usr/sbin/visudo, /bin/chown, /bin/chmod, /bin/chgrp
### 上面定义了一个命令别名,叫DELEGATING,加入的命令有visudo,chown,chmod,chgrp等

## Processes ##和进程处理相关的命令别名
# Cmnd_Alias PROCESSES = /bin/nice, /bin/kill, /usr/bin/kill, /usr/bin/killall
###上面定义了一个命令别名,叫PROCESSES,加入的命令有nice,kill,killall。

## Drivers #和驱动模块管理相关的命令别名。
# Cmnd_Alias DRIVERS = /sbin/modprobe
### 上面定义了一个命令别名,叫DRIVERS,加入的命令有modprobe。

# Defaults specification  #默认指定和默认设定

#
# Disable "ssh hostname sudo <cmd>", because it will show the password in clear. 
#         You have to run "ssh -t hostname sudo <cmd>".
#
### 关闭"ssh hostname sudo <cmd>",因为这种用法会清楚的显示出密码。可以使用
"ssh -t hostname sudo <cmd>"的形式。
Defaults    requiretty

#
# Refuse to run if unable to disable echo on the tty. This setting should also be
# changed in order to be able to use sudo without a tty. See requiretty above.
#
Defaults   !visiblepw

#
# 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    env_reset
Defaults    env_keep =  "COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC 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

## Next comes the main part: which users can run what software on 
## which machines (the sudoers file can be shared between multiple
## systems).

### 接下来的部分才是主要设置部分:什么用户可以在什么机器上运行什么软件或命令。(sudoers文件可以支持在多个系统之间共享)
## Syntax:
##
## 	user	MACHINE=COMMANDS
##
## The COMMANDS section may have other options added to it.
##
## Allow root to run any commands anywhere 
### 允许root用户在任意地点运行任意命令。
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
### 允许sys组的成员去运行后边命令别名中的命令。相关命令涉及的命令请往上翻看示例定义。

## Allows people in group wheel to run all commands
%wheel ALL=(ALL)	ALL 
### 允许以wheel为主要组的用户以任何用户身份去运行所有的命令。(要验证用户本身的密码)

## Same thing without a password
# %wheel	ALL=(ALL)	NOPASSWD: ALL
### 允许以wheel为主要组的用户以任何用户身份去运行所有的命令。(不需要验证用户本身的密码)

## Allows members of the users group to mount and unmount the 
## cdrom as root
# %users  ALL=/sbin/mount /mnt/cdrom, /sbin/umount /mnt/cdrom
## 允许以users为主要组的用户可以以管理员的身份去执行挂载和卸载关盘的命令

## Allows members of the users group to shutdown this system
# %users  localhost=/sbin/shutdown -h now
### 允许以users为主要组的用户执行shutdown的立即关机命令。

## Read drop-in files from /etc/sudoers.d (the # here does not mean a comment)
#includedir /etc/sudoers.d
这里表示包含子配置。命令includedir前边的#符号不表示注释,千万要注意。

总结:

授权项:
	who  	where=(whom)  	commands
	users 	hosts=(runas)	 	commands
允许指定用户(users或who),在指定主机上(where或hosts,ALL表示任意主机)=以谁的身份(whom或runas,root表示以管理员身份,
如果为ALL表示以所有用户身份)  可以运行的命令列表(commands) 

其中users可以设置为:
username:单个用户名;
#uid:特定用户uid;
%groupname:以groupname为主要组的用户;
##gid:以gid对应的组为主要组的用户;
User_Alias:用户别名中定义的用户;

hosts可以设置为:
ip:单个ip地址
hostname:单个主机名;
NetAddr:网络地址,网段地址;
Host_Alias:主机地址别名中指定的主机;

runas可以设置为:

Runas_Alias:定义可以被作为运行用户的别名。

commands可以设置为:
commands:指定运行的命令;
directory
sudoedit:特殊权限,可用于向其它用户授予sudo权限;
Cmnd_Alias:命令别名中指定的命令;

定义别名的方法:
ALIAS_TYPE  NAME=item1, item2, item3, ...
ALIAS_TYPE表示别名的类型,要使用特定的字符串表示,系统预先有设定不同的分类。
NAME表示别名的别称,定义好后可以使用这个名称来引用。必须使用全大写字符。
别名类型有:
User_Alias   这个是定义用户的别名
Host_Alias  这个是定义主机的别名
Runas_Alias  这个是定义以何种身份用户运行的用户的别名
Cmnd_Alias  这个是命令的别名

5.2、配置一个普通用户,不需要切换密码就能以管理员身份执行管理命令

先创建普通用户yanhui:
[root@www ~]# id yanhui
id: yanhui: no such user
[root@www ~]# useradd yanhui
[root@www ~]# echo "yanhui" | passwd --stdin yanhui
Changing password for user yanhui.
passwd: all authentication tokens updated successfully.
[root@www ~]# id yanhui
uid=1003(yanhui) gid=1003(yanhui) groups=1003(yanhui)

使用visudo来编辑sudo的配置文件:
加入一项:yanhui  ALL=(ALL)       NOPASSWD: ALL
含义为:yanhui这个用户,可以通过任意主机(ALL),以任何人的身份(小括号中的ALL,也可以定义为root,一般管理员的管理任务,
其他用户是没有权限做的,所以定义成ALL和root区别不是很大),不需要验证密码(NOPASSWD)的执行所有命令(最后的ALL)。

登录测试:
(1) 添加用户centos
[yanhui@www ~]$ id centos
id: centos: no such user
[yanhui@www ~]$ useradd centos   #这种用法不是sudo的提权用法
-bash: /usr/sbin/useradd: Permission denied
[yanhui@www ~]$ sudo useradd centos  #每次要以管理员身份运行某个命令的时候,要使用sudo
[yanhui@www ~]$ sudo passwd centos
Changing password for user centos.
New password: 
BAD PASSWORD: The password is shorter than 8 characters
Retype new password: 
passwd: all authentication tokens updated successfully.

(2) 挂载光盘
[yanhui@www ~]$ mount /dev/sr0 /mnt/
mount: only root can do that
[yanhui@www ~]$ sudo mount /dev/sr0 /mnt/
mount: /dev/sr0 is write-protected, mounting read-only
[yanhui@www ~]$ df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   50G  1.3G   49G   3% /
devtmpfs                 985M     0  985M   0% /dev
tmpfs                    994M     0  994M   0% /dev/shm
tmpfs                    994M  8.6M  986M   1% /run
tmpfs                    994M     0  994M   0% /sys/fs/cgroup
/dev/mapper/centos-home   48G   33M   48G   1% /home
/dev/sda1                497M  102M  395M  21% /boot
/dev/sr0                 4.1G  4.1G     0 100% /mnt

好了,以后就不要使用root用户直连了,使用yanhui提权就行了。

5.3、定义别名并简单验证

Cmnd_Alias NETADMINCMD = /usr/sbin/ip,/usr/sbin/ifconfig,/usr/sbin/route
Cmnd_Alias USERADMINCMD = /usr/sbin/useradd,/user/sbin/userdel,/usr/sbin/passwd,! /usr/sbin/passwd root
fedora ALL=(ALL)        NETADMINCMD
centos ALL=(ALL)        NETADMINCMD,USERADMINCMD

定义了两个命令别名,一个是NETADMINCMD表示管理ip地址网络相关的命令,另一个是USERADMINCMD表示可以做用户管理的。
现在定义两个提权用户,fedora用户可以在任意主机以任意人的身份去执行NETADMINCMD别名中定义的命令,而centos用户可以在
任意主机以任意人的身份去执行NETADMINCMD和USERADMINCMD别名中定义的命令。

简单来说,就是创建两个普通用户,分别是fedora和centos,然后让fedora用户只能做简单的管理管理,而centos则可以做简单的网络
管理之外,还要能做用户的管理。为了扩展性,所以可以定义一个网络管理需要的命令的命令别名,以及定义一个用户管理需要的命令
的命令别名,后续如果有新增命令可以直接加入对应的别名即可。

(1) 创建普通用户centos和fedora
[yanhui@www ~]$ sudo useradd centos
[yanhui@www ~]$ sudo useradd fedora
[yanhui@www ~]$ sudo echo "fedora" | passwd --stdin fedora  #可以看到这种提权用户的设定这种用法还不行
Only root can do that.
[yanhui@www ~]$ sudo passwd fedora
Changing password for user fedora.
New password: 
BAD PASSWORD: The password is shorter than 8 characters
Retype new password: 
passwd: all authentication tokens updated successfully.
[yanhui@www ~]$ sudo passwd centos
Changing password for user centos.
New password: 
BAD PASSWORD: The password is shorter than 8 characters
Retype new password: 
passwd: all authentication tokens updated successfully.
[yanhui@www ~]$ id fedora
uid=1005(fedora) gid=1005(fedora) groups=1005(fedora)
[yanhui@www ~]$ id centos
uid=1004(centos) gid=1004(centos) groups=1004(centos)

(2 ) visudo编辑
加入以下内容:
Cmnd_Alias NETADMINCMD = /usr/sbin/ip,/usr/sbin/ifconfig,/usr/sbin/route
Cmnd_Alias USERADMINCMD = /usr/sbin/useradd,/user/sbin/userdel,/usr/sbin/passwd,! /usr/sbin/passwd root
fedora ALL=(ALL)        NETADMINCMD
centos ALL=(ALL)        NETADMINCMD,USERADMINCMD
##本次内容都只是测试的,生产中这样设定一不符合特定需求,二可能存在很多可以利用的漏洞点(具体可以反复推敲,特别要注意涉及
到修改管理员密码的方式等)

(3) 登录fedora进行测试
[yanhui@www ~]$ sudo su - fedora
[fedora@www ~]$ clear
[fedora@www ~]$ sudo -l   #查看自己可以使用的命令有哪些
[sudo] password for fedora: 
Matching Defaults entries for fedora on this host:
    requiretty, !visiblepw, always_set_home, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC 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

User fedora may run the following commands on this host:
    (ALL) /usr/sbin/ip, /usr/sbin/ifconfig, /usr/sbin/route

[fedora@www ~]$ ifconfig eno16777736:1 192.168.56.119 netmask 255.255.255.0 up #不加sudo默认不允许
SIOCSIFADDR: Operation not permitted
SIOCSIFFLAGS: Operation not permitted
SIOCSIFNETMASK: Operation not permitted
SIOCSIFFLAGS: Operation not permitted

[fedora@www ~]$ sudo ifconfig eno16777736:1 192.168.56.119 netmask 255.255.255.0 up  #sudo可以新增ip
[fedora@www ~]$ ifconfig
eno16777736: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.16.0.77  netmask 255.255.0.0  broadcast 172.16.255.255
        inet6 fe80::20c:29ff:fe3d:65a2  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:3d:65:a2  txqueuelen 1000  (Ethernet)
        RX packets 115792  bytes 60836731 (58.0 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 75994  bytes 15843178 (15.1 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eno16777736:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.56.119  netmask 255.255.255.0  broadcast 192.168.56.255
        ether 00:0c:29:3d:65:a2  txqueuelen 1000  (Ethernet)

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 0  (Local Loopback)
        RX packets 5383  bytes 2888858 (2.7 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 5383  bytes 2888858 (2.7 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[fedora@www ~]$ sudo useradd user1 #尝试使用不能提权执行的命令
Sorry, user fedora is not allowed to execute '/sbin/useradd user1' as root on www.yanhui.com.

(4) 登录centos用户进行测试
[yanhui@www ~]$ sudo su - centos
[centos@www ~]$ sudo -l -k  #-k表示不使用缓存的密码。每次都要输入密码。-l查看有哪些权限
[sudo] password for centos: 
Matching Defaults entries for centos on this host:
    requiretty, !visiblepw, always_set_home, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC 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

User centos may run the following commands on this host:
    (ALL) /usr/sbin/ip, /usr/sbin/ifconfig, /usr/sbin/route, (ALL) /usr/sbin/useradd, /user/sbin/userdel, /usr/sbin/passwd, !/usr/sbin/passwd root
[centos@www ~]$ sudo passwd root  #尝试做坏事,修改管理员密码,不允许。
[sudo] password for centos: 
Sorry, user centos is not allowed to execute '/bin/passwd root' as root on www.yanhui.com.
[centos@www ~]$ sudo useradd user1 #可以新增用户
[sudo] password for centos: 
[centos@www ~]$ sudo userdel -r user1  #这里不能删除用户是我没有定义好,默认有个/sbin/userdel没有加入
Sorry, user centos is not allowed to execute '/sbin/userdel -r user1' as root on www.yanhui.com.
[centos@www ~]$ sudo ifconfig eno16777736:1 down #可以做网络接口的管理
[centos@www ~]$ ifconfig
eno16777736: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.16.0.77  netmask 255.255.0.0  broadcast 172.16.255.255
        inet6 fe80::20c:29ff:fe3d:65a2  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:3d:65:a2  txqueuelen 1000  (Ethernet)
        RX packets 116168  bytes 60871684 (58.0 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 76307  bytes 15878012 (15.1 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
 lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 0  (Local Loopback)
        RX packets 5383  bytes 2888858 (2.7 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 5383  bytes 2888858 (2.7 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0       

猜你喜欢

转载自blog.csdn.net/u012271055/article/details/85215416
今日推荐