Linux学习:Linux账号管理与ACL权限设置(第13章)

1 Linux账号与用户组

1.1 用户标识符:UID、GID

文件具有拥有人和拥有人组的两个属性。每个登陆的用户都至少获取两个id,及UID和GID;

当我们有要显示文件属性的需求时,系统会依据 /etc/passwd 与 /etc/group 的内容, 找到 UID / GID 对应的帐号与群组名称再显示出来,若修改GID/UID的号码,那么下次查找时,就找不到UID/GID对用的账号名;

1.2 用户帐号

输入帐号密码后,系统进行的工作如下:

  1. 先找寻 /etc/passwd 里面是否有你输入的帐号?如果没有则跳出,如果有的话则将该帐号对应的 UID 与 GID (在 /etc/group 中) 读出来,另外,该帐号的主文件夹与 shell 设置也一并读出;

  2. 再来则是核对密码表!这时 Linux 会进入 /etc/shadow 里面找出对应的帐号与 UID,然后核对一下你刚刚输入的密码与里头的密码是否相符?

  3. 如果一切都 OK 的话,就进入 Shell 控管的阶段啰。

 与使用者帐号有关的有两个非常重要的文件,一个是管理使用者 UID/GID 重要参数的 /etc/passwd ,一个则是专门管理密码相关数据的 /etc/shadow 

1.2.1 /etc/passwd 文件结构

[root@localhost ~]# head -n 4 /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin

每一行都是用:分隔开,共分为7大部分(p420),如下图

Linux学习:Linux账号管理与ACL权限设置(第13章)_第1张图片

Linux学习:Linux账号管理与ACL权限设置(第13章)_第2张图片

 1.2.2 /etc/shadow文件结构

[root@localhost ~]# head -n 4 /etc/shadow
root:$6$wtbCCce/PxMeE5wm$KE2IfSJr.YLP7Rcai6oa/T7KFhO...:16559:0:99999:7:::  <==下面说明用
bin:*:16372:0:99999:7:::
daemon:*:16372:0:99999:7:::
adm:*:16372:0:99999:7:::

该文件结构主要包括:账号名称、密码、最近修改密码的日期、密码不可被修改的天数、密码需要重新修改的天数、密码需要修改期限前的警告天数、密码过期后的账号宽限时间(密码失效日)、账号失效日期、保留

查询shadow是使用那种加密的机制的方法:authconfig命令

[root@localhost ~]# authconfig --test | grep hashing
 password hashing algorithm is md5
//这就是目前密码的加密机制

1.3 有效与初始群组、groups, newgrp

1.3.1 /etc/group文件结构

[root@localhost ~]# head -n 4 /etc/group
root:x:0:
bin:x:1:
daemon:x:2:
sys:x:3:

每一行代表一个用户组,并以:进行分隔

分别代表:组名、用户组密码、GID和此用户组支持的账户名称

帐号相关文件之间的 UID/GID 与密码相关性示意图

Linux学习:Linux账号管理与ACL权限设置(第13章)_第3张图片

1.3.2 有效群组(effective group)与初始群组(initial group)

1.3.3 groups:有效与支持用户组的观察

查找mcb这个用户所有支持的用户组

[mcb@localhost root]$ groups
mcb wheel
//由输出可知,该用户同时属于mcb wheel这两个用户组,且第一个输出的用户组为有效用户组

有效用户组的作用是新建文件 

1.3.4 newgrp:有效用户的切换

mcb可以在mcb 和 wheel这两个群组之间任意切换

[mcb@localhost root]$ newgrp wheel
[mcb@localhost root]$ groups
wheel mcb
[mcb@localhost root]$ exit    //退出newgrp的环境
exit
[mcb@localhost root]$ groups
mcb wheel

newgrp运行示意图如下所示:

Linux学习:Linux账号管理与ACL权限设置(第13章)_第4张图片

2 账号管理

2.1 新增与删除用户:useradd、相关配置文件、passwd、usermod、userdel 

2.1.1 useradd 创建用户

useradd [-u UID] [-g 初始群组] [-G 次要群组] [-mM]\
> [-c 说明栏] [-d 家目录绝对路径] [-s shell] 使用者帐号名
选项与参数:
-u  :后面接的是 UID ,是一组数字。直接指定一个特定的 UID 给这个帐号;
-g  :后面接的那个群组名称就是我们上面提到的 initial group 啦~
      该群组的 GID 会被放置到 /etc/passwd 的第四个字段内。
-G  :后面接的群组名称则是这个帐号还可以加入的群组。
      这个选项与参数会修改 /etc/group 内的相关数据;
-M  :强制!不要创建使用者家目录 (系统帐号默认值)
-m  :强制!要创建使用者家目录(一般帐号默认值)
-c  :这个就是 /etc/passwd 的第五栏的说明内容,可以随便我们设置的
-d  :指定某个目录成为主文件夹,而不要使用默认值。务必使用绝对路径!
-r  :创建一个系统的帐号,这个帐号的 UID 会有限制 (参考 /etc/login.defs)
-s  :后面接一个shell ,若没有指定则默认是 /bin/bash
-e  :后面接一个日期,格式为“YYYY-MM-DD”此项目可写入shadow第八字段,
      亦即帐号失效日的设置选项
-f  :后面接 shadow 的第七栏位选项,指定密码是否会失效。0为立刻失效,
      -1 为永远不失效(密码只会过期而强制于登陆时重新设置而已。)

范例一:完全参考默认值创建一个使用者,名称为 vbird1
[[email protected] ~]# useradd vbird1
[[email protected] ~]# ll -d /home/vbird1
drwx------. 3 vbird1 vbird1 74 Jul 20 21:50 /home/vbird1
# 默认会创建使用者主文件夹,且权限为 700 !这是重点!

[[email protected] ~]# grep vbird1 /etc/passwd /etc/shadow /etc/group
/etc/passwd:vbird1:x:1003:1004::/home/vbird1:/bin/bash
/etc/shadow:vbird1:!!:16636:0:99999:7:::
/etc/group:vbird1:x:1004:    <==默认会创建一个与帐号一模一样的群组名

使用 useradd 创建使用者帐号时,其实会更改不少地方,至少我们就知道下面几个文件:

  • 使用者帐号与密码参数方面的文件:/etc/passwd, /etc/shadow
  • 使用者群组相关方面的文件:/etc/group, /etc/gshadow
  • 使用者的主文件夹:/home/帐号名称

2.1.2 useradd 参考文件

[mcb@localhost root]$ useradd -D
GROUP=100       //默认的用户组
HOME=/home      //默认的家目录所在的目录
INACTIVE=-1     //密码失效日,在shadow内的第七栏
EXPIRE=         //账号失效日,在shadow内的第八栏
SHELL=/bin/bash //默认的shell
SKEL=/etc/skel  //使用者家目录的内容数据参考目录
CREATE_MAIL_SPOOL=yes    //是否主动帮使用者建立邮箱

可以使用userdel命令去删除一个账号;

 如果使用 userdel 去删除一个帐号时,且该帐号所属的初始群组已经没有人隶属于该群组了, 那么就删除掉该群组,举例来说,我们刚刚有创建 vbird4 这个帐号,他会主动创建 vbird4 这个群组。 若 vbird4 这个群组并没有其他帐号将他加入支持的情况下,若使用 userdel vbird4 时,该群组也会被删除的意思

2.1.3 passwd 修改密码

passwd [--stdin] [帐号名称]  //所有人均可使用来改自己的密码
[root@localhost ~]# passwd [-l] [-u] [--stdin] [-S] \
> [-n 日数] [-x 日数] [-w 日数] [-i 日期] 帐号   <==root 功能
选项与参数:
--stdin :可以通过来自前一个管道的数据,作为密码输入,对 shell script 有帮助!
-l  :是 Lock 的意思,会将 /etc/shadow 第二栏最前面加上!使密码失效;
-u  :与 -l 相对,是 Unlock 的意思!
-S  :列出密码相关参数,亦即 shadow 文件内的大部分信息。
-n  :后面接天数,shadow 的第 4 字段,多久不可修改密码天数
-x  :后面接天数,shadow 的第 5 字段,多久内必须要更动密码
-w  :后面接天数,shadow 的第 6 字段,密码过期前的警告天数
-i  :后面接“日期”,shadow 的第 7 字段,密码失效日期

范例一:请 root 给予 vbird2 密码
[root@localhost ~]# passwd vbird2
Changing password for user vbird2.
New UNIX password: <==这里直接输入新的密码,屏幕不会有任何反应
BAD PASSWORD: The password is shorter than 8 characters <==密码太简单或过短的错误!
Retype new UNIX password:  <==再输入一次同样的密码
passwd: all authentication tokens updated successfully.  <==竟然还是成功修改了!

注意:passwd后面不接账号名是修改自己的密码,而passwd后面接账号名【passwd 账号名】,则是帮一般账号建立密码

范例二:使用 standard input 创建用户的密码
[root@localhost ~]# echo "abc543CC" | passwd --stdin vbird2
Changing password for user vbird2.
passwd: all authentication tokens updated successfully.
范例三:管理 vbird2 的密码使具有 60 天变更、密码过期 10 天后帐号失效的设置
[root@localhost ~]# passwd -S vbird2
vbird2 PS 2015-07-20 0 99999 7 -1 (Password set, SHA512 crypt.)
# 上面说明密码创建时间 (2015-07-20)、0 最小天数、99999 变更天数、7 警告日数与密码不会失效 (-1)

[root@localhost ~]# passwd -x 60 -i 10 vbird2
[root@localhost ~]# passwd -S vbird2
vbird2 PS 2015-07-20 0 60 7 10 (Password set, SHA512 crypt.)
例4:锁定账号,并恢复
[root@localhost ~]# passwd -l mcb
解除锁定
[root@localhost ~]# passwd -u mcb

2.1.4 chage 更详细的密码参数显示功能

[root@localhost ~]# chage [-ldEImMW] 帐号名
选项与参数:
-l :列出该帐号的详细密码参数;
-d :后面接日期,修改 shadow 第三字段(最近一次更改密码的日期),格式 YYYY-MM-DD
-E :后面接日期,修改 shadow 第八字段(帐号失效日),格式 YYYY-MM-DD
-I :后面接天数,修改 shadow 第七字段(密码失效日期)
-m :后面接天数,修改 shadow 第四字段(密码最短保留天数)
-M :后面接天数,修改 shadow 第五字段(密码多久需要进行变更)
-W :后面接天数,修改 shadow 第六字段(密码过期前警告日期)
例一:列出mcb的详细密码参数
[root@localhost ~]# chage -l mcb
最近一次密码修改时间                                    :4月 24, 2023
密码过期时间                                    :从不
密码失效时间                                    :从不
帐户过期时间                                            :从不
两次改变密码之间相距的最小天数          :0
两次改变密码之间相距的最大天数          :99999
在密码过期之前警告的天数        :7
例二:建立一个名为wm的账号,该账号第一次灯枯使用默认密码,但必须要修改密码后
使用新密码才能够登陆系统使用bash环境
[root@localhost ~]# useradd wm
[root@localhost ~]# echo "wm" | passwd --stdin wm
更改用户 wm 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@localhost ~]# chage -d 0 wm
[root@localhost ~]# chage -l wm | head -n 3
最近一次密码修改时间                                    :密码必须更改
密码过期时间                                    :密码必须更改
密码失效时间                                    :密码必须更改

以wm账号登录时
[root@localhost ~]# sudo su wm
[wm@localhost root]$ passwd
更改用户 wm 的密码 。
为 wm 更改 STRESS 密码。
(当前)UNIX 密码:
新的 密码:
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。

linux下添加新用户,切换用户登录https://blog.51cto.com/u_12114979/1867827#:~:text=%E6%AD%A5%E9%AA%A4%E5%A6%82%E4%B8%8B%3A%201%20%E5%91%BD%E4%BB%A4%E8%A1%8C%E8%BE%93%E5%85%A5%20adduser%20%E7%94%A8%E6%88%B7%E5%90%8D%20%28%E5%A6%82%3Alanp%29%20%E5%9B%9E%E8%BD%A6%2C%28%E6%B3%A8%E6%84%8F%3A%E6%AD%A4%E5%A4%84linux%E4%B8%8D%E4%BC%9A%E6%98%BE%E7%A4%BA%E4%BB%BB%E4%BD%95%E4%BF%A1%E6%81%AF%E5%87%BA%E6%9D%A5%29%3B%202,%E5%9B%9E%E8%BD%A6%E5%8D%B3%E5%8F%AF%3B%206%20root%E5%88%87%E6%8D%A2%E5%88%B0%E6%99%AE%E9%80%9A%E7%94%A8%E6%88%B7%EF%BC%8C%E7%94%A8%E5%91%BD%E4%BB%A4su%20%E7%94%A8%E6%88%B7%E5%90%8D%20%28su%E5%8D%B3switch%20user%E5%88%87%E6%8D%A2%E7%94%A8%E6%88%B7%E7%9A%84%E6%84%8F%E6%80%9D%29%EF%BC%8C%E5%A6%82%E6%9E%9C%E6%98%AF%E6%99%AE%E9%80%9A%E7%94%A8%E6%88%B7%E5%88%87%E6%8D%A2%E5%88%B0root%EF%BC%8C%E5%88%99su%20%E5%9B%9E%E8%BD%A6%EF%BC%88%E6%88%96%E8%80%85su%20-%E5%9B%9E%E8%BD%A6%EF%BC%8C%E8%BF%99%E4%B8%AA%E4%BB%A3%E8%A1%A8%E6%8A%8Aroot%E5%8F%98%E9%87%8F%E9%83%BD%E4%BC%A0%E9%80%92%E4%BA%86%E8%BF%87%E6%9D%A5%EF%BC%89%3B

2.1.5 usermod 

用于账号相关数据的微调

[root@localhost ~]# usermod [-cdegGlsuLU] username
选项与参数:
-c  :后面接帐号的说明,即 /etc/passwd 第五栏的说明栏,可以加入一些帐号的说明。
-d  :后面接帐号的家目录,即修改 /etc/passwd 的第六栏;
-e  :后面接日期,格式是 YYYY-MM-DD 也就是在 /etc/shadow 内的第八个栏位的内容。
-f  :后面接天数,为 shadow 的第七栏位。
-g  :后面接初始用户组,修改 /etc/passwd 的第四个栏位,亦即是 GID 的栏位。
-G  :后面接次要用户组,修改这个使用者能够支持的用户组,修改的是 /etc/group。
-a  :与 -G 合用,可“增加次要群组的支持”而非“设置”;
-l  :后面接帐号名称。亦即是修改帐号名称, /etc/passwd 的第一栏!
-s  :后面接 Shell 的实际文件,例如 /bin/bash 或 /bin/csh 等等。
-u  :后面接 UID 数字,即 /etc/passwd 第三栏的数据;
-L  :暂时将使用者的密码冻结,让他无法登录。其实仅改 /etc/shadow 的密码栏。
-U  :将 /etc/shadow 密码栏的 ! 拿掉,解锁;
例一:修改使用者wm的说明栏,加上wm's test说明
[root@localhost ~]# grep -n wm /etc/passwd
45:wm:x:1001:1001::/home/wm:/bin/bash
[root@localhost ~]# usermod -c "wm's test" wm
[root@localhost ~]# grep wm /etc/passwd
wm:x:1001:1001:wm's test:/home/wm:/bin/bash
例二:账号在2023-12-31失效
[root@localhost ~]# usermod -e "2023-12-31" wm
[root@localhost ~]# chage -l wm 
[root@localhost ~]# chage -l wm
最近一次密码修改时间                                    :6月 24, 2023
密码过期时间                                    :从不
密码失效时间                                    :从不
帐户过期时间                                            :12月 31, 2023
两次改变密码之间相距的最小天数          :0
两次改变密码之间相距的最大天数          :99999
在密码过期之前警告的天数        :7

2.1.6 userdel: 删除用户相关数据

[root@localhost ~]# userdel [-r] username
选项与参数:
-r  :连同使用者的家目录也一起删除

范例一:删除 wm,连同主文件夹一起删除
[root@localhost ~]# userdel -r wm
userdel: user wm is currently used by process 62982

该错误可能的原因是你创建用户user1之后,使用su命令切换到user1用户下,之后又想删除user1用户,使用su root切换到root用户下,使用userdel user1。出现上述情况的根本原因在于切换回root用户之后,user1还被某个进程占用

解决方案:ctrl+d(退出当前用户)

第一次使用ctrl+d退出root用户,回到wm用户;第二次使用ctrl+d退出wm用户,此时会返回到root用户(再按ctrl+d退出登陆连接),此时使用userdel -r wm就可以正常删除

此时,利用cat /etc/passwd查找不到wm这个账号的详细信息;

userdel: user xxx is currently used by process xxx 解决方案https://blog.csdn.net/qq_27610647/article/details/100055786

2.2 用户功能

2.2.1 id 查询UID/GID

[root@localhost ~]# id mcb
uid=1000(mcb) gid=1000(mcb) 组=1000(mcb),10(wheel)

2.2.2 finger 用来查看与用户相关信息

[root@localhost ~]# finger [-s] username
选项与参数:
-s  :仅列出使用者的帐号、全名、终端机代号与登陆时间等等;
-m  :列出与后面接的帐号相同者,而不是利用部分比对 (包括全名部分)

范例一:观察 vbird1 的使用者相关帐号属性
[[email protected] ~]# finger vbird1
Login: vbird1                           Name:
Directory: /home/vbird1                 Shell: /bin/bash
Never logged in.
No mail.
No Plan.

2.2.3 chfn (不重要)

[root@localhost ~]# chfn [-foph] [帐号名]
选项与参数:
-f  :后面接完整的大名;
-o  :您办公室的房间号码;
-p  :办公室的电话号码;
-h  :家里的电话号码!
范例一:修改一下自己的相关信息
[root@localhost ~]# chfn
Changing finger information for root.
名称 [root]: moring
办公 []: 404 in usc
办公电话 []: 185164577899
住宅电话 []: 6639801

Finger information changed.

2.2.4 chsh    即:change shell

[root@localhost ~]# chsh [-ls]
选项与参数:
-l  :列出目前系统上面可用的 shell ,其实就是 /etc/shells 的内容!
-s  :设置修改自己的 Shell 

2.3 新增和删除用户组

用户组的内容都与这两个文件有关:/etc/group, /etc/gshadow

2.3.1 groupadd 创建新的用户组

[root@localhost ~]# groupadd [-g gid] [-r] 群组名称
选项与参数:
-g  :后面接某个特定的 GID ,用来直接给予某个 GID 。
-r  :创建系统用户组,与 /etc/login.defs 内的 GID_MIN 有关。

新建一个用户组,名为group1
[root@localhost ~]# groupadd group1
[root@localhost ~]# grep group1 /etc/group /etc/gshadow
/etc/group:group1:x:1001:
/etc/gshadow:group1:!::

2.3.2 groupmod 修改用户组的相关参数

[root@localhost ~]# groupmod [-g gid] [-n group_name] 群组名
选项与参数:
-g  :修改既有的 GID 数字;
-n  :修改既有的群组名称

将group1名称修改为mygroup,GID为201
[root@localhost ~]# groupmod -g 201 -n mygroup group1
[root@localhost ~]# grep mygroup /etc/group /etc/gshadow
/etc/group:mygroup:x:201:
/etc/gshadow:mygroup:!::

2.3.3 groupdel  删除用户组

/etc/gshadow:mygroup:!::
[root@localhost ~]# groupdel mygroup

2.3.4 gpasswd  创建用户组管理员

# 关于系统管理员(root)做的动作:
[root@localhost ~]# gpasswd groupname
[root@localhost ~]# gpasswd [-A user1,...] [-M user3,...] groupname
[root@localhost ~]# gpasswd [-rR] groupname
选项与参数:
    :若没有任何参数时,表示给予 groupname 一个密码(/etc/gshadow)
-A  :将 groupname 的主控权交由后面的使用者管理(该群组的管理员)
-M  :将某些帐号加入这个群组当中!
-r  :将 groupname 的密码移除
-R  :让 groupname 的密码栏失效

# 关于群组管理员(Group administrator)做的动作:
[mcb@localhost root]$ gpasswd [-ad] user groupname
选项与参数:
-a  :将某位使用者加入到 groupname 这个群组当中!
-d  :将某位使用者移除出 groupname 这个群组当中。

3 ACL(访问控制列表) 的使用

3.1 getfacl、setfacl : ACL的设置技巧

ACL 可以针对单一使用者,单一文件或目录来进行 r,w,x 的权限规范,对于需要特殊权限的使用状况非常有帮助。

ACL 主要可以针对哪些方面来控制权限呢?他主要可以针对几个项目

  • 使用者 (user):可以针对使用者来设置权限;
  • 群组 (group):针对群组为对象来设置其权限;
  • 默认属性 (mask):还可以针对在该目录下在创建新文件/目录时,规范新数据的默认权限;

查看与设置ACL:

  • getfacl:取得某个文件/目录的 ACL 设置项目;
  • setfacl:设置某个目录/文件的 ACL 规范

3.1.1 setfacl

[root@localhost ~]# setfacl [-bkRd] [{-m|-x} acl参数] 目标文件名
选项与参数:
-m :设置后续的 acl 参数给文件使用,不可与 -x 合用;
-x :删除后续的 acl 参数,不可与 -m 合用;
-b :移除“所有的” ACL 设置参数;
-k :移除“默认的” ACL 参数,关于所谓的“默认”参数于后续范例中介绍;
-R :递回设置 acl ,亦即包括次目录都会被设置起来;
-d :设置“默认 acl 参数”的意思!只对目录有效,在该目录新建的数据会引用此默认值
# 1\. 针对特定使用者的方式:
# 设置规范:“ u:[使用者帐号列表]:[rwx] ”,例如针对 mcb 的权限规范 rx :
[root@localhost mcb]# touch acl_test1
[root@localhost mcb]# ll acl_test1
-rw-r--r--. 1 root root 0 6月  25 14:33 acl_test1
[root@localhost mcb]# setfacl -m u:mcb:rx acl_test1
[root@localhost mcb]# ll acl_test1
-rw-r-xr--+ 1 root root 0 6月  25 14:33 acl_test1
[root@localhost mcb]# setfacl -m u::rwx acl_test1
[root@localhost mcb]# ll acl_test1
-rwxr-xr--+ 1 root root 0 6月  25 14:33 acl_test1
# 设置值中的 u 后面无使用者列表,代表设置该文件拥有者,所以上面显示 root 的权限成为 rwx 了!

3.1.2 getfacl

[root@localhost mcb]# getfacl filename
选项与参数:
getfacl 的选项几乎与 setfacl 相同;
[root@localhost mcb]# getfacl acl_test1
# file: acl_test1    //说明文档名而已
# owner: root        //说明此文件的拥有者,亦即 ls -l 看到的第三使用者字段
# group: root        //此文件的所属群组,亦即 ls -l 看到的第四群组字段
user::rwx            //使用者列表栏是空的,代表文件拥有者的权限
user:mcb:r-x         //针对 mcb 的权限设置为 rx ,与拥有者并不同
group::r--           //针对文件群组的权限设置仅有 r
mask::r-x            //此文件默认的有效权限 (mask)
other::r--           //其他人拥有的权限

3.1.3 特定的单一群组的权限设置:“ g:群组名:权限 ”

# 2、针对特定群组的方式:
# 设置规范:【g:[用户组列表]:[rwx]】,例如针对 mygroup1 的权限规范 rx :
[root@localhost mcb]# setfacl -m g:mygroup1:rx acl_test1
setfacl: Option -m: 无效的参数 near character 3
[root@localhost mcb]# setfacl -m g:mcb:rx acl_test1
[root@localhost mcb]# getfacl acl_test1
# file: acl_test1
# owner: root
# group: root
user::rwx
user:mcb:r-x
group::r--
group:mcb:r-x
mask::r-x
other::r--

3.1.4 针对有效权限设置:【m:权限 】

# 设置规范:【m:[rwx]】”,例如针对刚刚的文件规范为仅有 r :
[root@localhost mcb]# setfacl -m m:r acl_test1
[root@localhost mcb]# getfacl acl_test1
# file: acl_test1
# owner: root
# group: root
user::rwx
user:mcb:r-x                    #effective:r--       //mcb+mask均存在者,仅有r而已,X不会生效
group::r--
group:mcb:r-x                   #effective:r--
mask::r--
other::r--

3.1.5 使用默认权限设置目录未来文件的 ACL 权限继承【 d:[u|g]:[user|group]:权限】

# 设置规范:“ d:[ug]:使用者列表:[rwx] ”
# 让 myuser1 在 /srv/projecta 下面一直具有 rx 的默认权限!
# 让 myuser1 在 /srv/projecta 下面一直具有 rx 的默认权限!
[[email protected] ~]# setfacl -m d:u:myuser1:rx /srv/projecta
[[email protected] ~]# getfacl /srv/projecta

4 用户身份切换

4.1 su命令

【su -】可以直接将身份变为root,但是该命令需要输入密码;

【su -l 用户名】切换到一般用户名账号中

【exit】退出su环境

【su - -c 命令】只使用root身份执行一次命令,执行完毕后返回一般用户账号

[mcb@localhost ~]$ head -n 3 /etc/shadow
head: 无法打开"/etc/shadow" 读取数据: 权限不够
[mcb@localhost ~]$ su - -c "head -n 3 /etc/shadow"
密码:
root:$5$LMXvZCGx$vPjvt3RSI4IeucfARRVpGL7CoX718VEfDwLM1SjE/Y.::0:99999:7:::
bin:*:18353:0:99999:7:::
daemon:*:18353:0:99999:7:::
[mcb@localhost ~]$

【缺点】当我的主机是多人共管的环境时,如果大家都要使用 su 来切换成为 root 的身份,那么不就每个人都得要知道 root 的密码,这样密码太多人知道可能会流出去

4.2 sudo

[root@localhost mcb]# sudo [-b] [-u 新使用者帐号]
选项与参数:
-b  :将后续的指令放到背景中让系统自行执行,而不与目前的 shell 产生影响
-u  :后面可以接欲切换的使用者,若无此项则代表切换身份为 root 。

除了 root 之外的其他帐号,若想要使用 sudo 执行属于 root 的权限指令,则 root 需要先使用 visudo 去修改 /etc/sudoers ,让该帐号能够使用全部或部分的 root 指令功能

visudo 的设置方式有几种简单的方法

visudo只是利用vi将/etc/sudoers文件调出来进行修改;

  • Ⅰ单一使用者可进行 root 所有指令,与 sudoers 文件语法

[root@localhost mcb]# visudo
....(前面省略)....
root    ALL=(ALL)       ALL  <==找到这一行,大约在 98 行左右
vbird1  ALL=(ALL)       ALL  <==这一行是你要新增的!
....(下面省略)....
[mcb@localhost ~]$ tail -n 1 /etc/shadow
tail: 无法打开"/etc/shadow" 读取数据: 权限不够
# 因为不是 root ,所以当然不能查询 /etc/shadow
[mcb@localhost ~]$ sudo tail -n 1 /etc/shadow    <==通过 sudo
[sudo] mcb 的密码:    <==注意!这里输入的是“mcb 自己的密码 ”
mcb:$5$LMXvZCGx$vPjvt3RSI4IeucfARRVpGL7CoX718VEfDwLM1SjE/Y.:19471:0:99999:7:::
# 看mcb竟然可以查询 shadow!
  • II. 利用 wheel 群组以及免密码的功能处理 visudo

[root@localhost mcb]# visudo  <==同样的,请使用 root 先设置
....(前面省略)....
%wheel     ALL=(ALL)    ALL    <==大约在 106 行左右,请将这行的 # 拿掉!
# 在最左边加上 % ,代表后面接的是一个“群组”之意!改完请储存后离开

[root@localhost mcb]# usermod -a -G wheel pro1 <==将 pro1 加入 wheel 的支持

上面的设置值会造成“任何加入 wheel 这个群组的使用者,就能够使用 sudo 切换任何身份来操作任何指令”的意思。 你当然可以将 wheel 换成你自己想要的群组名

[pro1@localhost ~]$ sudo tail -n 1 /etc/shadow      //注意身份是 pro1
....(前面省略)....
[sudo] password for pro1:       //输入 pro1 的密码喔!
pro3:$6$DMilzaKr$OeHeTDQPHzDOz/u5Cyhq1Q1dy...:16636:0:99999:7:::

[pro2@localhost ~]$ sudo tail -n 1 /etc/shadow        //注意身份是 pro2
[sudo] password for pro2:                               //输入 pro2 的密码喔!
pro2 is not in the sudoers file.  This incident will be reported.
# 仔细看错误讯息他是说这个 pro2 不在 /etc/sudoers 的设置中!

不添加密码使用sudo的方式:

[root@localhost ~]# visudo     //同样的,请使用 root 先设置
....(前面省略)....
%wheel     ALL=(ALL)   NOPASSWD: ALL     //大约在 109 行左右,请将 # 拿掉!
# 在最左边加上 % ,代表后面接的是一个“群组”之意!改完请储存后离开
  • III. 有限制的指令操作:

让用户进能够进行部分系统任务,而不是像前面两种情况让用户能够志雄所有的系统任务,这样对系统的安全会造成很大的挑战

#例一:系统上的wm仅可以帮root修改其他用户的密码,即用户仅能够
#使用passwd这个命令帮助root修改其他用户的密码
[root@localhost ~]# visudo
wm     ALL=(root)      /usr/bin/passwd    #最后命令务必使用绝对命令

[wm@localhost ~]$ sudo passwd mn

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

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

[sudo] wm 的密码:
更改用户 mn 的密码 。
新的 密码:
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。

  • IV. 通过别名创建 visudo:

        适用于多个用户加入管理员行列的情况下;此时可以通过别名的方法来解决这一问题;

假设我的 pro1, pro2, pro3 与 myuser1, myuser2 要加入上述的密码管理员的 sudo 列表中, 那我可以创立一个帐号别名称为 ADMPW 的名称,然后将这个名称处理一下即可

[[email protected] ~]# visudo             #注意是 root 身份
User_Alias ADMPW = pro1, pro2, pro3, myuser1, myuser2
Cmnd_Alias ADMPWCOM = !/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root
ADMPW   ALL=(root)  ADMPWCOM

通过 User_Alias 创建出一个新帐号,这个帐号名称一定要使用大写字符来处理,包括 Cmnd_Alias(命令别名)、Host_Alias(来源主机名称别名) 都需要使用大写字符

5 shell与PAM模块

5.1 特殊的shell,/sbin/nologin

例题:当使用者尝试利用纯 mail 帐号 (例如 myuser3) 时,
利用 /etc/nologin.txt 告知使用者不要利用该帐号登陆系统。
答:直接以 vim 编辑该文件,内容可以是这样:

[[email protected] ~]# vim /etc/nologin.txt
This account is system account or mail account.
Please DO NOT use this account to login my Linux server.
想要测试时,可以使用 myuser3 (此帐号的 shell 是 /sbin/nologin) 来测试看看!

[[email protected] ~]# su - myuser3
This account is system account or mail account.
Please DO NOT use this account to login my Linux server.

5.2 PAM模块

PAM:插入式验证模块,用来解决账号密码可能不同步的验证问题

查看 /etc/pam.d/passwd 这个配置文件的内容:

[root@localhost ~]# cat /etc/pam.d/passwd
#%PAM-1.0        //PAM的版本说明
auth       include      system-auth    //每一行都是一个验证过程
account    include      system-auth
password   substack     system-auth
-password   optional    pam_gnome_keyring.so use_authtok
password   substack     postlogin
验证类别    控制标准     PAM模块与该模块的参数

6 Linux主机上的用户信息传递

6.1 w、who、last、lastlog:查询用户

  • w: 查看目前已经登陆在系统上面的账户
[root@localhost ~]# w
 10:50:35 up 4 days,  6:35,  3 users,  load average: 0.00, 0.01, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
mcb      :0       :0               196月23 ?xdm?  18:22   1.08s /usr/libexec/gnome-session-binary --session gnome-classic
mcb      tty2                      196月23 47:30m  0.08s  0.16s login -- mcb
mcb      pts/1    192.168.64.1     08:44    3.00s  0.11s  0.21s sshd: mcb [priv]
# 第一行显示目前的时间、开机 (up) 多久,几个使用者在系统上平均负载等;
# 第二行只是各个项目的说明,
# 第三行以后,每行代表一个使用者。如上所示,dmtsai 登陆并取得终端机名 tty2 之意。
root     tty2                          Tue May  9 13:59 - 23:02  (09:03)
mcb      :0           :0               Tue May  9 13:58 - crash (1+06:08)
reboot   system boot  3.10.0-1160.el7. Tue May  9 13:58 - 23:15 (1+09:16)
  •  lastlog:查看账号最近登陆的时间
[root@localhost ~]# lastlog
用户名           端口     来自             最后登陆时间
root             pts/1                     一 6月 26 09:12:05 +0800 2023
...(中间省略).....
postfix                                    **从未登录过**
tcpdump                                    **从未登录过**
mcb              pts/1    192.168.64.1     一 6月 26 08:44:37 +0800 2023
wm               pts/0                     日 6月 25 22:45:10 +0800 2023
mn               pts/0                     日 6月 25 22:49:53 +0800 2023

6.2 write、mesg、wall:用户对谈

  • write:
#write 可以直接将讯息传给接收者啰
[root@localhost ~]# write 使用者帐号 [使用者所在终端接口]
[root@localhost ~]# who
mcb      :0           2023-06-19 09:49 (:0)
mcb      tty2         2023-06-19 09:50
mcb      pts/1        2023-06-26 08:44 (192.168.64.1)
wm       tty3         2023-06-26 11:05
#账号      端口
[root@localhost ~]# write wm tty3
Hello,Here!
please don't do anything wrong...
# 结束时,请按下 [crtl]-d 来结束输入。此时在 wm 的画面中,会出现:
[wm@localhost ~]$ 
Message from [email protected] (as root) on pts/1 at 11:13
Hello,Here!
please don't do anything wrong ...EOF

立刻会有信息回应给wm,不过当时 wm 正在查数据, 这些讯息会立刻打断 wm 原本的工作; 所以,如果 wm这个人不想要接受任何讯息,直接下达这个动作:

  • mesg:
[wm@localhost ~]$ mesg n
[wm@localhost ~]$ mesg
is n

#启用时,直接输入mesg y  即可
  • wall :对所有用户发送短信
[root@localhost ~]# wall "i will shutdown my linux server..."
[root@localhost ~]#
Broadcast message from [email protected] (pts/1) (Mon Jun 26 11:43:40 2023):
i will shutdown my linux server...
#wm这个账号也会接收到相应的广播信息
[wm@localhost ~]$
Broadcast message from [email protected] (pts/1) (Mon Jun 26 11:43:40 2023):
i will shutdown my linux server...

6.3 mail:用户邮箱

6.3.1 发送邮件

 #给账户wm寄信,邮件标题nice to meet you
[mcb@localhost ~]$ mail -s "nice to meet you" wm   
hello ! this is a nice time
go shopping!
.        #结束时,最后一行输入小数点
EOT
[mcb@localhost ~]$    #出现提示字符,提示输入完毕

[wm@localhost ~]$ cat /var/spool/mail/wm    #显示邮件内容
From [email protected]  Tue Jun 27 09:51:04 2023
Return-Path: 
X-Original-To: wm
Delivered-To: [email protected]
Received: by localhost.localdomain (Postfix, from userid 1000)
        id 679C321DBFB8; Tue, 27 Jun 2023 09:51:04 +0800 (CST)
Date: Tue, 27 Jun 2023 09:51:04 +0800
To: [email protected]
Subject: nice to meet you
User-Agent: Heirloom mailx 12.5 7/5/10
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Message-Id: <[email protected]>
From: [email protected] (centos7.0)

hello ! this is a nice time
go shopping!

6.3.2 接收邮件

[wm@localhost ~]$ mail
Heirloom Mail version 12.5 7/5/10.  Type ? for help.
"/var/spool/mail/wm": 1 message 1 new    #代表有一个新的邮件
>N  1 centos7.0             Tue Jun 27 09:51  19/650   "nice to meet you"
& ?        #想知道mail内部有那些命令,可以输入?查看
               mail commands
type              type messages
next                            goto and type next message
from              give head lines of messages
headers                         print out active message headers
delete            delete messages
undelete          undelete messages
save  folder      append messages to folder and mark as saved
copy  folder      append messages to folder without marking them
write  file       append message texts to file, save attachments
preserve          keep incoming messages in mailbox even if saved
Reply             reply to message senders
reply             reply to message senders and all recipients
mail addresses                  mail to specific recipients
file folder                     change to another folder
quit                            quit and apply changes to folder
xit                             quit and discard changes made to folder
!                               shell escape
cd                   chdir to directory or home if none given
list                            list names of all available commands
命令 意义
h 列出信件标头;如果要查阅 40 封信件左右的信件标头,可以输入“ h 40 ”
d 删除后续接的信件号码,删除单封是“ d10 ”,删除 20~40 封则为“ d20-40 ”。 不过,这个动作要生效的话,必须要配合 q 这个指令才行(参考下面说明)
s 将信件储存成文件。例如我要将第 5 封信件的内容存成 ~/mail.file:“s 5 ~/mail.file”
x 或者输入 exit 都可以。这个是“不作任何动作离开 mail 程序”的意思。 不论你刚刚删除了什么信件,或者读过什么,使用 exit 都会直接离开 mail,所以刚刚进行的删除与阅读工作都会无效。 如果您只是查阅一下邮件而已的话,一般来说,建议使用这个离开啦!除非你真的要删除某些信件
q 相对于 exit 是不动作离开, q 则会实际进行你刚刚所执行的任何动作 (尤其是删除!)

7 Centos 7环境下创建大量账号的方法

7.1 pwck、pwconv、pwunconv、chpasswd

  • pwck:

该命令用于检查/etc/passwd这个账号配置文件内的信息,与实际的主文件夹是否存在等信息, 还可以比对 /etc/passwd /etc/shadow 的信息是否一致,另外,如果 /etc/passwd 内的数据字段错误时,会提示使用者修订

[root@localhost ~]# pwck
用户“ftp”:目录 /var/ftp 不存在
用户“gluster”:目录 /run/gluster 不存在
用户“saslauth”:目录 /run/saslauthd 不存在
用户“pulse”:目录 /var/run/pulse 不存在
用户“gnome-initial-setup”:目录 /run/gnome-initial-setup/ 不存在
pwck:无改变
  • pwconv

将 /etc/passwd 内的帐号与密码,移动到 /etc/shadow 当中

  • pwunconv

相对于 pwconv , pwunconv 则是“将 /etc/shadow 内的密码栏数据写回 /etc/passwd 当中, 并且删除 /etc/shadow 文件

  • chpasswd  (重点)

举例来说,我的系统当中有个使用者帐号为 vbird3 ,我想要更新他的密码 (update) , 假如他的密码是 abcdefg 的话,那么我可以这样做:

[[email protected] ~]# echo "vbird3:abcdefg" | chpasswd

7.2 大量创建账号模板(适用passwd --stdin选项)

[[email protected] ~]# vim accountadd.sh
#!/bin/bash
# This shell script will create amount of linux login accounts for you.
# 1\. check the "accountadd.txt" file exist? you must create that file manually.
#    one account name one line in the "accountadd.txt" file.
# 2\. use openssl to create users password.
# 3\. User must change his password in his first login.
# 4\. more options check the following url:
# 0410accountmanager.html#manual_amount
# 2015/07/22    VBird
export PATH=/bin:/sbin:/usr/bin:/usr/sbin

# 0\. userinput
usergroup=""                   # if your account need secondary group, add here.
pwmech="openssl"               # "openssl" or "account" is needed.
homeperm="no"                  # if "yes" then I will modify home dir permission to 711

# 1\. check the accountadd.txt file
action="${1}"                  # "create" is useradd and "delete" is userdel.
if [ ! -f accountadd.txt ]; then
    echo "There is no accountadd.txt file, stop here."
        exit 1
fi

[ "${usergroup}" != "" ] && groupadd -r ${usergroup}
rm -f outputpw.txt
usernames=$(cat accountadd.txt)

for username in ${usernames}
do
    case ${action} in
        "create")
            [ "${usergroup}" != "" ] && usegrp=" -G ${usergroup} " || usegrp=""
            useradd ${usegrp} ${username}               # 新增帐号
            [ "${pwmech}" == "openssl" ] && usepw=$ (openssl rand -base64 6) || usepw=${username}
            echo ${usepw} | passwd --stdin ${username}  # 创建密码
            chage -d 0 ${username}                      # 强制登陆修改密码
            [ "${homeperm}" == "yes" ] && chmod 711 /home/${username}
        echo "username=${username}, password=${usepw}" >> outputpw.txt
            ;;
        "delete")
            echo "deleting ${username}"
            userdel -r ${username}
            ;;
        *)
            echo "Usage: $0 [create|delete]"
            ;;
    esac
done

接下来只要创建 accountadd.txt 这个文件即可

[[email protected] ~]# vim accountadd.txt
std01
std02
std03
std04
std05

[[email protected] ~]# sh accountadd.sh create
Changing password for user std01.
passwd: all authentication tokens updated successfully.
....(后面省略)....

你可能感兴趣的:(Linux学习,linux,学习)