第十四节.Linux账号管理与ACL权限设置

最后更新于 2021-10-10 496 次阅读


Contents hide

1.Linux的帐号与用户组

(1)用户标识符:UID与GID

每当我们登陆一个Linux系统时,我们会至少获得两个ID,分别是UID(用户ID),和GID(用户组ID)。

系统根据UID和GID来认定我们的账户身份。而我们UID和GID的具体信息,分别保存在/etc/passwd/etc/shadow还有/etc/group/etc/gshadow这四个文件中。

例如:我通过id命令来查询laoju这个用户的UID和GID信息

id查询用户详细信息

从图中可见,我们的UID是2333,然后GID是2333,从属与laoju和laojugroup这两个组。

在我们使用终端(tty1~tty6)或者远程ssh登陆系统时,系统会按照如下的步骤来处理我们的账号登陆

①.先查找/etc/passwd里边是否有你这个登陆系统的账号?如果没有则强制退出,如果有的话,则进一步读取你这个账号信息的UID和GID(同时读取/etc/group),另外,也一并将该帐号的shell设置也一起读出。

②.如果这个帐号有设置密码,则系统会去读取/etc/shadow这个文件的内容。通过核对你这个账号UID对应的密码,并且比对密码一致性。

③.上述两个步骤都通过后则进入shell管理阶段

可见,我们如果要想了解更多关于UID和GID的相关内容,我们就需要去研究一下/etc/passwd和/etc/group还有/etc/shadow这三个文件的具体内容。

(2)/etc/passwd文件内容

我们尝试cat一下/etc/passwd文件,可见文件的内容如下:

password的文件内容预览

每一行都代表一个帐号,有几行就代表有几个帐号在你的系统中,但是其中有很多是系统正常运行所需的系统帐号

我们取其中的root和laoju这两个用户来做一下对比分析,来分析各个字段的意义,每个字段之间使用冒号【:】来进行分隔

passwd文件中,root和laoju两个用户的内容对比

①.用户名

第一个字段代表的是用户名,对应着第三个字段UID,便于我们记忆

②.密码

密码的内容已经从/etc/passwd转移到了/etc/shadow,所以这里用x进行代替

③.UID

用户标识符(User ID),与第一字段的用户名对应,不同数字代表的意思不同。

0:代表【系统管理员】账户,如果想让系统上的其他用户也具有系统管理员权限,则将其用户的第三字段改成【0】

1~999:代表【系统帐号】,是保留给系统使用的ID。由于系统上很多后台服务希望使用较小的权限去运行,但又不想使用root的权限,所以我们就根据这些服务划分其专属的帐号来执行这些服务。通常【系统帐号】都是不可登录夕系统的,这和我们后续的/sbin/nologin这个shell有关

根据系统帐号的由来,又可以细分为:

※1~200:由Linux系统划分的系统帐号

※201~999:用户有需求时可以划分的系统帐号

1000~60000:给一般用户使用的可登录帐号

④.GID

用户组标识符(Group ID),与/etc/group文件有关,对应用户组名

⑤.用户描述

又称为“用户全名”,是对第一段用户名的额外补充说明,解释帐号的意思。如果有填写,则在使用【finger】命令时能提供一个详细的说明信息

⑥.家目录地址

该用户的家目录地址,root用户就在【/root】,其他用户则一般在【/home/用户名】,可以自行更改

⑦.shell

第七个字段表示该用户的默认登录shell,普通帐号的一般都是默认【/bin/bash】,但是特殊的不可登录的系统帐号则会将shell设置成【/sbin/nologin】

(3)/etc/shadow文件内容

我们尝试cat一下/etc/shadow的文件内容,可见:

shadow文件内容演示

这次我们也将root和laoju这两个用户单独拿出来进行每个字段的分析,同样,字段之间也是冒号【:】进行分隔

shadow文件中root和laoju两个用户内容的对比

①.用户名

对应/etc/passwd的第一字段,也就是帐号名称。

②.密码

第二字段表示的是加密后的密码,很多软件通过在密码前添加【!】来让密码暂时失效

③.密码修改时间

第三字段表示最近密码修改的时间,以1970年1月1日作为1号开始进行累加,可以使用命令:date -u -d "1970-01-01 UTC $((第三字段内容 * 86400 )) seconds"来进行计算

图里帐号的18854计算密码修改时间为:2021年 08月 15日 星期日

密码修改时间计算演示

④.密码不可被修改的天数

与第三字段相关,表示密码在修改之后的多少天内不可再修改密码,数字【0】则代表没有限制

⑤.密码需要重新修改的天数

与第三字段相关,表示在修改密码之后的多少天内要再次进行修改密码,如果在时限内没有修改密码,则这个帐号的密码为变成【过期特性】。数字【99999】代表无限制

⑥.密码需要修改期限前的警告天数

与第五字段相关,表示在密码需要重新修改天数的几天前来进行警告提醒。例如图片中的数字【7】则代表在密码需要修改的7天前就警告用户,【再过7天你的密码就要过期了,请记得修改】

⑦.密码过期后的宽限时间(密码失效日)

【密码有效期】=密码更新日期(第三字段)+密码需要修改的时期(第五字段),在超过这个日期后,密码只是进入【过期状态】,通过重新登录账户,在系统指引下修改密码就可以继续使用该账号。

但是设置了第七字段的宽限时间后,如果用户在【密码过期】之后的宽限时间内没有登录系统进行修改,则密码会变成【失效状态】,即这个帐号再也没法使用这个密码进行登录

⑧.帐号失效日期

这个日期的设置格式和第三字段一样,也是以1970.1.1为1,累加的数字进行设置。设置里帐号失效日期后,超过这个日期,帐号就无法使用了,通常使用在【收费服务】中

⑨.保留字段

字段保留,用于后续可能会使用到的功能

(4)/etc/group文件内容

/etc/group文件记载了用户名和用户组的对应关系,通过【cat】我们可以看到其文件内容为:

group文件内容演示

同样取出root和laoju两个用户的内容作为对比分析:

先对比一下/etc/passwd文件第四字段的GID

对比passwd第四字段的GID内容差异

然后我们在对比一下group文件中两个用户的差异

group文件root和laoju用户对比

①.组名

第一个字段代表用户组的组名

②.用户组密码

第二字段代表用户组的密码,和passwd文件一样,密码被另外放到了/etc/gshadow这个文件中,所以这里使用x进行替代

③.GID

该用户组的用户组ID,和/etc/passwd文件的第四字段对应

④.该用户组支持的账号名称

第四字段表示可以使用这个用户组的帐号名称。

因为在linux中,一个帐号可以从属与多个用户组,像图中【laoju】这个用户组就支持【pro1】这个账户。如果我想让pro2也加入这个用户组的话,我就可以在第四字段的pro1后边加上pro2这个用户,具体格式为:laoju:x:2333:pro1,pro2(注意用户之间不带空格)

(5)初始用户组与有效用户组

①.初始用户组

初始用户组说的是在创建一个用户的时候,默认添加的用户组,也就是我们在/etc/passwd文件所看的第四字段的GID值对应的组

由于是初始用户组,所以我们在组【laoju】中的第四字段是是看不到用户【laoju】的

②.有效用户组

由于一个用户可以通过命令【useradd -G 组名 用户名】来指定加入的次要用户组,所以当一个用户加入了多个用户组,那这个用户创建的文件,归属于哪个用户组呢?

这我们就要引入有效用户组这个概念了,首先我们先将用户【laoju】加入【pro1 pro2 pro3】这三个用户组,然后通过命令【groups】来查询用户支持的用户组。

groups命令查询当前用户的支持用户组

这时候在最左边的组,就是我们创建文件时的从属组,也就是【有效用户组】

然后我们通过使用命令【newgrp】就可以切换我们用户【laoju】的用户组

例如:newgrp pro1

newgrp命令切换有效用户组

不过要注意的是,newgrp是创建了一个新的shell来修改用户的有效用户组,新的shell给予【laoju】的GID为【pro1】的GID,如果要切换回来,就要使用命令【exit】退出新的shell环境

(6)/etc/gshadow文件内容

gshadow这个文件主要是用于用户组管理员的设置,在root没有精力管理其他用户加入用户组这个事项时,就可以设置组管理员的权限来进行这个工作

同上,使用cat查看一下gshadow的文件内容:

gshadow文件内容

然后也再次取root和laoju两个用户组的内容来对比分析:

gshadow文件内root与laoju两个用户的内容比较

①.用户组名

和/etc/group文件的第一字段一致,也是显示着用户组的名字

②.密码栏

和/etc/shadow文件一样,这里的第二栏也是密码栏,但是这里开头为【!】或空值则代表无合法密码,即也就是无用户组管理员

③.组管理员的用户名

用户组管理员的帐号

④.该用户组支持的帐号名称

这一字段和/etc/group里的第四字段的代表意思是一样的

2.账户管理

(1)useradd:新增用户

通过【useradd】命令,我们可以新增一个新的用户。其会为我们修改如下几个文件:

用户和密码:etc/passwd和etc/shadow

用户组和用户组密码:etc/group和etc/gshadow

用户的家目录:/home/用户名

命令格式:useradd 【-u UID】【-g 初始用户组】【-G 次级用户组】\

>【-c 说明栏】【-d 你想设定的家目录的绝对路径】【-s shell】账户名

常用参数:

-u:-u后边可以指定一个用户自定义的帐号UID

-u自定义用户UID

-g:为这个账户指定一个初始用户组,而不用默认的用户组,该用户组的GID会被放在/etc/passwd的第四栏

-g指定初始用户组

-G:为这个账户指定次级用户组,也就是除了初始用户组以外另外支持的用户组,这个参数会修改/etc/group的内容

-c:为这个账户添加说明栏,这里添加的内容会在/etc/passwd的第五栏中

-d:这个可以更改账户的默认的家目录,不过我们在指定新的家目录时,路径务必使用绝对路径

-r:创建一个系统账户,这个账户的uid会有限制,一般在201~999之间

-s:可以更改账户的shell,默认shell为/bin/bash,如果是系统帐号不想要登录的话,这里可以改为/sbin/nologin

useradd -r -s -d参数演示

-e:后面接日期,格式为【YYYY-MM-DD】,此选项会写入etc/shadow第八栏位,为账户的失效日期,过期后账户停用

-f:后面接shadow第七栏位选项,指定密码过期后是否会失效,0为立刻失效,-1 为永远不失效

user -e -f参数演示

-D:查看useradd创建用户的默认值

user -D查看默认值

(2)passwd:建立及更改密码

useradd创建用户后,用户暂时还是没法登录的,只有为用户创建了密码之后,才能进行登录。

命令格式:

root用户:passwd 【-l】【-u】【--stdin】【-S】【-n 日数】【-x 日数】【-w 日数】【-i 日期】 帐号

普通用户:passwd 【--stdin】

常用参数:

-l:lock,直接锁定该账户的密码(/etc/passwd第二栏位加上【!】),让密码失效

-u:unlock,解除锁定账户的密码

--stdin:可以不用手动输入密码,而靠管道导入密码

例如:echo 'password' | passd --stdin laojuju

-S:列出某个账户密码的相关信息

passwd -S 用户名 命令演示

-n:后面接天数,shadow的第四栏位,修改密码后多少天不可以再修改密码

-x:后面接天数,shadow的第五栏位,多久内必须修改密码

-w:后面接天数,shadow的第六栏位,密码过期的几天前提醒用户

-i:后面接【日期】,shadow的第七栏位,密码的失效时间

(3)usermod:修改user相关参数

usermod命令可以后续修改一些账户的参数,不过除了usermod以外,我们也可以直接进入到/etc/passwd或etc/shadow文件里进行修改

命令格式:usermod 【-u l c d g G a s e f L U 】用户名

常用参数:

-u:更改账户UID

-l:修改用户名

-c:可以修改账户的详细描述,亦即修改passwd第五栏位

-d:修改账户的用户家目录

-g:修改帐号的初始用户组

-G:替换帐号的次要用户组,直接使用的话会将原本的次要用户组替换成新的

usermod -G命令演示

-a:与-G合用变成-aG,变成【增添】新的次要用户组,而非替换

usermod -aG命令演示

-s:替换shell

-e:后面接日期,格式为【YYYY-MM-DD】,此选项会写入etc/shadow第八栏位,为账户的失效日期,过期后账户停用

-f:后面接shadow第七栏位选项,指定密码过期后是否会失效,0为立刻失效,-1 为永远不失效

-L:锁定账户密码

-U:解锁账户密码

(4)userdel:删除用户

使用userdel命令可以删除一个指定的用户,不过如果我们仅仅是账户一段时间不用的话,可以通过修改/etc/shadow文件的第二栏位(增加一个【!】)来使用户暂时失效,而不用直接删除账户

命令格式:userdel 【-r】用户名

常用参数:

-r:连同用户的家目录也一并删除

(5)ID、finger:查询用户信息

命令格式: ID 用户名

finger 【-s】用户名

常用参数:

-s:仅仅列使用者的帐号、全名、终端代号及登录时间

id命令查询用户信息
finger命令查询用户信息

(6)chsh:更改用户shell

命令格式:chsh 【-l】【-s shell】

常用参数:

-l:查看当前系统上可用的shell

chsh -l查看可用shell

-s:后接想要切换的用户shell

3.用户组管理

(1)groupadd:增加用户组

命令格式:groupadd 【-g gid】【-r】用户组

常用参数:

-g:后续接指定的GID

-r:创建系统用户组

(2)groupmod:修改用户组属性

命令格式:groupmod 【-g gid】【-n group_name】用户组

常用参数:

-g:修改用户组的GID

-n:后续接新的用户组名,修改用户组姓名

(3)groupdel:删除用户组

命令格式:groupdel 用户组名

使用groupdel命令可以删除某个指定的用户组,但是删除前要确认该用户组是不是某个帐号的初始用户组,如果是的话,则要先删除那个用户,或者修改那个用户的GID之后,才能进行删除

(4)gpasswd:用户组密码及管理

#root用户:

命令格式:gpasswd groupname

gpasswd 【-A user1,...】【-M user3...】groupname

gpasswd 【-r R】groupname

常用参数

默认参数下,gpasswd为直接修改用户组的密码

-A:指定某一个用户为该用户组管理员

-M:将某个用户加入指定用户组

-r:删除某个用户组的密码

-R:让用户组的密码栏失效(添加【!】)

#管理员用户:

命令格式:gpasswd 【-a d 用户名】用户组名

常用参数:

-a:将某一用户添加至某一用户组中

-d:将某一用户从某一用户组中删除

3.ACL访问控制列表

众所周知,咱们Linux系统里一个文件的权限属性,有针对文件创建者和用户组还有其他人的,这些针对目标都是一个比较宽泛的范围目标,而如果我们想针对某一个用户做具体的权限设置的话,我们就需要用到我们的ACL功能

ACL全称为:访问控制列表,主要可以针对文件文件夹的以下三个方向来控制权限:

(1)用户(user):针对用户的权限做具体设置

(2)用户组(group):针对用户组为对象来设置其权限

(3)默认属性(mask):可以指定用户创建新文件/目录时候的默认权限

(1)setfacl:设置Acl权限

setfacl命令能够设置某个文件/目录的ACL规范

命令格式:setfacl 【-b k R d】【-m|-x acl参数】目录/文件

常用参数:

-m:设置后续的acl参数给目录/文件使用,不可和-x合用

-x:删除后续目录/文件的acl参数,不可和-m合用

acl参数:u/g:用户名/组名:权限(例如:u:laoju:rx,或g:laoju:rw),或者是mask(有效权限的设置)m:权限(例如:m:rwx)

-b:删除【所有的】Acl参数

-k:删除【默认的】Acl参数

-R:递归设置acl,也就是文件夹内的文件也一并设置acl

setfacl -R 递归设置子文件和子目录的acl

d:设置【目录下创建的文件的默认的ACL参数】,只对目录有效,在该目录下创建的文件均会引用这个默认值,不过注意,这个参数要配合acl参数使用

例如给laoju这个用户在test1文件夹增添rx的默认权限,则命令是为:

setfacl -m d:u:laoju:rx /test1

setfacl 默认权限的设置

(2)getfacl:查看Acl权限

getfacl命令可以查看文件或者是目录的详细Acl权限,也就是权限后有带【+】号的

命令格式:getfacl 文件名/目录名

这里有个比较重要的地方,就是mask这个栏位,它表示的是这个文件的【有效权限】,也就是说:用户和用户组的权限必须要存在于mask的权限设置范围内才会生效

如图中,mask的权限为r--,用户【laoju】的权限为r-x,两者的集合为r,则实际上laoju仅具有r的权限而不具有x的权限

我们经常使用mask来规范最大允许的权限,其设置的命令为:

setfacl -m m:rx 目录名字

例如:setfacl -m m:rw /test1

(2)getfacl:查看Acl权限

getfacl命令可以查看文件或者是目录的详细Acl权限,也就是权限后有带【+】号的

命令格式:getfacl 文件名/目录名

getfacl 命令演示

这里有个比较重要的地方,就是mask这个栏位,它表示的是这个文件的【有效权限】,也就是说:用户和用户组的权限必须要存在于mask的权限设置范围内才会生效

如图中,mask的权限为r--,用户【laoju】的权限为r-x,两者的集合为r,则实际上laoju仅具有r的权限而不具有x的权限

我们经常使用mask来规范最大允许的权限,其设置的命令为:

setfacl -m m:rx 目录名字

例如:setfacl -m m:rw /test1

有效权限mask的设置

4.用户身份切换

(1)su:切换用户身份

使用【su 用户名】或【su - 用户名】命令可以切换linux用户的身份

只不过不带【-】参数的话,是以非登陆shell(nologin)的方式来切换用户,切换后的用户很多变量并不会修改成新用户的变量,所有我们推荐使用【su - 用户名】的方式来进行账号之间的切换

在用户切换后,可以使用命令【exit】来退回之前一个用户

命令格式:su 【- -l m】【-c 命令】 用户名

-:单纯使用【-】如【su - 用户名】表示以loginshell的方式登陆用户,如果不带用户名则默认切换root用户

-l:和直接使用【-】效果一样

-m:和-p一样,表示【使用目前的环境设置,而不读取新使用者的配置文件】

-c:仅进行一次命令,其实和【sudo】用法一致,意义不大,但是注意命令要用【” “】双引号括起来

例如:su - laoju -c “head -n 20 /etc/man_db.con"

(2)sudo:切换用户执行命令

咱们虽然使用su命令就可以直接进行用户切换再执行命令,但是毕竟多账号和root用户的切换,需要知道root账号的密码,帐号多了,就容易出现root用户密码泄露的情况

所以我们可以使用【sudo】命令来实现只要输入自己的账户的密码来达成使用root用户执行命令的目的

但是也并非所有用户都能使用【sudo】命令,仅有规范到/etc/sudoers内的用户才能够执行【sudo】命令(这个文件需要使用visudo命令来修改)

命令格式:sudo 【-b】【-u 新使用者账号】 命令

例如:sudo -u laoju mkdir /etc/test1

常用参数:

-b:输入-b参数后可以把命令放在后台运行,不与目前shell的产生影响

-u:后面可以接欲切换的使用者用户,若无此项则代表切换身份为root

(3)visudo:授权可以使用sudo命令的用户

我们可以使用visudo命令来更改/etc/sudoers的文件内容来授权用户sudo命令的使用,那么我们具体应该修改啥内容呢?

我们可以分为六种情形来分析我们要修改的内容

①.单一用户可使用root所有的命令

通过visudo打开/etc/sudoers文件,然后查看98~102行这样

【Allow root to run any commands anywhere】

第100行这一行四个组件分别的意义是:

Ⅰ.【用户账户】:支持sudo命令的账号

Ⅱ.【登陆者的来源主机名】:这个可以指定能够登陆这台主机的用户(也就是可以信任的主机)默认值ALL可以来自任何一台网络主机

Ⅲ.【这个用户可以切换哪个账户使用命令】:这个帐号可以切换成什么身份来执行后续的命令,默认ALL可以切换成任何命令

Ⅳ.【用户sudo可以执行的命令】:可用该身份sudo执行的命令,必须使用绝对路径,默认root可以执行任何命令

如果我们想让【laoju】这个用户能够使用sudo执行命令,最简单的方式就是使用【visudo】命令打开/etc/sudoers,然后在找到【## Allow root to run any commands anywhere】这一行,复制【root..】这一行,然后粘贴新的一行,将用户名改成【laoju】就行了

②.设置用户组多用户支持

如果我想让一个用户组下边的人都支持sudo命令,我该怎么做?

同样也是使用【visudo】命令,跑到100~115行之间,找到【## Allows people in group wheel to run all commands】这一行

sudoers用户组支持设置

这一行就表示,任何加入【wheel】这个用户组的用户,都能使用sudo这个命令,所以我们如果要让每个用户组的组员支持sudo命令,也只要复制111这一行,在粘贴新的一行修改组名就行了,不过要注意组名前边要加【%】符号

③.设置免密使用sudo

sudo命令默认情况,需要输入当前用户的密码,但是如果我们不想输入密码,直接执行sudo的话,可以这样做

使用【visudo】命令,跑到110~120行之间,找到【## Same thing without a password】这一行

sudoers免密操作更改内容

同样也是复制粘贴在修改用户名,如果是用户组的话就在组名前加【%】

④.有限制的命令操作

如果我想限制一个用户或者用户组在使用sudo的时候的可执行命令,我们就可以用visudo来修改,可执行命令这个第四栏位的内容

例如:我想给予【laoju】这个用户修改其他用户密码的权力,但是唯独不能修改root用户的密码,我们就可以把执行命令限制为:!/usr/bin/passwd, /usr/bin/passwd [a-zA-Z]*, !/usr/bin/passwd root

※注意:一定要确认限制命令的顺序,系统是从左到右来进行关键词检测的,【!/usr/bin/passwd root】不能写在【/usr/bin/passwd [a-zA-Z]*】

执行结果则为:

sudo命令更改密码执行结果

⑤.通过命令别名设置visudo

假设我有十五个帐号,且全部都要设置上述的命令权限,如果我要一个个去设置,那势必是十分的麻烦,有什么办法呢?

这时候我们可能会想到之前学习shell脚本的时候,有个function功能可以将一些重复的命令做个合并整合为一个命令函数,然后接下来需要使用之前的命令时就直接输入函数名就行了,可以节省许多重复命令的输入。

我们visudo中也有这种类似的功能,名为【别名】功能。

visudo中的【别名】功能具体有:账户别名(User_Alias)、主机别名(Host_Alias)、命令别名(Cmnd_Alias)

命令格式:User_Alias 账户别名(例如:LAOJU )= 该别名包含的账户(laoju, pro1, pro2)

Host_Alias 主机别名(例如:HOST) = 该别名包含的主机

Cmnd_Alias 命令别名 = 该别名包含的命令(!/usr/bin/passwd, !/usr/bin/passwd )

例如:我有四个帐号想统一设置成密码修改管理员,但是都不能修改root的密码,怎么设置好?

visudo打开文档,输入:

User_Alias MASTER = laoju, pro1, pro2, pro3

Cmnd_Alias MASTERCOM = !/usr/bin/passwd, !/usr/bin/passwd

然后在【Allow root to run any commands anywhere】这一栏的下方输入:

MASTER ALL=(ALL) MASTERCOM

执行结果为:

⑥.命令别名配合su实现安全root切换

对于一个共用一个设备的多用户Linux系统,我们可以使用命令别名的功能实现只要输入用户本身的密码达成普通用户到root用户的切换

具体操作为:

用visudo在/etc/sudoers里添加如下内容

5.特殊Shell,nologin

从上边的学习中,我们知道除了普通的用户账号,root账号以外,还有个系统账号,系统账号我们之前说是使用着【不可登陆】的nologin作为shell,但其实这里说的【不可登录】只是说着不用bash或其他shell来登陆系统而已,系统账号还是可以使用系统的资源的

我们可以通过vim /etc/nologin.txt的内容来告诉尝试使用系统账号登陆系统的人为什么不能登陆系统

6.Linux主机上的信息传递

(1)查询用户

①.w和who

查看登陆当前系统上的用户名、终端、IP地址等详细消息

②.last

查看登陆过当前主机的所以历史用户、终端及IP还有时间

③.lastlog

查看当前主机上所有用户的最近登陆时间及终端信息

(2)用户间传递信息

①.write

命令格式:write 【用户名】【用户名登陆的终端】

向某个特定在线用户传递信息,可以配合w或who命令查询在线用户

②.wall

命令格式:wall "广播内容"

进行全体广播

③.mail

向系统上的某个用户发送邮件

命令格式:mail -s “邮件标题” 收件人

邮件正文

. ←最后输入小数点,就可以结束输入

查看邮件

命令格式:mail

这里,我们可以输入【type + 邮件的序号】来查看某个邮件的内容

type查看邮件内容

也可以输入【?】来查看mail的相关命令

mail相关命令

也可以输入【q】退出邮件面板