Linux笔记 Day12---(passwd命令、chage命令、id命令、sudo命令及授权配置)

一、passwd命令

设置用户口令的命令 passwd

用法:passwd [选项] [username]

(1) passwd:修改用户自己的密码;

(2) passwd USERNAME:修改指定用户的密码,但仅root有此权限;

选项:

  • -l, -u:锁定和解锁用户;锁定后的用户其在shadow文件对应用户行的密码前会有两个感叹号"!!"进行标识,解锁后便不存在
  • -d:清除用户密码串;清除后的用户其在shadow文件对应用户行的第二列显示加密后的密码便为空,即什么也不显示
  • -i DAYS:在密码过期后多少天,用户被禁掉,后面接数字;对应于shadow文件该用户信息行的第7列
    说明:此字段规定的宽限天数是 10,则代表密码过期 10 天后禁用;如果是 0,则代表密码过期后立即禁用 ;如果是 -1,则代表密码永远不会禁用
  • -n DAYS:两次密码修改的最小天数,后面接数字;对应于shadow文件该用户信息行的第4列
  • -x DAYS:密码的最长使用期限,即密码有效期,对应于shadow文件该用户信息行的第5列
  • -w DAYS:在距多少天提醒用户修改密码,后面接数字 ,对应于shadow文件该用户信息行的第6列
  • –stdin:echo “PASSWORD” | passwd --stdin USERNAME 从标准输入获取密码
  • -S:简短查看某用户的口令状态信息
  • -e:终止指名帐户的密码

【例 1】

锁定用户后,用户便无法登录 (对应于usermod -L)

[root@admin ~]# cat /etc/shadow |grep dxk
dxk:$6$5d3.bTJT$PfGZFkpy6HiKJSGmjmYoqIbsdqrT4G9GbWI5s8ixWpL51I2OtiETRUW0UGnzu08qW/AbBVd1Uo.Zw.1UZ6p6w0:18471:11:1111:9:100::
[root@admin ~]# passwd -l dxk
锁定用户 dxk 的密码 。
passwd: 操作成功
[root@admin ~]# cat /etc/shadow |grep dxk    #对比着看,密码前出现两个感叹号
dxk:!!$6$5d3.bTJT$PfGZFkpy6HiKJSGmjmYoqIbsdqrT4G9GbWI5s8ixWpL51I2OtiETRUW0UGnzu08qW/AbBVd1Uo.Zw.1UZ6p6w0:18471:11:1111:9:100::

解锁用户 (对应于usermod -U)

[root@admin ~]# passwd -u dxk

【例 2】

清除密码后,密码将显示为空,且用户无法登录使用

[root@admin ~]# cat /etc/shadow   | grep admin094
admin094:$6$8bcFTwAS$8TvVTfpP0q10QowX67W7EJ2opufeHlvbscSx77NWhzkQrgFHF8IWjL9CPFW40dAl0kdEM7CJndayRTHlSFcat1:18470:0:99999:7:::
[root@admin ~]# passwd -d admin094
清除用户的密码 admin094。
passwd: 操作成功
[root@admin ~]# cat /etc/shadow   | grep admin094
admin094::18471:0:99999:7:::

需要root用户重新为该用户设置密码方能使用

【例 3】

设置用户在密码过期后19天,该用户被禁掉

[root@admin ~]# passwd -i 19 admin094
调整用户密码老化数据admin094。
passwd: 操作成功
[root@admin ~]# cat /etc/shadow | grep admin094
admin094:$6$Y2gnGihm$NMte5QCS5qVyC85fbkBK4nnoBgCeBl3yIaPTAT3NFRflNdVvN8LZnJZx/zWTkz//FItUybwinIx3X7iJaMLnh/:18471:0:99999:7:19::
#对应于第7列

设置该用户两次密码修改的最小天数为66,0表示随时可以修改

[root@admin ~]# passwd -n 66 admin094
调整用户密码老化数据admin094。
passwd: 操作成功
[root@admin ~]# cat /etc/shadow | grep admin094
admin094:$6$Y2gnGihm$NMte5QCS5qVyC85fbkBK4nnoBgCeBl3yIaPTAT3NFRflNdVvN8LZnJZx/zWTkz//FItUybwinIx3X7iJaMLnh/:18471:66:99999:7:19::
#对应于第4列

设置其密码有效期为90,这个时间是从1970年算起的时间天数,超过这个时间密码将过期,默认为99999即也就是 273 年,可认为是永久生效。如果改为 90,则表示密码被修改 90 天之后必须再次修改,否则该用户即将过期

[root@admin ~]# passwd -x 90 admin094 
调整用户密码老化数据admin094。
passwd: 操作成功
[root@admin ~]# cat /etc/shadow | grep admin094
admin094:$6$Y2gnGihm$NMte5QCS5qVyC85fbkBK4nnoBgCeBl3yIaPTAT3NFRflNdVvN8LZnJZx/zWTkz//FItUybwinIx3X7iJaMLnh/:18471:66:90:7:19::
#对应于第5列

并设置距3天提醒用户修改密码

默认设置为7天。当账户密码有效期快到时,系统会发出警告信息给此账户,提醒用户 “再过 n 天你的密码就要过期了,请尽快重新设置你的密码!”

[root@admin ~]# passwd -w 3 admin094 
调整用户密码老化数据admin094。
passwd: 操作成功
[root@admin ~]# cat /etc/shadow | grep admin094
admin094:$6$Y2gnGihm$NMte5QCS5qVyC85fbkBK4nnoBgCeBl3yIaPTAT3NFRflNdVvN8LZnJZx/zWTkz//FItUybwinIx3X7iJaMLnh/:18471:66:90:3:19::
#对应于第6列

修改此用户的密码为123456

[root@admin ~]# echo "123456" | passwd --stdin admin094
更改用户 admin094 的密码 。
passwd:所有的身份验证令牌已经成功更新。

【例 4】
查看dxk用户的口令状态信息

[root@admin ~]# passwd -S dxk
dxk PS 2020-07-28 11 1111 9 100 (密码已设置,使用 SHA512 算法。)

二、chage命令

更改用户密码过期信息的命令chage

用法:chage [选项] 登录名

选项:

  • -d:指定密码最后修改日期;对应于shadow文件该用户信息行的第2列

  • -E:密码到期的日期,过了这天,此账号被禁掉不可用,对应于shadow文件的第8列(账户失效时间,单位是对应于计算机元年的天数,若改为 -1 则账户永不过期)

  • -W:密码过期前,提前收到警告信息的天数,同passwd -w;对应于shadow文件该用户信息行的第6列

  • -m:密码可以更改的最小天数,0表示任意时刻都可以修改。同passwd -n;对应于shadow文件该用户信息行的第4列

  • -M:密码保持有效的最大天数,同passwd -x;对应于shadow文件该用户信息行的第5列

  • -l:显示帐户年龄信息
    【例 】
    指定用户的密码最后修改日期为20000,即自1970年1月1日后的20000天的这个日期

[root@admin ~]# chage -d 20000 admin093
[root@admin ~]# cat /etc/shadow | grep admin093
admin093:$6$tKo9iZ6i$CZt7mkQUDKueMZzKAgP.n4gKFjAtOvurukp02W2iNTdc0eWxrZ8J1CsCyMGfwf3ufx1EcN0OsYJPNZlnqO1L9.:20000:0:99999:7:::
[root@admin ~]# date -d "1970-01-01 20000 days"
2024年 10月 04日 星期五 00:00:00 CST

查看dxk用户年龄信息

[root@admin ~]# chage -l dxk
最近一次密码修改时间				:7月 28, 2020
密码过期时间					    :8月 13, 2023
密码失效时间					    :11月 21, 2023
帐户过期时间						:从不
两次改变密码之间相距的最小天数		:11
两次改变密码之间相距的最大天数		:1111
在密码过期之前警告的天数	        :9

其实就对应于shadow文件中的信息:

[root@admin ~]# cat /etc/shadow | grep dxk
dxk:$6$fSU1OoQi$xz.jFCpOKSVAp/7hz4sJCDhl5EdHvh8WYg9oaJ57XUumECiTWlnHoc3VsBXts8xyS0Puswb1oJZhR.hljziec/:18471:11:1111:9:100::

三、id 命令

查询用户的UID、GID 和附加组信息的命令id

用法:id [OPTION]… [USER]

选项:

  • -u: 仅显示有效的UID;
  • -g:仅显示用户的基本组ID;
  • -G:仅显示用户所属的所有组的ID,(包括 基本组和附加组)
  • -n:显示名字而非ID;(必须和-u或-g联合使用)

【例 1】

查看当前用户的用户及用户组相关信息

[dxk@admin ~]$ id
uid=1000(dxk) gid=1000(dxk)=1000(dxk),0(root) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
#当前用户的UID为1000(用户名为dxk) 基本组GID为1000,基本组组名为dxk 该用户所在组有:基本组dxk和附加组:root

查看其他用户的相关信息:

[dxk@admin ~]$ id admin093
uid=1200(admin093) gid=1200(admin093)=1200(admin093)

【例 2】

只查看当前用户的基本组

[dxk@admin ~]$ id -g
1000

查看指定用户的基本组

[dxk@admin ~]$ id -g admin093
1200

【例 3】

仅显示当前用户所属的所有组的ID (包括 基本组和附加组)

[dxk@admin ~]$ id -G
1000 0

仅显示指定用户所属的所有组的ID

[dxk@admin ~]$ id -G admin093
1200

【例 4】

显示用户的用户名而非ID

[dxk@admin ~]$ id -un
dxk
[dxk@admin ~]$ id -un admin093
admin093

显示用户的基本组组名而非id

[dxk@admin ~]$ id -gn
dxk
[dxk@admin ~]$ id -gn admin093
admin093

显示用户的所有组的组名而非id

[dxk@admin ~]$ id -Gn
dxk root
[dxk@admin ~]$ id -Gn admin093
admin093

四、用户管理工具

命令太多,选项太多,记不住?可以借助shell脚本写一个用户的工具类来实现:

这里以passwd命令为例

[root@admin ~]# vim MyToolBox.sh 

#!/bin/bash

while true
do

cat << END
######################################
#                                    #  
#    1.锁定用户                       #
#    2.解锁用户                       #
#    3.清除用户密码                    #
#    4.修改用户密码告警天数             #
#    5.修改用户密码有效期               #
#    6.修改用户密码的最小修改天数        #
#    7.退出                          #
#                                   #
######################################
END

read -p "请输入你要执行的操作对应的菜单号:" NUM

case $NUM in

1)
        read -p "请输入你要锁定的用户名:" LOCKUSR
        passwd -l $LOCKUSR
        ;;
2)
        read -p "请输入你要解锁的用户名:" UNLOCKUSR
        passwd -u $UNLOCKUSR
        ;;
3)
        read -p "请输入你所要清除密码的用户名:" DELPWDUSR
        passwd -d $DELPWDUSR
        ;;
4)
        read -p "请输入要修改的用户名:" WARNUSR
        read -p "请输入设置后该用户密码的告警天数:" WARNINGDAY
        passwd -w $WARNINGDAY $WARNUSR
        ;;
5)
        read -p "请输入要修改的用户名:" USR
        read -p "请输入设置后该用户的密码有效期:" INDATE
        passwd -x  $INDATE $USR
        ;;
6)
        read -p "请输入要修改的用户名:" USERNAME
        read -p "请输入设置后该用户的密码最小修改天数:" MINDAY
        passwd -n $MINDAY $USERNAME
        ;;
7)
        exit
        ;;
*)
        echo"您的输入有误,请重新输入:"

esac

done

保存后执行:

[root@admin ~]# !vim
vim MyToolBox.sh 
[root@admin ~]# vim MyToolBox.sh 
[root@admin ~]# sh MyToolBox.sh 
######################################
#     			                     #	
#    1.锁定用户                     	 #
#    2.解锁用户                     	#
#    3.清除用户密码                  #
#    4.修改用户密码告警天数          #
#    5.修改用户密码有效期            #
#    6.修改用户密码的最小修改天数    #
#    7.退出                          #
#                                    #
######################################
请输入你要执行的操作对应的菜单号:1
请输入你要锁定的用户名:admin001
锁定用户 admin001 的密码 。
passwd: 操作成功
######################################
#     			             #	
#    1.锁定用户                      #
#    2.解锁用户                      #
#    3.清除用户密码                  #
#    4.修改用户密码告警天数          #
#    5.修改用户密码有效期            #
#    6.修改用户密码的最小修改天数    #
#    7.退出                          #
#                                    #
######################################
请输入你要执行的操作对应的菜单号:2
请输入你要解锁的用户名:admin001
解锁用户 admin001 的密码。
passwd: 操作成功
######################################
#     			             #	
#    1.锁定用户                      #
#    2.解锁用户                      #
#    3.清除用户密码                  #
#    4.修改用户密码告警天数          #
#    5.修改用户密码有效期            #
#    6.修改用户密码的最小修改天数    #
#    7.退出                          #
#                                    #
######################################
请输入你要执行的操作对应的菜单号:7
[root@admin ~]# 

这样就实现了一个功能为修改用户密码属性的工具类。

让此shell脚本可以像命令一样执行:

[root@admin ~]# chmod +x MyToolBox.sh 
[root@admin ~]# /root/MyToolBox.sh 

但是这样必须以绝对路径执行,解决办法:
第一种:
重命名

[root@admin ~]# alias mytool="/root/MyToolBox.sh"
#这样就可以在任意位置直接输入mytool就可以使用
[root@admin ~]# mytool

第二种:
将该文件移动到PATH变量的路径下

[root@admin ~]# mv MyToolBox.sh /usr/local/sbin
[root@admin ~]# MyToolBox.sh   #这样就可以像命令一样在任意位置执行

或者:

我们专门指定一个目录存放这些工具类文件并将该目录添加到PATH变量中
这里我们指定/opt/scripts为存放工具类的目录

[root@admin opt]# mkdir scripts
[root@admin opt]# mv /usr/local/sbin/MyToolBox.sh  /opt/scripts/
[root@admin opt]# vim /etc/profile #将以下内容写入该环境变量配置文件中 
PATH=$PATH:/opt/scripts
[root@admin opt]# source /etc/profile
#这样就可以直接执行了
[root@admin opt]# MyToolBox.sh 

五、sudo命令

我们知道,使用 su 命令可以让普通用户切换到 root 身份去执行某些特权命令,但存在一些问题,比如说:

  • 仅仅为了一个特权操作就直接赋予普通用户控制系统的完整权限;
  • 当多人使用同一台主机时,如果大家都要使用 su 命令切换到 root 身份,那势必就需要 root 的密码,这就导致很多人都知道 root 的密码;

考虑到使用 su 命令可能对系统安装造成的隐患,最常见的解决方法是使用 sudo 命令,此命令也可以让你切换至其他用户的身份去执行命令




如何禁止用户使用su命令?
修改 /etc/pam.d/su 文件

将文件中的以下行的注释去掉

# Uncomment the following line to implicitly trust users in the "wheel" group. //翻译为:取消对下面一行的注释,以隐式信任“wheel”组中的用户
#auth           sufficient      pam_wheel.so trust use_uid  #将该行注释去掉

那么此文件便会生效,即只有 wheel 组中的用户才能使用 su命令进行切换,其他用户则不能,要想让所有用户都不能使用,则将wheel组中的所有用户清楚即可




相对于使用 su 命令还需要新切换用户的密码,sudo 命令的运行只需要知道自己的密码即可,甚至于,我们可以通过手动修改 sudo 的配置文件,使其无需任何密码即可运行。

sudo 命令默认只有 root 用户可以运行

命令的基本格式:sudo [-b] [-u 新使用者账号] 要执行的命令

常用选项

  • -b :将后续的命令放到背景中让系统自行运行,不对当前的 shell 环境产生影响。
  • -u :后面可以接欲切换的用户名,若无此项则代表切换身份为 root 。
  • -l:此选项的用法为 sudo -l,用于显示当前用户可以用 sudo 执行那些命令。

【例 】

[root@admin ~]# grep sshd /etc/passwd
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
[root@admin ~]# sudo -u sshd touch /tmp/mysshd
[root@admin ~]# ll /tmp/mysshd
-rw-r--r--. 1 sshd sshd 0 7月  28 15:00 /tmp/mysshd

本例中,无法使用 su - sshd 的方式成功切换到 sshd 账户中,因为此用户的默认 Shell 是 /sbin/nologin。这时就显现出 sudo 的优势,我们可以使用 sudo 以 sshd 的身份在 /tmp 目录下创建 mysshd 文件,可以看到,新创建的 mysshd 文件的所有者确实是 sshd

那么,如何让普通用户也能使用它?

分析一下 sudo 命令的执行过程。sudo命令的运行,需经历如下几步:

  • 当用户运行 sudo 命令时,系统会先通过 /etc/sudoers 文件,验证该用户是否有运行 sudo 的权限;
  • 确定用户具有使用 sudo 命令的权限后,还要让用户输入自己的密码进行确认。出于对系统安全性的考虑,如果用户在默认时间内(默认是 5 分钟)不使用 sudo 命令,此后使用时需要再次输入密码;
  • 密码输入成功后,才会执行 sudo 命令后接的命令。

显然,能否使用 sudo 命令,取决于对 /etc/sudoers 文件的配置(默认情况下,此文件中只配置有 root 用户)

特性:

1、sudo能够限制用户只在某台主机上运行某些命令。
2、sudo提供了丰富的日志,详细地记录了每个用户干了什么。它能够将日志传到中心主机或者日志服务器。
3、sudo使用时间戳文件–日志 来执行类似的“检票”系统。当用户调用sudo并且输入它的密码时,用户获得了一
张存活期为5分钟的票(这个值可以在编译的时候改变)。
4、sudo的配置文件是/etc/sudoers,属性必须为0440,它允许系统管理员集中的管理用户的使用权限和使用的
主机。

下面,我们学习对 /etc/sudoers 文件进行合理的修改

六、 sudo命令的配置文件/etc/sudoers

修改 /etc/sudoers,不建议直接使用 vim,而是使用 visudo。因为修改 /etc/sudoers 文件需遵循一定的语法规则,使用 visudo 的好处就在于,当修改完毕 /etc/sudoers 文件,离开修改页面时,系统会自行检验 /etc/sudoers 文件的语法。

查看该文件:

[root@admin ~]# visudo

## Sudoers allows particular users to run various commands as
## the root user, without needing the root password.
……省略部分输出信息……
## Read drop-in files from /etc/sudoers.d (the # here does not mean a comment)
#includedir /etc/sudoers.d

可以看到,内容很多。/etc/sudoers 文件中每行算一个规则,前面带有#号可以当作是说明的内容,并不执行,。在文件中提供了很多相关命令的示例以供选择,这些示例都可以被特定用户或用户组所使用

/etc/sudoers 的规则可分为两类;一类是别名定义,另一类是授权规则;别名定义并不是必须的,但授权规则是必须的

(一)/etc/sudoers 配置文件中别名规则

别名规则定义格式:

Alias_Type NAME = item1, item2, …
或 Alias_Type NAME = item1, item2, item3 : NAME = item4, item5

别名类型(Alias_Type):别名类型包括如下四种

  • Host_Alias 定义主机别名;
  • User_Alias 用户别名,别名成员可以是用户,用户组(前面要加%号)
  • Runas_Alias 用来定义runas别名,这个别名指定的是“目的用户”,即sudo 允许切换至的用户;(一般都是切换到root用户,所以此类型已经不怎么用)
  • Cmnd_Alias 定义命令别名;

NAME 就是别名,NMAE的命名是包含大写字母、下划线以及数字,但必须以一个大写字母开头,比如SYNADM、SYN_ADM或SYNAD0是合法的,sYNAMDA或1SYNAD是不合法的;

一个别名下有多个成员,成员与成员之间,通过半角,号分隔;成员在必须是有效并事实存在的。什么是有效的呢?

比如主机名,可以通过w查看用户的主机名(或ip地址),如果您只是本地机操作,只通过hostname 命令就能查看;用户名当然是在系统中存在 的,在/etc/passwd中必须存在;

对于定义命令别名,成员也必须在系统中事实存在的文件名(需要绝对路径)
成员受别名类型 Host_Alias、User_Alias、Runas_Alias、Cmnd_Alias 制约,定义什么类型的别名,就要有什么类型的成员相配

我们用Host_Alias定义主机别名时,成员必须是与主机相关联,
比如是主机名(包括远程登录的主机名)、ip地址(单个或整段)、掩码等; 当用户登录时,可以通过w命令来查看登录用户主机信息;用User_Alias和 Runas_Alias定义时,必须要用系统用户做为成员;

用 Cmnd_Alias 定义执行命令的别名时,必须是系统存在的文件,文件名可以用通配符表示,配置Cmnd_Alias时命令需要绝对路径

其中 Runas_Alias 和User_Alias 有点相似,但与User_Alias 不是同一个概念,Runas_Alias 定义的是某个系统用户可以sudo 切换身份到Runas_Alias下的成员;

别名规则是每行算一个规则,如果一个别名规则一行容不下时,可以通过\来续行;同一类型别名的定义,一次也可以定义几个别名,他们中间用:号分隔

①Host_Alias

Host_Alias HT01=localhost,st05,st04,10,0,0,4,255.255.255.0,192.168.1.0/24
注:定义主机别名HT01,通过=号列出成员

Host_Alias HT02=st09,st10
注:主机别名HT02,有两个成员;

Host_Alias HT01=localhost,st05,st04,10,0,0,4,255.255.255.0,192.168.1.0/24:HT02=st09,st10
注:上面的两条对主机别名的定义,可以通过一条来实现,别名之间用:号分割;

说明: 我们通过Host_Alias 定义主机别名时,项目可以是主机名、可以是单个ip(整段ip地址也可以),也可以是网络掩码;如果是主机名,必须是多台机器的网络中,而且这些机器得能通过主机名相互通信访问才有效。

那什么才算是通过主机名相互通信或访问呢?比如 ping 主机名,或通过远程访问主机名 来访问。在我们局域网中,如果让计算机通过主机名访问通信,必须设置/etc/hosts, /etc/resolv.conf ,还要有DNS做解析,

否则相互之间无法通过主机名访问;在设置主机别名时,可以通过hostname 命令来查看本地主机的主机名,通过w 命令查来看登录主机是来源,通过来源来确认其它客户机的主机名或ip地址;
对于主机别名的定义,看上去有点复杂,其实是很简单。

如果不明白Host_Alias 是怎么回事,也可以不用设置主机别名,在定义授权规则时通过ALL来匹配所有可能出现的主机情况。

如果弄懂了主机别名定义的方法,那么其他三个也是一样的,前面也说过,定义别名也不是必须的,但是如果定义好了在第二步授权规则中来使用别名会很方便

② User_Alias

用户别名,别名成员可以是用户,用户组(前面要加%号)

User_Alias ADMIN=ztg,ztguang
定义用户别名ADMIN,有两个成员ztg和ztguang,这两个成员要在系统中确实存在

User_Alias PROCESSES= ztg1
定义用户别名PROCESSES,有一个成员ztg1,这个成员要在系统中确实存在

User_Alias SYSAD=linuxidc,linuxsir,bnnnb,lanhaitun:NETAD=linuxidc,bnnb:WEBMASTER=linuxsir
定义了三个用户别名(集合)。SYSAD中包含linuxidc,linuxsir,bnnnb,lanhaitun这四个用户;NETAD中包含linuxidc,bnnb这两个用户;WEBMASTER中包含linuxsir 这一个用户

③ Runas_Alias

用来定义runas别名,这个别名是指sudo允许切换到的用户;

Runas_Alias RUN_AS = root
定义runas别名RUN_AS,有一个成员root。

④ Cmnd_Alias

定义命令的别名,这些命令必须是系统存在的文件,要用绝对路径,文件名可以用通配符表示。

Cmnd_Alias NETWORKING = /sbin/route, /sbin/ifconfig, /bin/ping:NETREPAIR=/sbin/dhclient, /usr/bin/net
定义了两个命令别名(集合)。一个是NETWORKING ,其中所包含的命令是/sbin/route, /sbin/ifconfig, /bin/ping;另一个是NETREPAIR,其中所包含的命令是/sbin/dhclient, /usr/bin/net

(二)/etc/sudoers中的授权规则

授权规则是分配权限的执行规则,我们前面所讲到的定义别名主要是为了更方便的授权引用别名;如果系统中只有几个用户,其实下放权限比较有限的话,可以不用定义别名,而是针对系统用户直接直接授权,所以在授权规则中别名并不是必须的

授权规则并不是无章可寻,我们了解一下比较简单的写法,如果想详细了解授权规则写法的,可以参看man sudoers

授权规则的定义格式授权用户 主机=命令动作

或者:

授权用户 主机=[(切换到哪些用户或用户组)] [是否需要密码验证] 命令1,[(切换到哪些用户或
用户组)] [是否需要密码验证] [命令2],[(切换到哪些用户或用户组)] [是否需要密码验证] [命令
3] …

说明:
凡是[ ]中的内容,是可以省略;命令与命令之间用,号分隔;在[(切换到哪些用户或用户组)] ,在动作之前也可以指定切换到特定用户下,如果省略,则默认为root用户;如果是ALL ,则代表能切换到所有用户,注意要切换到的目的用户必须用()号括起来,比如(ALL)、(user01)…;如果不需要密码直接运行命令的,应该加 NOPASSWD: 参数,但这些可以省略,如果省略了,默认为是需要验证密码。

sudo的客户端应用

  • sudo -l:列出当前用户可以执行的命令。只有在sudoers里的用户才能使用该选项。
  • sudo -u 用户名 命令:以指定用户的身份执行命令。后面的用户是除root以外的,可以是用户
    名,也可以是UID。
  • sudo -k:清除存活期时间,下次再使用sudo时要再输入密码。
  • sudo -b 命令:在后台执行指定的命令。

这两行是系统为我们提供的模板:

root ALL=(ALL) ALL 
#用户名 被管理主机的地址=(可使用的身份) 授权命令(绝对路径)
%wheel ALL=(ALL) ALL  
%组名 被管理主机的地址=(可使用的身份) 授权命令(绝对路径)

声明:虽然sudo的配置文件是/etc/sudoers,但是这是总文件,不建议在这里配置sudo授权。可以在/etc/sudoers.d/目录下创建一个任意名的文本文件,然后在该文件内写入sudo授权配置信息,系统会自动检索这个目录下的文件并把它当作sudo授权的配置文件

举例说明:

【例 1】

dxk ALL=/usr/bin/chown,/usr/bin/chmod

如果我们在/etc/sudoers.d/目录下创建一个文件并写入以上信息。这表示用户 dxk 可以在任何可能出现的主机名的系统中,可以切换到root用户下执行 /bin/chown 和/bin/chmod 命令。可以通过sudo -l 来查看beinan 在这台主机上允许和禁止运行的命令;

在这里省略了指定切换到哪个用户下执行/usr/bin/shown 和/usr/bin/chmod命令;在省略的情况下默认为是切换到root用户下执行;同时也省略了是不是需要dxk用户输入验证密码,如果省略了,默认为是需要验证密码。

[root@admin sudoers.d]# vim sudorules
#在该文件中写入以下内容并保存退出
dxk ALL =/usr/bin/chown,/usr/bin/chmod
#切换到dxk用户进行查看
[dxk@admin ~]$ sudo -l
[sudo] dxk 的密码:
匹配 %2$s 上 %1$s 的默认条目:
    !visiblepw, always_set_home, match_group_by_gid,
    always_query_group_plugin, 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

用户 dxk 可以在 admin 上运行以下命令:
    (root) /usr/bin/chown, /usr/bin/chmod

【例 2】

dxk ALL=(root) NOPASSWD:/usr/bin/chown,(ALL)/usr/bin/chmod

表示的是 dxk 可以在任何可能出现的主机名的主机中,可以切换到root下执行/usr/bin/chown,不需要输入 dxk 用户的密码;并且可以切换到任何用户下执行/usr/bin/chmod 命令,但执行chmod时需要dxk 输入自己的密码;通过sudo -l 来查看dxk在这台主机上允许和禁止运行的命令;

关于一个命令动作是不是需要密码,我们可以发现在系统在默认的情况下是需要用户密码的,除非特加指出不需要用户需要输入自己密码,所以要在执行动作之前加入NOPASSWD: 参数

[root@admin sudoers.d]# vim sudorules
#添加如下内容
dxk ALL=(root) NOPASSWD: /usr/bin/chown,/usr/bin/chmod
[dxk@admin ~]$ sudo -l
……省略部分输出信息……
用户 dxk 可以在 admin 上运行以下命令:
    (root) NOPASSWD: /usr/bin/chown, /usr/bin/chmod

下面我们进行验证chown命令:

[dxk@admin ~]$ ll yyy
-rw-rw-r--. 1 dxk dxk 13 7月  22 14:41 yyy
[dxk@admin ~]$  chown admin001:admin001 yyy
chown: 正在更改"yyy" 的所有者: 不允许的操作
#以上可以看到不允许普通用户进行该操作
#下面我们使用sudo进行验证
[dxk@admin ~]$ sudo -u root chown admin001:admin001 yyy
[dxk@admin ~]$ ll yyy
-rw-rw-r--. 1 admin001 admin001 13 7月  22 14:41 yyy
#可以看到执行成功,说明配置成功

验证chmod:

#在用户admin001家目录下创建普通文件file
[admin001@admin ~]$ touch file
[admin001@admin ~]$ ll
总用量 0
-rw-rw-r--. 1 admin001 admin001 0 7月  28 17:19 file
#dxk用户是没有权限修改admin001用户的文件
[dxk@admin ~]$ chmod 777 /home/admin001/file
chmod: 无法访问"/home/admin001/file": 权限不够
#但是我们在sudo授权中配置了dxk用户可以在任意主机上切换到任意用户但只能使用chmod权限,那么,进行检验
[dxk@admin ~]$ sudo -u admin001 chmod 777 /home/admin001/file
[sudo] dxk 的密码:
[dxk@admin ~]$ 
#输入密码后我们查看该文件是否发生改变
[admin001@admin ~]$ ll
总用量 0
-rw-rw-r--. 1 admin001 admin001 0 7月  28 17:19 file
#可以看到chmod 777执行成功


【例 3】
比如我们想用 dxk 普通用户通过more /etc/shadow文件的内容时,可能会出现下面的情况;

[dxk@admin ~]$ more /etc/shadow
/etc/shadow: 权限不够

这时我们可以用sudo more /etc/shadow 来读取文件的内容;那么就需要root用户在进行sudo授权,即在sudo授权配置文件中给dxk授权

[root@admin sudoers.d]# vim sudorules
#添加如下内容:
dxk ALL= /usr/bin/more  
#保存退出后使用sudo进行查看
[dxk@admin ~]$ sudo more /etc/shadow
[sudo] dxk 的密码:
root:$6$fgZhUhgS$GyLP1RsgL/cIH.Zx.U52bMJjga2yk90tBFNV9Up3ZNy59o.59r3GG7HmVwP
k3AEBh7dOUZYPo8zJXuT.WKhVA/:18456:0:10000:7:::
bin:*:18353:0:99999:7:::
……省以下信息……

dxk ALL= /usr/bin/more
表示dxk用户可以在任意主机上以root身份使用more命令,因为这里省略了指定切换到哪个用户下,所以默认为root,且需要输入dxk用户密码

【例 4】

用户组在sudo配置文件中的写法;

如果用户组出现在中sudo配置文件,前面要加%号,比如%dxk ,中间不能有空格;

%dxk ALL=/usr/sbin/*,/sbin/*

如果我们在 sudo配置文件中加上如上一行,表示dxk用户组下的所有成员,在所有可能的出现的主机名下,都能切换到root用户下运行 /usr/sbin和/sbin目录下的所有命令,但要输入dxk用户密码

【例 5】使用通配符

(1)

使admin002用户能够有权限使用/usr/sbin/下的所有命令,除了/usr/sbin/userdel并且不用输入admin002用户密码

admin002 ALL=(root) NOPASSWD: /usr/sbin,(root) NOPASSWD:!/usr/sbin/userdel

首先,我们可以看到,普通用户admin002是无法执行useradd、date -s修改系统时间等命令的

[admin002@admin ~]$ useradd newuser
useradd: Permission denied.
useradd:无法锁定 /etc/passwd,请稍后再试。
[admin002@admin ~]$ date -s 20200202
date: 无法设置日期: 不允许的操作

下面我们用root身份给admin002授权

[root@admin sudoers.d]# vim sudorules
#配置以下内容进行授权
admin002 ALL=(root) NOPASSWD:/usr/sbin/,(root) NOPASSWD:!/usr/sbin/userdel

验证:

[admin002@admin ~]$ sudo useradd newtest
[admin002@admin ~]$ cat /etc/passwd | grep newtest
newtest:x:1201:1201::/home/newtest:/bin/bash
[admin002@admin ~]$ sudo userdel newtest
对不起,用户 admin002 无权以 root 的身份在 admin 上执行 /sbin/userdel newtest。

(2)

使用户admin003能够有权限查看var/log/memssage后的所有文件

如果没有在给admin003授权,是不能查看的

[admin003@admin ~]$ sudo cat /var/log/messages

我们信任您已经从系统管理员那里了解了日常注意事项。
总结起来无外乎这三点:

    #1) 尊重别人的隐私。
    #2) 输入前要先考虑(后果和风险)。
    #3) 权力越大,责任越大。


[sudo] admin003 的密码:
admin003 不在 sudoers 文件中。此事将被报告。

下面使用root用户对admin003用户授权:

[root@admin sudoers.d]# vim sudorules
#写入以下内容:
admin003 ALL=(root) NOPASSWD:/usr/bin/cat /var/log/messages*
#验证:
[admin003@admin ~]$ cat /var/log/messages   #授权后要使用sudo执行
cat: /var/log/messages: 权限不够
[admin003@admin ~]$ sudo cat /var/log/messages
……省略以上输出内容……
Jul 28 22:18:18 admin systemd: Created slice User Slice of admin003.
Jul 28 22:18:18 admin systemd: Started Session 4 of user admin003.
Jul 28 22:18:18 admin systemd-logind: New session 4 of user admin003.
#可以看到查看成功

但是这样有一个问题:cat命令可以对文件进行拼接输出,所以也能看到其他文件

[admin003@admin ~]$ sudo cat /var/log/messages /etc/shadow
……省略以上输出内容……
admin092:$6$FYVIG6pR$uA4d8yVAGwKwGNWpwsaYZJlzkBVtb9AwEgHoPnplIjZ1zPMHqiWLv7WYschfkwk1tqYc9mMXR3IIP3gR8rLJe0:18470:0:99999:7:::
admin093:$6$tKo9iZ6i$CZt7mkQUDKueMZzKAgP.n4gKFjAtOvurukp02W2iNTdc0eWxrZ8J1CsCyMGfwf3ufx1EcN0OsYJPNZlnqO1L9.:20000:0:99999:7:::
newtest:!!:18471:0:99999:7:::

那么这样是及其不安全的,可以使用通配符来解决:
将授权文件内容改为

admin003 ALL=(root) NOPASSWD:/usr/bin/cat /var/log/messages*,!/usr/bin/cat /var/log/message* *

验证:

[admin003@admin ~]$ sudo cat /var/log/messages /etc/shadow
对不起,用户 admin003 无权以 root 的身份在 admin 上执行 /bin/cat /var/log/messages /etc/shadow。
[admin003@admin ~]$ sudo cat /var/log/messages
……省略以上输出内容……
Jul 28 22:18:18 admin systemd: Created slice User Slice of admin003.
Jul 28 22:18:18 admin systemd: Started Session 4 of user admin003.
Jul 28 22:18:18 admin systemd-logind: New session 4 of user admin003.
#messages等文件内容还是可以查看的

【例 7】别名的运用

(1)
使user1和user2用户能够有权限修改IP,使用别名实现,且不需要输入密码

User_Alias  USER=user1,user2
Cmnd_Alias IP=/usr/sbin/ip
USER ALL=(root) NOPASSWD:IP

(2)

[root@admin sudoers.d]# vim sudorules
#写入以下内容:
User_Alias SYSADER=beinan,linuxsir,%beinan
User_Alias DISKADER=lanhaitun
Runas_Alias OP=root
Cmnd_Alias SYDCMD=/bin/chown,/bin/chmod,/usr/sbin/adduser,/usr/bin/passwd [A-Za-z]*,!/usr/bin/passwd root
Cmnd_Alias DSKCMD=/sbin/parted,/sbin/fdisk 注:定义命令别名DSKCMD,下有成员parted和fdisk ;
SYSADER ALL= SYDCMD,DSKCMD
DISKADER ALL=(OP) DSKCMD

注解:

第一行:定义用户别名SYSADER 下有成员 beinan、linuxsir和beinan用户组下的成员,用户组前面必须加%号;

第二行:定义用户别名 DISKADER ,成员有lanhaitun

第三行:定义Runas用户,也就是目标用户的别名为OP,下有成员root

第四行:定义SYSCMD命令别名,成员之间用,号分隔,最后的!/usr/bin/passwd root 表示不能通过passwd 来更改root密码;

第五行:定义命令别名DSKCMD,下有成员parted和fdisk ;

第 六行: 表示授权SYSADER下的所有成员,在所有可能存在的主机名的主机下运行或禁止 SYDCMD和DSKCMD下定义的命令。更为明确的说, 用户beinan、用户linuxsir和beinan用户组下的成员能以root身份运行 chown 、chmod 、adduser、passwd,但不能 更改root的密码;也可以以root身份运行 parted和fdisk ,本条规则的等价规则是;

beinan,linuxsir,%beinan ALL=/bin/chown,/bin/chmod,/usr/sbin/adduser,/usr/bin/passwd [A-Za-z]*,!/usr/bin/passwd root,/sbin/parted,/sbin/fdisk

第七行:表示授权DISKADER 下的所有成员,能以OP的身份,来运行 DSKCMD ,需要密码;更为明确的说 lanhaitun 能以root身份运行 parted和fdisk 命令;其等价规则是:

lanhaitun ALL=(root) /sbin/parted,/sbin/fdisk

如果不想输入用户的密码就能切换到root并运行SYDCMD和DSKCMD 下的命令,那应该写为:

SYSADER ALL= NOPASSWD: SYDCMD, NOPASSWD: DSKCMD

猜你喜欢

转载自blog.csdn.net/weixin_45880055/article/details/107628779