本篇主要介绍Linux系统关于用户身份的控制原理与Linux下对不同用户权限的控制。
标识用户身份与登录控制
在Linux系统中,登录时,输入的是 用户名和密码,但是Linux系统并不会直接认识 系统名称,而是认识一个 ID,这个ID 与账号的对应关系,就存储在 /etc/passwd
中,每次在登录一个 账号的时候,就是识别两个ID,一个是 USer ID
(简称UID)、一个是 Group ID
(简称 GID)
Linux系统就通过 UID 和 GID 识别不同的用户,进而实现不同 的文件权限控制
用户在输入 用户名和密码之后,进入系统的这个过程中,操作系统实现了如下的校验:
- 先找寻
/etc/passwd
里面是否有你输入的账号?如果没有则跳出,如果有的话则将该账号对应的 UID 与
GID (在/etc/group
中) 读出来,另外,该账号的家目录与 shell 设定也一并读出 - 再来则是核对密码表啦!这时 Linux 会进入 /etc/shadow 里面找出对应的账号与 UID,然后核对一下你刚
刚输入的密码与里头的密码是否相符 - 如果上面的都顺利通过,那么就进入了 shell 命令界面了
所以 攻击者会将特殊账号 写入到
/etc/passwd
文件中;
如果备份 Linux系统的账号,也要记得备份这两个文件
/etc/passwd
文件主要负责管理 使用者 的UID/GID , 每一行都代表一个账号,有几行就代表有几个账号在 该系统 中,这其中有很多账号是系统正常运行所需要的,就是系统账号,比如bin、daemon、adm、nobody
等,轻易不要修改或删掉它们。
下面介绍这个文件中的各个字段的含义:
- 账号名称:
对应UID的可视化 名称,即用户名 - 密码:
早期 Unix系统的密码就放在这个字段上,但是这样就太容易被窃取了,所以为了安全起见,就将 密码放到/etc/shadow
中了,这里就使用x
表示这是 未知字段 - UID:
使用者标识符,Linux对UID有一定的限制:
- GID:
与/etc/group
有关,/etc/group
的观念与/etc/passwd
差不多,只是用来规范 组名与GID 的对应而已 - 用户信息说明栏
没有什么用途,主要用来 解释账号的意义 - 家目录
用户的家目录,cd
默认就是 回到 该用户的 家目录 - Shell
用户登录系统后,会取得一个 shell 与系统进行交互
/etc/passwd
文件主要负责管理 密码相关的数据;Linux下很多程序的运行都与 权限有关,权限又与 UID/GID 有关,所以很多程序就需要 读取 /etc/passwd
来了解不同账号的权限,所以 /etc/passwd
的权限需要设定为 -rw-r--r--
, 并且为了 安全,还在 该文件中加入了很多 密码限制参数
各个字段的含义如下:
- 账号名称
该账号名称的显示 顺序与/etc/passwd
中必须一致 - 密码
每个用户登录系统存储的密码,这里显示的是经过加密后的密码,而且这段密文的长度是固定的,如果改变 这个字段的长度,该密码就会失效,所以有的软件会在这个字段前加上!或*
, 从而改变密文长度,进而实现密码失效 - 最近改动密码的日期
这里显示的是自1970-1-1
而累加的日期 - 密码不可改动的天数(显示与第三字段相同)
该账号的密码在最近一个被更改后需要经过几天才可以被再次更改,这是为了防止 有人一再改动密码而设置的 - 密码需要更新变更的天数(显示与第三字段相同)
可以强制要求用户更改密码,该字段指定了在 最近一个更改密码后,在 多少天内需要再次修改密码,如果没有在指定天数内修改密码,该账号的密码就会变为 过期特性 - 密码需要变更期限前的警告天数(显示与第三字段相同)
在 密码更改期限到期前,系统会根据这个字段的设置,对该账户 发出警告 - 密码过期后的账号宽限时间(密码失效日)(显示与第三字段相同)
超过 密码需要更新的期限后,该密码就过期了,当再次登录系统时,系统就会强制要求 重新设定密码才能登入系统并继续使用
如果继续超出了此字段规定的时间,那么该账号就无法再使用 旧密码登录了,因为原密码 过期了! - 账号失效日期(显示与第三字段相同)
此账号在规定的日期之后,将无法再使用,无论密码是否过期,该账号都无法再使用 - 保留
保留字段,留作他用
一般用户如果忘记密码了,可以通过 root
管理员直接重置密码,但如果是 root
管理员的密码忘记了,那就比较费劲了,由于无法进入系统,也就无法操作或修改密码了,可以通过 重启进入单人维护模式,再通过passwd
命令修改密码
群组管理文件/etc/group
和 /etc/gshadow
文件负责 用户组名和权限管理
/etc/group
目录 记录了GID 与组名对应的内容,每一行就代表一个 群组,其中各个字段的含义如下:
- 组名:
与第三个字段 GID 对应 - 群组密码
通常不需要设置,而且通常是由 群组管理员使用的,并且 所有密码都由/etc/shadow
文件设定,所以这里就只需要x
表示密码字段就可以了 - GID
群组ID - 此群组支持的账号名称
一个账号可以加入多个群组,如果某个账号想要加入这个群组,该账号就需要填入这个字段,表示 该账号在此群组中
上面三个文件的关系如下:
群组与权限分配
在 /etc/passwd
文件中,有 GID 域,这里指定的 群组,就是 初始群组(initial group),用户一登录系统,就立刻拥有这个群组的相关权限,不需要再 /etc/group
中写入该 群组就在该群组中了
但是 非初始群组 就不同了,非初始群组就是 在 /etc/group
文件中的第四个字段中 写入的数据,这样 该账号就加入了这个群组,该账号就拥有了 写入的群组的文件访问权限,但是 如果该账号 建立了一个新文件,该文件的 群组属性该是哪个呢?
当然是 初始群组啦
每个账号可以通过 输入 如下的命令,获得 所在的群组:
# 获取当前账号所支持的群组,要注意s
[root@AliComputer ~]# groups
root docker
[root@AliComputer ~]#
如下:
如果要切换 有效群组,可以通过 newgrp
命令实现,该命令 只能切换 该账号 支持的群组,这样影响的就是 在建立新文件时,该文件的 群组访问属性不同了
还可以通过/etc/gshadow
文件来 建立群组管理员,该文件的内容字段如下,四个字段的含义与 /etc/group
文件中的含义也比较类似
- 组名
- 密码栏
如果开头为!
表示没有合法密码,即 无群组管理员 - 群组管理员账号
- 有加入该群组支持的所属账号
如果 root
管理员太忙碌,就可以通过 群组管理员来实现 将其他用户放入到本群组中
账号管理
增加账号与相关文件配置
添加一个新账号,只要设置好 账号ID 和 密码,其他设置,就会由系统根据预设直接实现了
user add [-u UID] [-g 初始群组] [-G 次要群组] [-mM] [-c 说明栏] [-d 家目录的绝对路径] [-s shell] 使用者账号
-u 指定特定的 UID给该账号
-g 初始群组,该群组的GID 就会被放到 /etc/passwd 文件的第四个字段中
-G 该账号还要加入的群组
-M 强制,不建立用户家目录
-m 强制,建立用户家目录,权限位 700
-c /etc/passwd 文件的说明内容
-r 建立一个系统账号,该账号的UID有限制,一般都是1000以下
-s 指定shell,如果没有指定,就是用默认的 /bin/bash
-e 接日期,此项目写入 shadow的第八个字段,就是 该账号失效的日期
-f 写入 shadow 的第七个字段,指定密码是否会失效,0为立刻失效,-1为永不失效(后期密码过期只是强制在登录是更新密码,而不是失效)
系统已经预先设定好了很多 默认值,所以只要使用useradd 账号名称
直接建立 使用者即可,系统会默认处理以下项目:
在建立好账号后,需要设定 密码,否则该站好就是 暂时封锁的状态,无法登入,使用 如下命令设定密码:
passwd [--stdin] [账号名称]
passwd [-l][-u][--stdin][-S] [-n 天数] [-x 天数] [-w 天数] [-i 日期] 账号
--stdin 透过前面的 管道符,作为密码输入
-l 即LOCK,将 修改/etc/shadow,使 密码失效
-u 与-l 相对,unlock 的意思
-s 列出密码相关的参数,是 shadow文件的大部分信息
-n 天数,shadow文件的第四个字段,不可修改密码天数
-x shadow文件的第五个字段,多久内必须更改密码
-w shadow文件的第六个字段,密码过期前的警告天数
-i shadow文件的第七个字段,密码失效日期
passwd
使用一定要注意!!root管理员在给其他账号建立密码是 passwd 账号
方式,给自己修改密码是 passwd
方式,千万不要该错密码
非管理员在使用 passwd
修改密码时, 一般需要先输入 旧密码,才能输入新密码,系统对于密码的检查是 非常严格的,太短、密码与账号相同、密码为常见字符串等都不会被系统接收!(但root管理员在修改其他用户密码时就不用担心这个问题),一般密码需要满足一下要求才可以通过:
使用 change
命令可以实现更加详细的密码参数显示功能:
如果要微调 新账号的权限,可以通过usermod
命令实现:
还可以通过 userdel
命令删除用户的相关数据,主要有以下数据:
- 用户账号、密码参数:
/etc/passwd
、/etc/shadow
- 使用者群组相关参数
/etc/group
、/etc/gshadow
- 用户个人文件数据
/home/username
、/var/spool/mail/username
该命令的主要参数如下:
userdel [-r] username
-r 连同用户的家目录也一起删除
要移除一个账号的时候,你可以手动的将 /etc/passwd
与/etc/shadow
里头的该账号取消即可!一般而言,如果该账号只是『暂时不启用』的话,那么将/etc/shadow
里头账号失效日期 (第八字段) 设定为 0 就可以让该账号无法使用,但是所有跟该账号相关的数据都会留下来! 使用 userdel
的时机通常是『真的确定不要让该用户在主机上面使用任何数据了!』
所以,如果想要完整的将某个账号完整的移除,最好可以在下达 userdel -r username
之前, 先以『 find / -user username
』查出整个系统内属于 username
的文件,然后再加以删除
用户功能
一般用户常用的 账号数据变更与查询指令:
-
id
:# 查询某人或自己的 相关的 UID/GID 信息 id [username]
-
finger
:
查询用户相关的信息finger [-s] username -s 列出用户的 账号名、全名、终端机代码和登入时间等 -m 列出后面接的 账号相同者,而不是利用部分比对
由于 此命令需要查询
/etc/passwd
文件的信息,出于安全考虑,该命令已不再自动支持了 -
chfn
: 类似 change finger 的意思,更改 用户信息,除非用户非常多,否则很少使用了
-
chsh
: 就是 change shell 的缩写chsh [-ls] -l 列出目前系统上可用的shell,即 /etc/shells 中的内容 -s 设定修改自己的shell
上面是对用户的操作,下面考虑对群组的操作:
-
groupadd
: 添加一个群组groupadd [-g gid] [-r] 组名 -g 后面接某个特定的GID,用来直接给与某个 GID -r 建立系统群组,与 /etc/lgon.defs 内的GID_MIN 有关
-
groupmod
: 修改群组名称groupmod [-g gid] [-n group_name] 群组 -g 修改既有的GID数字 -n 修改既有的组名
不要随意修改GID,容易造成系统资源的错乱
-
groupdel
删除群组
-
gpasswd
: 群组管理员功能
让某个群组具有一个管理员,该管理员可以管理 哪些账号可以加入/移除群组# 系统root管理员的操作命令 gpasswd groupname 没有任何参数表示给予 groupname一个密码 -A 将 groupname的主控权交由后面的 使用者管理,即设置 群组管理员 -M 将某些账号加入该群组中 -r 将 groupname 的密码移除 -R 将 groupname 的密码栏失效 # 群组管理员的动作 gpasswd [-ad] user groupname -a 将某个使用者加入到 groupname 群组中 -d 将某个使用者移除 groupname 中
主机权限规划与ACL使用
ACL 是 Access Control List的缩写,ACL 提供了对单一使用者、单一文件或目录的权限规范,对于特殊权限的使用非常有帮助。
ACL目前几乎已经预设在 Linux的启动挂载中了:
setfacl
设定某个目录/文件 的ACL规范
基本使用语法:
setfacl [-bKRd] [{-m|x} acl参数] 目标文件名
-m 设定后续的acl参数给文件使用,不可以与 -x合用
-x 删除后续的acl参数,不可以与-m合用
-b 移除所有的 ACL 设定参数
-k 移除预设的 ACL 参数
-R 递归设定acl,所有的 子目录都设定相关ACL权限
-d 设定 预设acl参数,只对目录有效,在该目录新建的数据引用这个默认值
使用如下:
如果一个文件设置了ACL参数,那么它的权限部分就会多出一个+
getfacl
取得某个文件/目录 的ACL 设定项目
基本使用语法:
getfacl filename
getfacl的选项参数几乎与setfacl一致!
使用如下:
显示的结果中,有的字段前面是有#
的,代表这个文件的默认属性,包括文件名、文件拥有者和文件的所属群组,底下出现的 user
, group
, mask
, other
则是属于不同使用者、群组与有效权限(mask)的设定值
使用ACL 设定 使用者和群组的权限并没有太大的差异,在 查看群组的ACL信息时,还有一个mask
选项,就类似 有效权限的意思:使用者或群组所设定的权限值必须要存在与mask的权限设定范围内才会生效
其他选项的使用多尝试就可以了,很好理解
最后
一起提高,慢慢变强。