用户和权限管理
记载Linux的用户/用户组和如何管理的信息,以及文件的权限管理
1 Linux安全模型
资源分派
- Authentication:认证,验证用户身份
- Authorization:授权,不同用户设置不同权限
- Accouting | Audition:审计(有时也叫计费,一般在服务业场景中)
当用户登录后,系统会根据用户和用户组的权限分配令牌token。用于权限控制、身份认证、进程继承等操作
3A认证:认证(Authentication)、授权(Authorization)、审计(Accounting)的简称
4A认证即在开头多一个身份标识(通过账户、密码等识别用户身份)
是一套用于针对网络设备的网络访问控制策略安全模型
1 | # rocky的审计登录日志路径 |
1.1 用户
Linux系统通过用户的UID号码来管理用户。系统服务程序和数据都是与UID号挂钩
Linux系统是多用户系统,可以同时存在多个用户,每个用户都是相互隔离的
用户的唯一表示是User ID。如果两个用户的UID号相同,则对系统来说这两个是同一个人,他们的历史记录、权限等都会混杂在一起,使后续的审查难度增大
在Linux中,root独占id0,其他用户都是普通用户,id为1-60000
用户类型 | 用户名 | 用户ID(UID) | 作用 |
---|---|---|---|
超级管理员 | root(可改) | 0 | 超级管理员 |
系统用户 | 自定义 | 1-499(CentOS6及以前), 1-999(CentOS7及以后) |
给后台程序使用,例如nginx、mysql等 |
登录用户 | 自定义 | 500+(CentOS6及以前), 1000+(CentOS及以后) |
提供给用户进行交互式登录 |
1.2 用户组
Linux中可以将一些需要设置相同权限的用户加入到一个用户组中,用户组是通过Group ID(GID)来唯一标识
组类型 | 组名 | 组ID(GID) | 作用 |
---|---|---|---|
超级管理员组 | root | 0 | 给超管使用 |
系统组 | 自定义 | 1-499(CentOS6及以前), 1-999(CentOS7及以后) |
给后台程序使用,像nginx、mysql等。 用于权限隔离,防止数据库出现漏洞 |
普通组 | 自定义 | 500+(CentOS6及以前), 1000+(CentOS及以后) |
给登录用户使用 |
1.3 用户和用户组的关系
- 一个用户至少有一个组,但也可以有多个组
- 一个组可以没有任何用户,也可以有多个用户
- 用户的主要组(primary group):又称为私有组,用户必须属于且只有一个主组,创建用户时。默认会创建与其同名的组作为主组
- 用户的附加组(supplementary group):又称附加组,一个用户可以不加附加组,也可以加入多个附加组
- 使用组:即对组进行授权,然后批量将用户加入到组内,该组下的所有用户将都能继承这个组的权限
1.4 安全上下文
Linux的安全上下文Context:
在Linux系统中,运行中的程序(进程),都是以进程发起者的身份运行
进程所能访问的资源权限取决于进程的运行者的身份
什么是程序
一个程序或一个命令,本质上是一个可执行的二进制文件或脚本文件
在服务器上的很多文件,只有那些特定的,可以被执行的二进制文件,才能被称为程序
什么是进程
运行中的程序,就是进程,同时会有一个独特的进程号
程序、进程、用户之间的关系是怎样的
只有可以被执行的文件,才能叫做程序
对于同一个程序,也不是所有用户都可以运行的,这需要取决于当前用户对该程序有没有可执行权限
例如:对于一架飞机,有机票的人才能上去
进程的访问资源
一个进程能不能访问某些资源,是由进程发起者决定(与进程本身的程序文件无关)
2 用户和组的配置文件
2.1 用户和组的主要配置文件路径
- /etc/passwd:用户及其属性信息(名称、UID、主组ID(GID)等)
- /etc/shadow:用户密码及其相关属性
- /etc/group:组及其属性信息
- /etc/gshadow:组密码及其相关属性
2.2 passwd文件格式
1 | /etc/passwd |
2.3 shadow文件格式
1 | /etc/shadow |
伪账户的密码是”!!”或”*”,代表没有密码是不能登陆的,新建用户还没设密码时为!!,禁用账号时,会直接在密码字段前加!
Ubuntu
默认不允许管理员root直接登录系统,原因是Ubuntu
默认对管理员进行锁定
密码的安全策略
- 足够长
- 使用数字、大写字母、小写字母以及特殊字符中至少三种
- 使用随机密码
- 定期更换,不要使用最近曾经使用过的密码
查看系统密码的加密算法
1 | # 查看目前系统使用的加密算法 |
系统中的生成随机密码
1 | tr -dc '[:alnum:]' < /dev/urandom | head -c <需要的位数> |
2.4 group文件格式
1 | /etc/group |
2.5 gshadow文件格式
1 | /etc/gshadow |
2.6 安全操作配置文件
更改这些文件时可以使用专用的工具来进行修改。同时也保证了修改后格式出错等问题不会影响到系统。
vipw / **vigr 命令:**编辑/etc/passwd
、/etc/shadow
、/etc/group
这些文件时,该方法会设置适当的锁,防止文件损坏
1 | vipw -p 编辑/etc/passwd文件 |
**pwck命令:**用来验证系统认证文件/etc/passwd和/etc/shadow的内容和语法
1 | pwck -q 仅报告错误信息 |
**getent命令:**直接查看配置文件
1 | getent passwd 查看/etc/passwd文件 |
3 用户和组管理命令
用户管理命令
- useradd
- usermod
- userdel
组账号维护命令
- groupadd
- groupmod
- groupdel
3.1 创建用户 useradd
useradd
命令可以创建新的用户账号,同时创建用户的主组。默认主组和账号同名
1 | useradd [选项] <用户名> |
useradd
命令默认值设定由/etc/default/useradd
文件来定义
1 | #对于Ubuntu系统而言,默认创建用户使用/bin/sh解释器,且不会自动创建家目录 |
使用命令修改useradd
中的文件属性
1 | #更改默认shell |
与新建用户相关的文件:
- /etc/default/useradd
- /etc/skel/*
- /etc/login.defs
扩展 登录提示符显示 sh-4.2$
有两种可能:
1、使用的Linux系统版本较老,并且使用了/bin/sh终端,导致登录提示符显示出错
解决办法:将用户的shell更改为/bin/bash,再重新登录
2、家目录下的用户配置文件损坏导致
解决办法,删除家目录下的所有配置文件,前往/etc/skel/目录将.*文件拷贝一份到家目录,再重新登录
批量创建用户 newusers
1 | #使用newusers创建用户,需要我们先手动编写用户的七大项内容,例: |
批量修改用户密码 chpasswd
1 | #此命令使用方法和上面相同,但它修改密码后会以密文形式存储,能让账号能正常使用了 |
使用openssl手动生成sha512加密密码
rocky8生成sha512加密密码
1 | #openssl passwd -6 <密码> |
CentOS 7 使用Python程序生成sha512加密密码
1 | python -c 'import crypt,getpass;pw="你的密码";print(crypt.crypt(pw))' |
Ubuntu2204 创建sha512加密密码
1 | openssl passwd -6 <你的密码> |
使用/dev/urandom来生成随机密码
1 | #使用Linux的随机设备生成 |
3.2 修改用户属性 usermod
命令usermod
用于修改系统用户属性
1 | usermod [选项] <用户名> |
3.3 删除用户 userdel
命令userdel
的作用是删除Linux用户
1 | userdel [选项] <用户名> |
注:当用户被删除后,其所属的文件都无法正常显示所属用户和所属私有组。但会显示UID和GID。当再创建一个新用户且UID相同时,将会继承原用户文件
删除用户时会把与其同ID的主组也给删了,前提是该组下没有其它用户
3.4 查看用户相关的ID信息
命令id
可以查看用户的UID,GID等信息
1 | id [选项] <用户名> |
3.5 切换用户或使用用户执行命令
在当前登录用户权限不足或没有某些资源权限时:
我们可以做两件事
1、让有权限的用户登录终端,再进行相应的操作
2、在当前终端临时切换,以有权限的用户身份去执行
命令su
是用于切换用户,或以指定用户身份执行命令
1 | su [选项] [-] <用户名> |
- su <用户名>:非登录式切换,既不会读取目标用户的配置文件,也不改变当前工作目录。不完全切换
- su - <用户名>:登录式切换,会读取目标用户的配置文件,切换到目标用户的家目录。完全切换
说明:root用户su切换其他用户不需要密码;非root用户切换时必须要密码(包括没有了密码的账户)
注:su切换新用户相当于是套了一层皮,如果一直切来切去相当于包裹了很多层,环境有可能会因此产生冲突。使用exit可以退回上一个旧用户身份
另提醒:使用-c想以另一个用户执行命令而不切换用户时。如果传递的命令存在空格,请使用双引号“”进行包裹。如果命令中存在$xxx等变量,请使用单引号‘’
3.6 设置用户密码 passwd/chpasswd
命令passwd
的作用是修改系统用户的密码
1 | passwd [选项] <用户名> |
注:普通用户可以修改自己密码,但需要先验证当前使用的密码
1 | #非交互式修改用户密码 |
3.7 修改用户密码策略 chage
命令chage
作用是修改用户的密码策略
1 | chage [选项] <用户名> |
3.8 其他命令 chfn|chsh|finger
命令chfn
的作用是设置用户说明信息,passwd
文件的第五字段
1 | chfn <用户名> |
命令chsh
的作用是指定用户的shell解释器,功能等同于usermod -s
1 | chsh -l #查看系统shell解释器(ubuntu没有此参数) |
命令finger
的作用是查看用户最近一次登录信息
1 | #这个命令需要先下载包 |
3.9 创建用户组 groupadd
命令groupadd
的作用是创建用户组
1 | groupadd [选项] <组名> |
3.10 修改用户组 groupmod
命令groupmod
的作用是修改用户组
1 | groupmod [选项] <用户组> |
3.11 查看用户的用户组 groups
命令groups
的作用是查看用户的所有用户组情况
1 | group <用户名> |
3.12 删除用户组 groupdel
命令groupdel
的作用是删除用户组
1 | groupdel [选项] <组名> |
注:强制删除后显示该组名的地方,只能显示组ID,如果新建一个组与此ID相同,则被删除的组的数据会被新组关联
3.13 更改用户组密码 gpasswd
命令gpasswd
的作用是更改组密码和修改附加组的成员关系
当组没密码只能由root来添加删除成员
1 | gpasswd [选项] <组名> |
3.14 临时切换用户主组 newgrp
命令newgrp
的作用是临时切换主组,如果用户本不属于此组,则需要组密码
如果已经是组的成员则用户切换不需要组密码
1 | newgrp [-] <组名> #如果使用 - 选项,可以初始化用户环境 |
3.15 管理用户组 groupmems
命令groupmems
的作用是管理附加组的成员关系,和gpasswd
命令相同
1 | groupmems [选项] <-g 组名> |
注:普通用户不能使用-g
参数,只能给自己的主组进行管理
4 文件权限管理
4.1 Linux中的权限体系
在Linux系统中,一切皆文件;
对文件来讲,系统中的用户,分属于三类不同的角色,分别是属主,属组,其它用户
而文件对于用户的权限,也分三种,分别是读、写、执行
三种角色:
角色 | 英文名 | 字符表示 |
---|---|---|
属主:所有者 | owner|user | u |
属组:所属组 | group | g |
其它用户:不是所有者也不在所属组中的人 | other | o |
三种权限:
权限 | 英文名 | 字符表示 | 八进制表示 |
---|---|---|---|
读权限 | read | r | 4 |
写权限 | write | w | 2 |
执行权限 | execute | x | 1 |
程序访问文件时的权限,取决于此程序的发起者权限
- 进程的发起者是文件的属主:则应用文件属主权限
- 进程的发起者属于文件的属组:则应用文件属组权限
- 应用文件的”其它”权限
4.2 文件所有者和属组的属性更改
4.2.1 设置文件的所有者 chown
命令chown
的作用是修改文件的属主,也可以修改文件的属组
1 | chown [选项] [owner]:[group] <文件名> |
4.2.2 设置文件的属组信息 chgrp
命令chgrp
的作用是设置文件的属组
1 | chgrp [选项] [group] <文件名> |
两个指令的选项相同,功能有部分重叠,注意区分
4.3 文件权限
4.3.1 文件权限说明
角色定义
角色 | 在命令中的字符 | 备注 |
---|---|---|
owner | u | 属主 |
group | g | 属组 |
other | o | 其它用户 |
all | a | 所有人,包括属主,属组和其它用户 |
赋值写法
在命令中的字符 | 备注 |
---|---|
+ | 增加某些权限 |
- | 删除某些权限 |
= | 只保留某些权限,覆盖写法 |
权限表示方法
权限 | 在命令中的字符 | 八进制数字表示 | 备注 |
---|---|---|---|
Readable | r | 4 | 读权限 |
Writeable | w | 2 | 写权限 |
eXecutable | x | 1 | 执行权限 |
常用写法
1 | u+r #属主加读权限 |
注:
- 用户的最终权限,是从左向右进行顺序匹配。所有者,所属组,其他人。一旦匹配到,权限立刻生效,不会再往右查看其它权限
- r和w权限对root用户无效,对没有读写权限的文件,root照样能读写
- 只要所有者,所属组或其他用户三者之一有执行权限,root就可以执行
权限对于文件和目录的区别
权限 | 对文件 | 对目录 |
---|---|---|
r | 查看文件内容 | 读取目录中的文件名。但无法查看文件元数据 |
w | 修改文件内容 | 可在目录中创建和删除文件 |
x | 可执行,发起为一个进程 | 可进入目录,可查看文件元数据,允许去查看文件内容。属于目录最小权限 |
4.3.2 修改文件权限 chmod
命令chmod
可以根据不同用户对象设置不同权限
1 | chmod [参数] <文件名> |
拓展:执行cp指令需要的最小权限是什么
1 | 执行 cp /etc/issue /data/dir/ 所需要的最小权限??? |
4.4 新建文件和目录的默认权限
在Linux系统,新建文件或目录会给一个默认的权限
Linux是通过控制umask值来间接的影响新建文件和新建目录的权限
- 新建文件:666-umask,按位对应相减,如果所得结果为奇数则该位+1变为偶数(奇数代表有执行权限,但文件不能随便给执行权限)
- 新建目录:777-umask,按位对应相减,所得结果是多少则权限就是多少,无额外要求
1 | umask [选项] <参数> |
如何修改umask值
1 | :umask 123 |
注,umask
默认值也是有不同的:
普通用户的umask
默认是002
root的umask
默认是022
持久化设置umask
值:
1 | 全局设置:在/etc/bashrc或/etc/bash.bashrc(ubuntu)中添加 |
4.5 Linux文件系统上的特殊权限
在Linux系统上,除了rwx这三种常见权限外,还有三个特殊权限。分别是SUID、SGID、Sticky。这三个特殊权限独立于rwx权限体系中
特殊权限
- SUID:作用于二进制可执行文件上,用户将继承此程序所有者的权限
- SGID:作用域二进制可执行文件上,用户将继承此程序所有组的权限;只能作用于目录上,此目录中新建的文件所属组将从目录上继承
- Sticky:作用于目录上,此目录中的文件将会只能由所属者或root来删除(谁创建谁管理)
注:特殊权限占用文件权限的x权限位显示
权限 | 字符表示 | 八进制表示 | 备注 |
---|---|---|---|
SUID | s | 4 | 如果所属主没有可执行权限,加上SUID权限后会显示为S(反之为s) |
SGID | s | 2 | 如果原属组没有可执行权限,加上SGID权限后会显示为S(反之为s) |
Sticky | t | 1 | 如果其他用户没有可执行权限,加上Sticky权限后会显示为T(反之为t) |
4.5.1 特殊权限SUID
前提:进程由属主和属组;文件由属主和属组
- 任何一个可执行程序文件能不能启动为进程,取决于发起者对程序文件是否拥有执行权限
- 启动为进程之后,其进程的属主为发起者,进程的属组为发起者所属的组
- 进程访问文件时的权限,取决于进程的发起者
简而言之:使用者有多大权,启动的程序(进程)就有多大权
二进制的可执行文件上SUID权限功能(前提是你有权限启动):
- 启动为进程后,进程的属主将变更为原程序文件的属主
- SUID支队二进制可执行程序有效
- SUID设置在目录上没有意义
权限SUID设置方法:
1 | chmod u+s 文件名 |
4.5.2 特殊权限SGID
二进制的可执行文件上SGID权限意义:
- 启动为进程后,进程的属组为原程序文件的属组
权限SGID设置方法:
1 | chmod g+s 文件名 |
目录上的SGID权限意义:
- 对此目录有写权限的用户在此目录创建的文件所属的组为此目录的属组。通常用于创建一个协作目录
4.5.3 特殊权限Sticky
具有写权限的目录通常用户可以删除该目录中的任何文件,无论该文件的权限或拥有权(无Sticky)
在目录上设置Sticky后,目录下的文件将只有文件的所有者或root才可以删除
sticky设置在文件上无意义
权限Sticky设定:
1 | chmod o+t 目录名 |
4.5.4 设定文件特殊属性
文件特殊属性的意义在于提供一套超越传统”rwx”权限的、更底层、更强大的访问控制机制。
1 | chattr [选项] [追加的属性] <文件名> |
显示文件特殊属性
1 | lsattr <文件名> |
4.6 访问控制列表 ACL
4.6.1 ACL权限功能
rwx权限体系中,只能将用户分成三种角色。如果要对单独用户设置额外的权限,则无法做到
ACL就是为了弥补这一块的缺陷而出现的。ACL可以单独对指定的用户设定各不相同的权限;提供颗粒度更细的权限控制
ACL权限生效顺序(也与文件系统一样,匹配了立刻生效,不再向后查询):
1 | 所有者 --> 自定义用户 --> 所属组 --> 自定义组 --> 其他人 |
4.6.2 ACL相关操作
命令 setfacl
作用是设置ACL权限
命令 getfacl
作用是查看设置的ACL权限
1 | setfacl [选项] <文件名> |
使用举例:
1 | setfacl -m u:test:rw test.txt |
4.6.3 mask权限作用
mask权限作用
- 设置过ACL权限后,就会产生一个mask权限来代替文件系统的group所属组权限,因此默认权限是rw
- mask只影响除所有者和其它用户之外的人和组的最大权限
- 用户或组的设置ACL权限必须小于或等于mask权限,否则mask会与权限进行逻辑与运算(AND),运算后的结果才是真正的权限
4.6.4 ACL备份以及还原
主要的文件操作命令cp
以及mv
都支持ACL,但cp
需要加上-p参数。tar等常见的压缩工具不会保留目录和文件的ACL信息
1 | getfacl -R /tmp/dir > acl.txt |