文章目录
标识用户身份与登录控制
在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的权限设定范围内才会生效
其他选项的使用多尝试就可以了,很好理解
使用者身份的切换
操作服务器的几个建议:
- 使用一般账号(非root账号)进行系统操作,可以避免很严重的错误指令
- 使用较低权限启动系统服务
比对对于不同的系统服务,apache
、mysql
等服务,分别单独建立一个用户专门用来启动该服务,防止破坏整个系统 - 软件本身的限制
有些软件默认就是不允许root
身份登录的,比如elasticsearch
,只能使用一般用户登录
关于su
命令的使用,还有有要注意的地方的:
su [-lm] [-c 指令] [username]
- 单纯使用- ,代表 login -shell 方式登录系统,如果后面没有 使用者,则默认是 root身份
-l 与-类似,但后面需要加上要切换的使用者的账号,也是 login-shell的方式
-m 与-p命令一样,表示目前的环境设定,而不读取使用者的配置文件
-c 仅进行一次的命令,所以-c后面可以加指令
这个su
命令有没有那个-
,差距还是比较大的,如下:
单纯使用『 su
』切换成为 root 的身份, 读取的变量设定方式为 non-login shell
的方式,这种方式
很多原本的变量不会被改变,所以很多root的惯用指令,只能通过 绝对路径执行,因为 环境变量 并不是 root!
所以在切换身份到root时,务必使用su -
命令
如果未来防止root用户的密码泄露,有想要使用root的执行权限,就可以通过sudo
命令来实现 使用root身份来执行命令,而且只有/etc/sudoers
内的用户才可以使用 sudo
命令
基本使用如下:
sudo [-b] [-u 新使用者账号]
-b 将后续的指令放到背景中让系统自行执行,不与目前的shell产生影响
-u 后面可以接要切换的使用者,若无此选项,则表示切换到root
执行 sudo
的流程如下:
所以 sudo
命令的重点就是,必须要看/etc/sudoers
的设定值,可以使用sudo
的是通过输入用户自己的密码来执行后续的指令串的,但是sudoers
文件不建议直接修改,最好是通过visudo
命令进行修改
配置sudo
除了 root
之外的其他账号,若想要使用 sudo
执行属于 root
的权限指令,则 root
需要先使用 visudo
去修改 /etc/sudoers
,让该账号能够使用全部或部分的 root
指令功能, 这是由于 etc/sudoers
是有设定的语法的,如果设定错误的话,会造成无法使用功能sudo
指令的不良后果,所以需要 visudo
去修改,这样在结束修改的时候,系统会自动检查语法
一般在某用户使用 sudo
命令时,是需要输入 该用户的密码的,但是如果两次执行 sudo
的时间间隔在 五分钟之内,那么再次执行 sudo
就不用再次输入密码了
单一用户
设置单一用户可以进行root所有指令:
在主机可以修改的位置如下:
这其中四个组件的含义如下:
- 使用者账号:即系统的那个账号可以使用
sudo
这个指令 - 登入者的来源主机名:指定客户端计算机,相当于信任源
- 可切换的身份:该账号可以切换为什么身份来下达后续的指令,默认的root表示可以切换为任何人
- 可下达的指令:可以使用该指令下达什么命令
上面的 ALL
是个特殊的关键词,表示 任何身份、主机或指令的意思
群组处理
对于群组的处理:
上面的设定值就表示 任何加入wheel这个群组的使用者,都可以使用sudo
切换身份来操作任何指令,就相当于是 群管理员了。
有限制的命令操作
实现用户仅能进校部分系统任务,比方说,系统上面的 myuser1
仅能够帮 root
修改其他用户的密码时,亦即『当使用者仅能使用 passwd
这个指令帮忙 root
修改其他用户的密码』时 的情况
如果现在有 若干个用户,需要设置为同样的权限,可以不用写这样的若干行代码,而是通过 别名实现:
如果需要大量执行很多root的工作,可以使用sudo
搭配su
使用:
特殊shell与PAM模块
考虑建立仅使用系统资源,但是不登录系统的权限,就是可以使用部分系统资源,但是无法使用bash或者shell来登录系统,在Linux主机中,各个系统账号,打印作业由 lp
这个账号在管理, WWW
服务由 apache
这个账号在管理, 他们都可以进行系统程序的工作,但是『就是无法登入主机取得互动的 shell』而已
PAM:可以说是一套应用程序编程接口 (Application Programming Interface, API),他提供了一连串的验证机制,只要使用者将验证阶段的需求告知 PAM 后, PAM 就能够回报使用者验证的结果 (成功或失败)。
执行流程如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-osrXzymQ-1667999827129)(02鸟哥的Linux私房菜10-14.assets/image-20220609210210360.png)]
关于PAM的其他内容,这里不再整理 详见 《鸟哥的Linux私房菜》13.5.3、13.5.4、13.5.5
Linux用户信息传递
关于Linux某个账号的信息,查询使用者的命令,上面的 id
、config
命令都可以实现,last
命令可以查询该用户登录的时间
查询目前已经登录再系统上的用户: w
或who
每个账号最近登录时间:lastlog
, 该命令会去读取 /var/log/lastlog
文件
与当前系统上其他用户对话
通过write
命令将 信息传递给 接受者
write 使用者账号 [用户所在终端接口]
使用如下:
但是 mesg
这个命令对 root 传递的信息没有任何阻挡力
还可以使用mail
命令操作:
收信者,只要使用 mail
命令就可以打开收件箱,查看 邮件信息了,在输入提示符那里,可以输入操作指令:
建立大量账号
先看pwck
命令:pwck 这个指令在检查 /etc/passwd
这个账号配置文件内的信息,与实际的家目录是否存在等信息,还可以比对 /etc/passwd /etc/shadow
的信息是否一致,另外,如果 /etc/passwd
内的数据字段错误时,会提示使用者修订
本部分没有整理,详见 《鸟哥的Linux私房菜》13.5.7
最后
一起提高,慢慢变强。