Linux账号管理与ACL权限设置
Linux的账号与用户组
用户标识符:UID、GID
登录Linux主机的时候,输入的是用户的账号,但LInux主机并不直接认识用户的账号名称,是根据ID辨识用户,ID与账号的对应关系在/etc/passwd文件中
每个登录主机的用户都拥有两个ID,用户ID(UserID,简称UID),用户组ID(Group ID,简称GID)
用户账号
Linux系统上面的用户需要用户登录主机以取得shell的工作环境
输入账号密码的系统过程:
- 系统先寻找/etc/passwd文件里面是否有用户输入的账号,有的话则将用户对应的UID和GID读取,并且将用户账号的主文件夹和shell设置一起读出
- 核对密码表,Linux系统会进入/etc/shadow文件里面找出对应的账号与UID,核对一下密码是否符合
- 以上账号ID与密码核对之后,进入shell控制管理阶段
/etc/passwd文件结构
/etc/passwd是管理用户UID和GID的文件,每一行代表一个账号,行数就代表Linux系统的账号数,其中有很多系统账号,是系统正常运行时所必须要的:bin、daemon、adm、nobody等
![Linux账号管理passwd文件](https://cdn.jsdelivr.net/gh/babybeekeeper/pic_Hosting@master/20211221/Linux账号管理passwd文件.6xozpnpi7pc0.png)
每一行代表一个账号,每一行用":"分隔开,共有七个字段,分别是:
1、账号名称
用户登录时的账号
2、密码
该文件中的所有行的该字段都为x,因为这个文件的特性是所以程序都能读取的,很容易造成密码数据被窃取,为了安全起见,后来讲该字段的密码数据放到/etc/shadow文件中
3、UID
UID与账号名称对应,是用户标识符,但是Linux系统通常对UID有限制
UID范围 | 该UID的用户特性 |
---|---|
0(系统管理员) | 当UID为0时,则代表这个账号为"系统管理员",若要让其他用户账号具有root权限,将该字段该为0即可,但是系统不建议多个账号的UID为0 |
1~499(系统账号) | 保留给系统使用的UID,默认500以下的数字给系统作为保留账号系统上面启动的服务希望使用较小的权限去运行,不希望root的权限去执行这个服务,则需要提供这些服务的所有者账号,这些系统账号通常是不可登陆的系统账号可以分为两种:199:由distributions自行创建的系统账号100499:若用户有系统账号的需求时,可以使用的UID |
500~65535(可登陆账号) | 给用户登录的UID,Linux内核(2.6x版)已经可以支持到2^32-1 |
4、GID
用来规定组名与GID之间的关系,具体关系在/etc/group文件中
5、用户信息说明列
用来解释账号的意义,使用finger功能时,可以显示账号更多信息
6、主文件夹
用户的主文件夹,当用户登录主机时,会立刻进入用户的主文件夹,即root登录之后,就会进入主文件夹/root目录里面,若对该字段进行修改则可以将该账号的主文件夹目录移动到其他硬盘,默认的主文件夹在/home/yourDname中
7、shell
当用户登录主机之后就会取得一个shell来与系统的内核通信以进行用户的操作任务
系统默认shell使用bash,就是因为该文件中的该字段指定了bash
有一个shell用来替代让账号无法取得shell环境的登录操作,即/sbin/nologin,可以用来制作纯pop邮件账号者的数据
/etc/shadow文件结构
因为passwd文件是所有程序都能读取的特性,故将用户密码移动该/etc/shadow文件中,该文件加入了很多密码限制参数用来保障安全性
![Linux账号管理shadow文件](https://cdn.jsdelivr.net/gh/babybeekeeper/pic_Hosting@master/20211220/Linux账号管理shadow文件.3su2l2lxbx20.png)
同样每一行代表每一个用户的信息,每一行用":"作为分隔符,共有9个字段,分别是:
1、账号名称
由于密码与账号对应,当系统从passwd到shadow文件核对密码时需要以账号进行匹配
2、密码
该字段值为是账号密码通过编码加密之后生成的特殊符号的字母
各种密码编码的技术不一样,因此不同的编码系统会造成这个字段的长度不同
由于固定的编码系统所产生的密码长度必须一致,改变该字段长度之后,该密码就会失效
3、最近改动密码的日期
计算Linux日期的时间以1970年1月1日作为1而累加的日期
4、密码不可该改动的天数
该字段值是以第三个字段值为参照,表示为该账号的密码在最近一次更改密码之后多少天才能被更改密码,0则表示可以随时更改密码
5、密码需要重新更改的天数
该字段值也是以第三个字段值为参照,可指定在最近一次更改密码之后多少天需要再次更改密码,是为了强制用户更改密码
6、密码需要更改期限前的警告天数
该字段值以第五个字段值为参照,表示在需要重新更改密码前几天,系统会进行发出提示,密码多久之后过期,需要重新设置密码
7、密码过期之后的账号宽限时间
该字段值仍然是与第五个字段值比较,表示账号密码过期之后多少天,用户没有登录进行修改密码,则之后用户无法使用该密码进行登录
密码过期特性:密码过期之后,系统会强制要求用户重新进行密码设置才能登录继续使用
8、账号失效日期
该字段值是以Linux日期的时间
9、保留字段
该字段是保留字段
有效和初始用户组:groups、newgrp
/etc/group文件结构
该文件就是记录用户的GID与组名的对应关系,该文件的每一行代表了一个用户组,以":"作为分隔符,共四个字段,分别为:
1、用户组名称
即用户组的名称
2、用户组密码
通常不需要设置,该字段是为”用户组管理员“角色的用户设置的,普通用户不需要设置
同样为了保证安全性,该字段值移动到etc/shadow文件中
3、GID
表示用户组的ID,与/etc/passwd第四个字段的GID对应的用户组名就是从这里对应出来
4、用户组支持的账号名称
表示该用户组中的多个用户账号,若将某个用户账号加入到此用户组,将用户账号名字加入到该字段即可
该文件的每一行代表了一个用户组,以":"作为分隔符,共四个字段,分别为:
1、用户组名
2、密码列
开头为!,表示无合法密码,则无组管理员
3、用户组管理员的账号
4、该用户组的所属账号
passwd、group、shadow文件之间对应关系
![Linux账号管理3文件的关系](https://cdn.jsdelivr.net/gh/babybeekeeper/pic_Hosting@master/20211220/Linux账号管理3文件的关系.4az6lvy0che0.png)
有效用户组与初始用户组
初始用户组(initial group)
在/etc/passwd文件中每一个行对应的第四列的字段值GID,就是用户的初始用户组
有效用户组(effective group)
若要将用户加入其他用户组,则需要在/etc/group文件中找到那个待加入组的一行,然后在第四个字段值加入该用户名
一个用户加入了多个用户组,用户创建文件时权限所属组为该用户的有效用户组
区分effective group 和 initial group
- 输入groups,可以显示该用户所加入的所有用户组
- 显示的用户组的第一个用户组为该用户的有效用户组
切换有效用户组
newgrp 指定有效用户组:可以指定切换用户的有效用户组
账号管理
新增用户useradd
指定参数创建用户
useradd [-u UID] [-g 初始用户组] [-G 次要用户组] [-mM] [-c 说明栏] [-d 主文件夹绝对路径] [-s shell] 用户账号名
参数:
-u:指定用户的UID
-g:初始用户组的GID
-G:除初始用户组之外加入的用户组
-M:强制不要创建用户主文件夹
-m:强制要创建主文件夹
-c:用户的说明信息,对应着/etc/passwd第五列的字段值
-d:指定某个目录成为主文件夹
-r:创建一个系统的账号
-s:指定用户的shell
-e:指定用户账号的失效日期
-f:shadow文件的第七列字段值
默认新建一个用户
useradd 用户账号名
useradd创建用户是使用的默认值可以使用useradd -D查看
系统会规定很多默认值来创建用户
1、在/etc/passwd文件中新增一个与用户相关的数据
2、在/etc/group文件中创建一个与账号同名的组名
3、在/etc/shadow文件中新增一行账号密码相关的数据,但创建的账号并没有密码,可以使用passwd+用户名来设置密码
4、在home目录下创建一个与账号名同名的文件夹作为新建用户的主文件夹
修改账号用户信息usermod
usermod [-cdegGlsuLU] username
参数:
-c:用户账号的说明
-d:用户账号的主文件夹
-e:指定天数,为shadow文件中第八列字段值的数据
-f:对应shadow第七列字段值
-g:指定用户的初始化组
-G:指定用户的次要用户组
-l:修改用户名称
-s:指定shell的实际文件 bash或csh
-u:用户的UID
-L:暂时冻结用户的密码
-U:将shadow文件密码列的!去掉
删除用户数据userdel
userdel [-r] username
-r:删除用户的主文件夹
用户功能
检查用户账号属性信息
finger [-sm] username
参数:
-s:列出用户的账号、全名、终端机代号与登录时间
-m:列出账号相同者
修改用户的finger数据
chfn [-foph] username
设置用户账号的shell
chsh [-ls]
参数:
-l:列出目前系统上可用的shell
-s:设置修改自己的shell
查询自己或某个用户的UID/GID
id username
新增或删除用户组
新增用户组
groupadd [-g gid] [-r] 用户组名
参数:
-g:用来直接指定某个GID
-r:新建系统用户组
修改用户组参数
groupmod [-g gid] [-n group_name] 用户组名
参数:
-g:修改已有的GID
-n:修改已有的用户组名
删除用户组
groupdel groupname
主机的具体权限规划:ACL使用
ACL是Access Control List的缩写,主要是用来提供传统owner、group、others的rwx权限之外的权限设置
ACL可以针对单一用户、单一文件或目录来进行r、w、x的权限设置
ACL主要针对以下几个方面来进行权限控制
- 用户(User):可以针对用户来进行权限设置
- 用户组(Group):针对用户组来设置权限
- 默认属性(mask):在目录新建文件或目录时设置新数据的默认权限
启动ACL
ACL是传统UNIX-LIKE操作系统权限额外支持项目,使用ACL前提是要获得文件系统的支持
目前绝大部分的文件系统都有支持ACL的功能,包括ReiserFS,EXT2/EXT3,JFS,XFS
ACL设置技巧:getfacl,setfacl
setfacl:设置某个文件、目录的ACL设置项目
setfacl [-bkRd] [-m|-x acl参数] 目标文件名
参数:
-m:设置后续的acl参数给文件使用,不能与-x合用
-x:删除后续的acl参数,不可与-m合用
-b:删除所有acl设置参数
-k:删除默认的acl参数
-R:递归设置acl
-d:设置默认acl参数
针对特定用户的设置方式
u:[用户账号列表]:[rwx] 针对用户账号的权限规定rwx
用户列表不指定,代表设置该文件所有者
getfacl:取得某个文件、目录的ACL设置项目
getfacl filename
获取文件ACL说明
# file:acl_test.txt 说明文件名
# owner:test 此文件的所有者
# group:wheel 文件的所属用户组
user::rw- 文件所有者的权限
user:test:r-x 针对用户test的权限设置为r-x,与所有者不同
group::r-- 文件用户组的权限
mask::r-x 此文件默认的有效权限
other::r-- 其他人拥有的权限
用户身份切换
Linux用户切换的原因:
- 平时使用一般用户账号,需要设置系统环境变量时才变换成root用户来进行系统管理,避免用户权限过高导致严重的操作失误
- 用较低权限启动系统服务,系统安全起见,使用某些系统账号来进行程序的执行,如果程序被攻破,可以保障系统不会受到损坏
- 软件本身的限制
在旧版本的telnet程序中,默认是不允许root身份登录,telnet程序会判断登录者的UID,若为0,则直接拒绝登录
su
su命令可以进行任何身份的切换,需要知道新切换的用户密码
su [-lm] [-c 命令] [username]
参数:
-:单纯使用'-',则su - 表示使用login-shell的变量文件读取方式来登录系统
不加用户名则表示切换为root身份
-l:后面需要加上切换的用户账号,也是login-shell的方式
-m:-m与-p是一样,使用目前的环境设置,而不读取新用户的配置文件
-c:仅进行一次命令,可以切换用户进行一次命令的执行,
只使用su也可以切换root,但是以nonlogin-shell方式登录
nonlogin-shell:很多原本的变量不会被改变
sudo
执行sudo仅需要执行自己的密码就可以进行用户的切换
sudo命令不是所有用户都能执行,只有/etc/sudoers文件内的用户才能执行sudo命令
sudo [-b] [-u 新用户账号]
参数:
-b:将后续的命令让系统自行执行,而不与目前的shell产生影响
-u:接欲切换的用户账号,若不指定切换用户账号则代表切换用户为root
sudo命令执行的流程
- 执行sudo时,系统会从/etc/sudoers文件中查找该用户是否有执行sudo的权限
- 检查用户具有执行权限之后,让用户输入用户密码来确认用户身份
- 密码输入成功,开始执行
用户的特殊shell和PAM模块
PAM是一套应用程序编程接口,提供了一连串的验证机制,只要用户将验证阶段的需求告知PAM后,PAM将能够回报用户验证结果(成功或失败)
PAM由于是一套验证的机制,不管使用什么程,都可以使用PAM来进行验证;账号密码或其他方式的验证具有一致的结果
![Linux账号管理PAM与程序验证](https://cdn.jsdelivr.net/gh/babybeekeeper/pic_Hosting@master/20211220/Linux账号管理PAM与程序验证.hen2tufrcso.png)
PAM用来进行验证的数据称为模块(Modules),每个PAM模块的功能不大相同
PAM模块设置语法
PAM通过一个与程序相同文件名的配置文件来进行一连串的认证分析需求
以passwd命令调用PAM,整个调用PAM的流程是:
- 用户开始执行/usr/bin/passwd这支程序,并输入密码
- passwd调用PAM模块进行验证
- PAM模块会到/etc/pam.d/passwd中寻找与程序(passwd)同名的配置文件
- 依据/etc/pam.d/passwd文件中的设置,引用相关的PAM模块进行验证分析
- 将验证结果(成功或者失败)回传给passwd这个程序
- passwd程序会根据PAM回传的结果来决定下一步的操作
验证流程
第一行声明的是PAM版本之外,其他地方的“#”开头都是批注
/etc/pam.d/passwd文件中的每一行都是一个单独的验证流程,每一行可以发为三个字段,分别是:
1、验证类型
验证类型主要分为四种:auth、account、session、password
auth:是authentication认证的缩写,主要用来检查用户的身份验证,这种类型通常需要密码来检验,所以后续接的模块是用来检验用户身份
account:大部分使用授权authorization,这种类型主要在检验用户是否具有正确的权限
session:session所管理的是用户在这次登录期间PAM所给予的环境设置,通常用于记录用户登录和注销时的信息
password:这种类型主要用来提供验证的修订工作,用来修改密码
四个验证类型通常是由顺序的,先验证身份auth,然后给用户授权accoun,在登录与注销之间才需要环境设置,运行期间可能会涉及密码的修改
2、验证的控制标志
该字段在管控验证的放行方式,即验证通过的标准,也分为四种控制方式:required、requisite、sufficient、optional
requireed
此验证若成功带有success标志,若失败则带有failure标志,但是不论验证是否成功都会继续后续的验证流程,正因为这个特性,相当有利于数据的登录日志,PAM最常用required
requisite
若验证失败则立刻返回原程序failure标志,并终止后续的验证流程,若成功则带有success标志才继续后续的验证流程
sufficient
正好与requisite相反,若成功返回success标志,并终止后续的验证流程,若失败则返回failure标志,继续后续的验证流程
optional
大多用于显示信息而已,并不是用于验证
![Linux账号管理PAM控制流程](https://cdn.jsdelivr.net/gh/babybeekeeper/pic_Hosting@master/20211220/Linux账号管理PAM控制流程.45hdapctvaq0.png)
3、模块
系统有多个模块,并且每个模块功能不一样
/etc/pam.d/*
/etc/pam.d/*:每个程序个别的PAM配置文件
/lib/security/*
/lib/security/*:PAM模块文件的实际放置目录
/etc/security/*
/etc/security/*:其他PAM环境的配置文件
/usr/share/doc/pam-*/
/usr/share/doc/pam-*/:详细的PAM说明文件
常用的模块
pam_security.so
限制系统管理员只能从安全的终端机进行登录,在/etc/securetty文件中,列出来都是允许root账号登录设备
pam_nologin.so
限制一般用户是否能够登录主机,当/etc/nologin文件存在时,所有一般账户都无法再登录系统,这个模块对root以及已经登录系统的用户没有影响
pam_selinux.so
SELinux是针对程序来进行详细管理权限的功能,SELinux会影响到用户执行程序的权限,利用PAM模块,将SELinux暂时关闭,等验证通过后再予以启动
pam_console.so
当系统出现故障问题时,需要使用特殊的终端接口才能登录主机时,可以让用户通过特殊终端接口顺利登录系统
pam_loginuid.so
用来验证用户的UID是否为需要的数值
pam_env.so
用来设置环境变量的一个模块,
pam_UNIX.so
可以用于验证阶段的认证功能,也可以用于授权阶段的账号许可证管理,也可以用于会议阶段的日志文件记录、还有密码更新阶段的检验
pam_cracklib.so
用来检验密码的强度,包括密码是否在字典中,密码输入几次之后就会断开连接
pam_limits.so
主要用于用户对可用的资源的限制
login的PAM验证机制流程
1、验证阶段
首先经过pam_securetty.so判断,若用户是root,则参考/etc/securett文件中的设置,然后经过pam_env.so来设置额外的环境变量,再通过pam_UNIX.so开验证密码,然后再判断用户的UID是否满足要求,不满足则以pam_deny.so断开连接
2、授权阶段
先以pam_nologin.so来判断/etc/nologin文件是否存在,接下来pam_UNIX.so进行账号管理,再判断UID是否满足要求,满足则pam_permit.so允许登录
3、密码阶段
以pam_cracklib.so设置密码仅能尝试错误3次,接下来以pam_UNIX.so通过md5,shadow等功能进行密码检查,若不通过则以pam_deny.so拒绝登录
4、会议阶段
以pam_SELinux.so暂时关闭SELinux,因为会影响用户执行的权限,然后以pam_permit.so设置用户能够操作的系统资源,登录成功后将相关信息记录在登录文件中,以pam_loginuid.so设置不同的UID,然后打开pam_selinux.so的功能
为什么root 无法以 telnet 直接登录系统,但是却能够使用 ssh 直接登录?
一般来说,telnet 会引用 login 的 PAM模块,而 login 的验证阶段会有/etc/securetty 的限制。由于远程连接属于 pts/n(n为数字)的动态终端机接口设备名称,并没有写入到/etc/securetty,因此root 无法以 telnet 登录远程主机。至于ssh使用的是/etc/pam.d/sshd 这个模块,你可以查阅一下该模块,由于该模块的验证阶段并没有加入 pam_securetty,因此就没有/etc/securetty 的限制!故可以从远程直接联机到服务器端
Linux主机上的用户信息传递
查询用户:w、who、last、lastlog
w、who
w,who:查询目前登录在系统上的账户
![Linux账号管理w](https://cdn.jsdelivr.net/gh/babybeekeeper/pic_Hosting@master/20211220/Linux账号管理w.1kzihq3f2pvk.png)
last、lastlog
last:显示新建之后所有登录者的信息
lastlog:每个账号登录的时间
![Linux账号管理last](https://cdn.jsdelivr.net/gh/babybeekeeper/pic_Hosting@master/20211220/Linux账号管理last.1o4g9ncohgo0.png)
用户对谈:write、mesg、wall
write
write:仅针对系统登录在线的人传递信息
write 用户账号 [用户所在端口]
write:可以将消息直接传给接受者
![Linux账号管理write](https://cdn.jsdelivr.net/gh/babybeekeeper/pic_Hosting@master/20211220/Linux账号管理write.2qegehsem5m0.png)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xBNNukcR-1640100498218)(https://cdn.jsdelivr.net/gh/babybeekeeper/pic_Hosting@master/20211220/Linux账号管理write2.5ui03oip7io0.png)]
wall
wall:广播,发送给除自己之外系统所有登录的用户
![Linux账号管理wall1](https://cdn.jsdelivr.net/gh/babybeekeeper/pic_Hosting@master/20211220/Linux账号管理wall1.5671v02ihbg0.png)
![Linux账号管理wall2](https://cdn.jsdelivr.net/gh/babybeekeeper/pic_Hosting@master/20211220/Linux账号管理wall2.3hngafxobiq0.png)
mail:可以发送邮件给没有登录系统的用户
mail username -s "邮件标题"
邮件内容写完之后加上'.'作为结束输入的标志
待收邮件用户登录之后使用mail查看邮件
N表示未查看
![Linux账号管理mail2](https://cdn.jsdelivr.net/gh/babybeekeeper/pic_Hosting@master/20211220/Linux账号管理mail2.7iscgym5ljk0.png)
总结
Linux 操作系统上面,关于账号与用户组,其实记录的是UID/GID的数字而已。用户账号/用户组与UID/GID的对应,参考/etc/passwd 及/etc/group 两个文件
/etc/passwd 文件结构以冒号隔开,共分为七个字段,分别是账号名称、密码、UID、GID、全名、主文件夹、shell
UID只有0与非0两种,非0则为一般账号。一般账号又分为系统账号(1~499)及可登录者账号(大于500)
账号的密码已经移动到/etc/shadow 文件中,该文件权限为仅有 root 可以改动。该文件分为九个字段,内容为账号名称、加密密码、密码更动日期、密码最小可变动日期、密码最大需变动日期、密码过期前警告天数、密码失效天数、账号失效曰、保留未使用
用户可以支持多个用户组,其中在新建文件时会影响新文件用户组者,为有效用户组。而写入/etc/passwd 的第四个字段者,称为初始用户组
与用户新建、更改参数、删除有关的命令为useradd,usermod,userdel 等,密码新建则为 passwd。与用户组新建、修改、删除有关的命令为 groupadd, groupmod, groupdel 等
用户组的查看与有效用户组的切换分别为 groups及 newgrp 命令
useradd 命令作用参考的文件有/etc/default/useradd,/etc/login.defs,/etc/skel/等。查看用户详细的密码参数,可以使用"chage-I 账号"来处理。用户自行修改参数的命令有chsh,chfn 等,查看命令则有 d,finger 等。ACL可进行单一个人或组的权限管理,但 ACL 的启动需要有文件系统的支持。ACL的设置可使用 setfacl,查阅则使用 getfacl
身份切换可使用 su,也可使用 sudo,但使用 sudo 者,必须先以 visudo 设置可使用的命令。PAM 模块可进行某些程序的验证程序,与 PAM 模块有关的配置文件位于/etc/pam.d/*及/etc/security/*中
系统上面账号登录情况的查询,可使用 w,who,last,lastlog 等。在线与用户交谈可使用 write、wall,脱机状态下可使用 mail 传送邮件用
用户可以支持多个用户组,其中在新建文件时会影响新文件用户组者,为有效用户组。而写入/etc/passwd 的第四个字段者,称为初始用户组
与用户新建、更改参数、删除有关的命令为useradd,usermod,userdel 等,密码新建则为 passwd。与用户组新建、修改、删除有关的命令为 groupadd, groupmod, groupdel 等
用户组的查看与有效用户组的切换分别为 groups及 newgrp 命令
useradd 命令作用参考的文件有/etc/default/useradd,/etc/login.defs,/etc/skel/等。查看用户详细的密码参数,可以使用"chage-I 账号"来处理。用户自行修改参数的命令有chsh,chfn 等,查看命令则有 d,finger 等。ACL可进行单一个人或组的权限管理,但 ACL 的启动需要有文件系统的支持。ACL的设置可使用 setfacl,查阅则使用 getfacl
身份切换可使用 su,也可使用 sudo,但使用 sudo 者,必须先以 visudo 设置可使用的命令。PAM 模块可进行某些程序的验证程序,与 PAM 模块有关的配置文件位于/etc/pam.d/*及/etc/security/*中
系统上面账号登录情况的查询,可使用 w,who,last,lastlog 等。在线与用户交谈可使用 write、wall,脱机状态下可使用 mail 传送邮件
赶紧学习起来吧!我是一个正在努力找回自我的人,希望能和一起学习的人成长,有错误的地方请各位大佬帮忙指正,如果觉得有帮助就点个赞当作对我的一个小肯定❤,peace&love