设置用户口令的命令 passwd
用法:passwd [选项] [username]
(1) passwd:修改用户自己的密码;
(2) passwd USERNAME:修改指定用户的密码,但仅root有此权限;
选项:
【例 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 [选项] 登录名
选项:
-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::
查询用户的UID、GID 和附加组信息的命令id
用法:id [OPTION]… [USER]
选项:
【例 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
我们知道,使用 su 命令可以让普通用户切换到 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 新使用者账号] 要执行的命令
常用选项:
【例 】
[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 文件的配置(默认情况下,此文件中只配置有 root 用户)
特性:
1、sudo能够限制用户只在某台主机上运行某些命令。
2、sudo提供了丰富的日志,详细地记录了每个用户干了什么。它能够将日志传到中心主机或者日志服务器。
3、sudo使用时间戳文件–日志 来执行类似的“检票”系统。当用户调用sudo并且输入它的密码时,用户获得了一
张存活期为5分钟的票(这个值可以在编译的时候改变)。
4、sudo的配置文件是/etc/sudoers,属性必须为0440,它允许系统管理员集中的管理用户的使用权限和使用的
主机。
下面,我们学习对 /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 的规则可分为两类;一类是别名定义,另一类是授权规则;别名定义并不是必须的,但授权规则是必须的
别名规则定义格式:
Alias_Type NAME = item1, item2, …
或 Alias_Type NAME = item1, item2, item3 : NAME = item4, item5
别名类型(Alias_Type):别名类型包括如下四种
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
授权规则是分配权限的执行规则,我们前面所讲到的定义别名主要是为了更方便的授权引用别名;如果系统中只有几个用户,其实下放权限比较有限的话,可以不用定义别名,而是针对系统用户直接直接授权,所以在授权规则中别名并不是必须的
授权规则并不是无章可寻,我们了解一下比较简单的写法,如果想详细了解授权规则写法的,可以参看man sudoers
授权规则的定义格式:授权用户 主机=命令动作
或者:
授权用户 主机=[(切换到哪些用户或用户组)] [是否需要密码验证] 命令1,[(切换到哪些用户或
用户组)] [是否需要密码验证] [命令2],[(切换到哪些用户或用户组)] [是否需要密码验证] [命令
3] …
说明:
凡是[ ]中的内容,是可以省略;命令与命令之间用,号分隔;在[(切换到哪些用户或用户组)] ,在动作之前也可以指定切换到特定用户下,如果省略,则默认为root用户;如果是ALL ,则代表能切换到所有用户,注意要切换到的目的用户必须用()号括起来,比如(ALL)、(user01)…;如果不需要密码直接运行命令的,应该加 NOPASSWD:
参数,但这些可以省略,如果省略了,默认为是需要验证密码。
sudo的客户端应用
这两行是系统为我们提供的模板:
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