​ 记载Linux的用户/用户组和如何管理的信息,以及文件的权限管理

1 Linux安全模型

资源分派

  • Authentication:认证,验证用户身份
  • Authorization:授权,不同用户设置不同权限
  • Accouting | Audition:审计(有时也叫计费,一般在服务业场景中)

当用户登录后,系统会根据用户和用户组的权限分配令牌token。用于权限控制、身份认证、进程继承等操作

3A认证认证(Authentication)、授权(Authorization)、审计(Accounting)的简称

4A认证即在开头多一个身份标识(通过账户、密码等识别用户身份)

是一套用于针对网络设备的网络访问控制策略安全模型

1
2
3
4
5
6
7
8
# rocky的审计登录日志路径
/var/log/secure

# centos的审计登录日志路径
/var/log/secure

# ubuntu的审计登录日志路径
/var/log/auth.log

1.1 用户

Linux系统通过用户的UID号码来管理用户。系统服务程序和数据都是与UID号挂钩

Linux系统是多用户系统,可以同时存在多个用户,每个用户都是相互隔离的

用户的唯一表示是User ID。如果两个用户的UID号相同,则对系统来说这两个是同一个人,他们的历史记录、权限等都会混杂在一起,使后续的审查难度增大

image-20241121151637808

在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)来唯一标识

image-20241121152017286

组类型 组名 组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
2
3
4
5
6
7
8
9
10
11
/etc/passwd
passwd里存储着用户属性配置信息,格式如下:
用户名:密码(通常用x代替):UID:GID:备注:家目录:登录Shell

用户名:用户的名字
密码:通常存储在shadow中,此处会使用x去占位
UID:用户创建时的User ID
GID:用户创建时的主组的Group ID
备注:账号的说明:例如作用,账号负责人等等
家目录:当前用户的家目录路径(只是有,不一定存在。比如ubuntu默认不会创建家目录)
登录Shell:指定用户登录时Shell的类型。当此项为/sbin/nologin或/bin/false时该账号无法登录

2.3 shadow文件格式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/etc/shadow
shadow中存储的是用户密码信息,任何用户(除root)都无权限。格式如下:
用户名:密码加密后的密文:上次修改密码的时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:保留字段,无意义
demo:$6$JUcUV/5rlEZ/m$dkviKMlC3r2U0CGqhmtfSjks7MhF7y3HiquuQivMIgoWWHCkAgDiAwNQSkmgQjp8rk9bxAgJ5fss7kXSpG1MP.:20319:0:99999:7:::

# 详细描述
login name   #登录用户名
encrypted password  #加密后的密文,一般用sha512加密,可为空,!表示该用户被锁定,不能登录系统
date of last password change  #上次修改密码的时间,自1970年开始,0表示下次登录之后就要改密码,为空表示密码时效功能无效
minimum password age  #最小时间间隔,当前密码最少能使用多少天,0表示随时可被变更
maximum password age  #最大时间间隔,当前密码最多能使用多少天,99999表示可以一直使用
password warning period  #警告时间,密码过期前几天开始提醒用户,默认为7
password inactivity period    #不活动时间,密码过期几天后帐号会被锁定,在此期间,用户仍然可以登录,为空表示不使用此规则
account expiration date       #失效时间,从1970年1月1日算起,多少天后帐号失效,为空表示永不过期
reserved field       #保留字段,无意义

​ 伪账户的密码是”!!”或”*”,代表没有密码是不能登陆的,新建用户还没设密码时为!!,禁用账号时,会直接在密码字段前加!

Ubuntu默认不允许管理员root直接登录系统,原因是Ubuntu默认对管理员进行锁定

密码的安全策略

  • 足够长
  • 使用数字、大写字母、小写字母以及特殊字符中至少三种
  • 使用随机密码
  • 定期更换,不要使用最近曾经使用过的密码

查看系统密码的加密算法

1
2
3
4
5
6
7
#	查看目前系统使用的加密算法
authconfig --test | grep hashing

# 修改Linux用户的密码加密算法
authconfig --passalgo=sha256 --update

authconfig --passalgo=sha256 --update

系统中的生成随机密码

1
2
3
tr -dc '[:alnum:]' < /dev/urandom | head -c <需要的位数>

openssl rand -base64 <需要的位数>

2.4 group文件格式

1
2
3
4
5
6
7
8
/etc/group
group里保存系统用户组的属性信息。格式如下:
group_name:password:GID:user_list

group_name #组名
password #组密码,当用户切换主组时,需要用到此密码验证。与passwd相同,会使用x替代
GID #组ID
user_list #用户列表,多个用户使用,分割。此处的用户将当前组作为附属组

2.5 gshadow文件格式

1
2
3
4
5
6
7
8
/etc/gshadow
gshadow里保存Linux系统用户组的密码信息。格式如下:
group_name:encrypted password:administrators:members

group name #组名
encrypted password #组密码,是加密后的密文。如果显示!证明组没设置过密码
administrators #组管理员
members #用户列表,多个用户使用,分割。此处的用户将当前组作为附属组。与group的相同

2.6 安全操作配置文件

更改这些文件时可以使用专用的工具来进行修改。同时也保证了修改后格式出错等问题不会影响到系统。

vipw / **vigr 命令:**编辑/etc/passwd/etc/shadow/etc/group这些文件时,该方法会设置适当的锁,防止文件损坏

1
2
3
vipw -p 			编辑/etc/passwd文件
vipw -g 编辑/etc/group文件
vipw -s 编辑/etc/shadow文件

**pwck命令:**用来验证系统认证文件/etc/passwd和/etc/shadow的内容和语法

1
2
pwck -q				仅报告错误信息
pwck -s 以用户id排序文件

**getent命令:**直接查看配置文件

1
2
3
4
5
6
7
8
getent passwd		查看/etc/passwd文件
getent shadow 查看/etc/shadow文件
getent group 查看/etc/group文件
getent gshadow 查看/etc/gshadow文件

也可以过滤文件内容
getent passwd <用户名>
例:getent passwd root

3 用户和组管理命令

用户管理命令

  • useradd
  • usermod
  • userdel

组账号维护命令

  • groupadd
  • groupmod
  • groupdel

3.1 创建用户 useradd

useradd命令可以创建新的用户账号,同时创建用户的主组。默认主组和账号同名

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
useradd [选项] <用户名>
#选项
-u #指定UID
-g #指定用户主组
-c #新账户的备注
-d #指定用户家目录
-s #指定shell
-r #作为系统用户创建,不会创建登录用户相关信息
-m #指定创建家目录
-M #指定不创建家目录

-p #设置密码,但这里是以明文存储的
-o #允许使用重复的UID创建用户
-G #为用户添加附属组,组需要事先存在
-N #不创建与用户同名的私有组,使用系统自带的users组作为主组

-D #显示默认的useradd配置,配置文件在/etc/default/useradd

useradd 命令默认值设定由/etc/default/useradd文件来定义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#对于Ubuntu系统而言,默认创建用户使用/bin/sh解释器,且不会自动创建家目录

#useradd的内容
GROUP=100
#如果使用-N选项不创建私有组,则使用默认的用户组(users:100)

HOME=/home
#定义新用户创建时的家目录位置

INACTIVE=-1
#对于/etc/shadow文件第7列,即用户密码过期的宽限期

EXPIRE=
#对应/etc/shadow文件第8列,即用户账号的有效期

SHELL=/bin/bash
#定义创建新用户时使用的解释器类型

SKEL=/etc/skel
#/etc/skel是创建用户家目录时的模板文件(家目录下的那几个隐藏文件)

CREATE_MAIL_SPOOL=yes
#是否创建mail文件

#该文件的目录是/var/spool/mail。是系统内部的邮件系统
#收到邮件的用户会在登陆后收到提示

使用命令修改useradd中的文件属性

1
2
3
4
#更改默认shell
useradd -D -s /bin/bash

#其余项也类似,如同创建用户时的用户选项一样

与新建用户相关的文件:

  • /etc/default/useradd
  • /etc/skel/*
  • /etc/login.defs

扩展 登录提示符显示 sh-4.2$

有两种可能:

1、使用的Linux系统版本较老,并且使用了/bin/sh终端,导致登录提示符显示出错

解决办法:将用户的shell更改为/bin/bash,再重新登录

2、家目录下的用户配置文件损坏导致

解决办法,删除家目录下的所有配置文件,前往/etc/skel/目录将.*文件拷贝一份到家目录,再重新登录

批量创建用户 newusers

1
2
3
4
5
6
7
8
#使用newusers创建用户,需要我们先手动编写用户的七大项内容,例:
vi user.txt
u1:123456:1024:1024::/home/u1:/bin/bash
u2:123456:1025:1025::/home/u2:/bin/bash
:wq

newusers user.txt
#这样就创建了u1,u2两个用户,但密码是以明文存储的,需要使用passwd修改密码,不然无法和密文对上,无法登录

批量修改用户密码 chpasswd

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#此命令使用方法和上面相同,但它修改密码后会以密文形式存储,能让账号能正常使用了
vi pwd.txt
u1:1234567
u2:1234567
:wq

chpasswd < pwd.txt

#或 多行重定向
chpasswd <<EOF
> u1:1234567
> u2:1234567
> EOF

#或 管道重定向
echo u1:123456 | chpasswd

使用openssl手动生成sha512加密密码

rocky8生成sha512加密密码

1
2
3
4
5
6
7
#openssl passwd -6 <密码>

openssl: 这是调用 OpenSSL 工具的命令部分,OpenSSL 是一个强大的开源加密库以及相关工具集,提供了众多加密、解密、数字证书管理等功能相关的实用程序

passwd: 是 OpenSSL 工具集中用于处理密码相关操作的一个子命令,主要功能就是对给定的密码进行哈希处理,将原始的明文密码转换为加密后的哈希值,便于安全存储等应用场景

-6: 这是一个选项参数,制定了所使用的哈希算法类型。在这里 -6 表示使用 SHA-512 算法来生成密码的哈希值。SHA-512 是一种安全散列算法,它能够将输入的密码等数据通过特定的计算生成一个固定长度(128 字节)的哈希值,并且具有较强的抗碰撞性等安全特性,能够保障密码哈希后的安全性。不同的系统或应用场景可能支持不同的哈希算法选项,比如还可能有 -1(表示使用 MD5 算法,但 MD5 算法因为安全性原因已不推荐用于密码哈希了)等其他选项来指定不同的算法

CentOS 7 使用Python程序生成sha512加密密码

1
python -c 'import crypt,getpass;pw="你的密码";print(crypt.crypt(pw))'

Ubuntu2204 创建sha512加密密码

1
openssl passwd -6 <你的密码>

使用/dev/urandom来生成随机密码

1
2
3
4
5
6
7
8
#使用Linux的随机设备生成
tr -dc '[:alnum:]' < /dev/urandom | head -c xx


#使用openssl来随机生成
openssl rand -base64 xx

#xx为需要的密码长度

3.2 修改用户属性 usermod

命令usermod用于修改系统用户属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
usermod [选项] <用户名>
#选项
-c #修改注释
-d #修改家目录
-g #修改用户主组
-G #修改用户附属组
-a #让用户在修改附属组时保留已有的附属组
-l #修改登录名称(用户名)
-L #锁定用户账号
-m #将家目录的文件移动到新位置,配合-d一起使用
-s #修改 shell
-u #修改 UID
-U #解锁用户账号
-p #修改密码,如果使用这个选项需要使用加密后的字符串

-e #修改过期的日期
-f #密码过期后账户过多久禁用。0表示立即,-1表示不使用

-o #允许使用重复的UID

3.3 删除用户 userdel

命令userdel的作用是删除Linux用户

1
2
3
4
userdel [选项] <用户名>
#选项
-f #强制删除,包括用户在线也一样执行
-r #删除家目录和邮件目录

注:当用户被删除后,其所属的文件都无法正常显示所属用户所属私有组。但会显示UID和GID。当再创建一个新用户且UID相同时,将会继承原用户文件

删除用户时会把与其同ID的主组也给删了,前提是该组下没有其它用户

3.4 查看用户相关的ID信息

命令id可以查看用户的UID,GID等信息

1
2
3
4
5
6
7
8
id [选项] <用户名>
#选项
-a #显示详细信息(默认选项)
-Z #仅显示安全上下文信息,要开启selinux配置才有
-g #仅显示主组GID
-G #显示所有组的GID
-n #显示用户名或组名
-u #仅显示UID

3.5 切换用户或使用用户执行命令

在当前登录用户权限不足或没有某些资源权限时:

我们可以做两件事

1、让有权限的用户登录终端,再进行相应的操作

2、在当前终端临时切换,以有权限的用户身份去执行

命令su是用于切换用户,或以指定用户身份执行命令

1
2
3
4
5
6
7
8
9
su [选项] [-] <用户名>
#选项
-m #不重置环境变量
-|-l|--login #完全切换
-g #指定主组,只有root切别人能用
-c #不切换用户,只使用用户权限和环境执行命令
-f #项shell传递选项(csh 或 tcsh才有用)
-s #切换用户后指定shell解释器
-P #开一个新的终端
  • su <用户名>:非登录式切换,既不会读取目标用户的配置文件,也不改变当前工作目录。不完全切换
  • su - <用户名>:登录式切换,会读取目标用户的配置文件,切换到目标用户的家目录。完全切换

说明:root用户su切换其他用户不需要密码;非root用户切换时必须要密码(包括没有了密码的账户)

注:su切换新用户相当于是套了一层皮,如果一直切来切去相当于包裹了很多层,环境有可能会因此产生冲突。使用exit可以退回上一个旧用户身份

另提醒:使用-c想以另一个用户执行命令而不切换用户时。如果传递的命令存在空格,请使用双引号“”进行包裹。如果命令中存在$xxx等变量,请使用单引号‘’

3.6 设置用户密码 passwd/chpasswd

命令passwd的作用是修改系统用户的密码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
passwd [选项] <用户名>
#选项
-k #保持身份验证令牌不过其
-d #删除用户密码,也删除密码锁。仅root有权限操作。删除密码锁但登录还是会要密码,相当于登录不上
-l #锁定用户密码,仅root有权限操作
-u #解锁用户密码,仅root有权限操作
-e #将用户密码认同为过期,用户下次登陆成功后立马需要设置新密码,仅root有权限操作
-f #强制执行操作

-S #查询用户的密码状态,仅root有权限操作

-x #指定用户密码最长有效期,仅root有权限操作
-n #指定用户密码最短有效期,仅root有权限操作
-w #在密码过期前多少天开始提醒用户,仅root有权限操作
-i #在密码过期后经过多少天该用户账号会被禁用,仅root有权限操作

--stdin #从标准输入接受密码,Ubuntu无此选项

注:普通用户可以修改自己密码,但需要先验证当前使用的密码

1
2
3
4
5
6
7
8
#非交互式修改用户密码

#只有centos能用
echo '密码' | passwd --stdin <用户名>

passwd --stdin <用户名> <<< '密码'

chpasswd <<< "用户名:密码"

3.7 修改用户密码策略 chage

命令chage作用是修改用户的密码策略

1
2
3
4
5
6
7
8
9
chage [选项] <用户名>
#选项
-d #更改密码的时间
-m #锁定当前密码n天,n天后即可正常修改密码(一次性)
-M #密码过期时间
-W #过期前n天发送警告
-I #密码过期后的允许使用过期密码登录的时间
-E #账号的有效期(YEAR-MONTH-DAY)
-l #显示密码策略

3.8 其他命令 chfn|chsh|finger

命令chfn的作用是设置用户说明信息,passwd文件的第五字段

1
2
3
4
chfn <用户名>
#会请求四项信息,全部输入后会使用逗号,分割后填入passwd
#分别是 姓名,办公,办公电话,住宅电话
#可以设置完后使用getent来查看

命令chsh的作用是指定用户的shell解释器,功能等同于usermod -s

1
2
3
chsh -l			#查看系统shell解释器(ubuntu没有此参数)

chsh -s #设置用户解释器

命令finger的作用是查看用户最近一次登录信息

1
2
3
4
#这个命令需要先下载包
yum install -y finger

finger <用户名>

3.9 创建用户组 groupadd

命令groupadd的作用是创建用户组

1
2
3
4
5
6
7
8
9
10
groupadd [选项] <组名>
#选项
-f #如果组已经存在则直接成功退出
-g #指定组ID,默认是系统分配
-r #创建系统组,centos 6之前是ID<500,cent 7是ID<1000


-p #直接设置密码,但需要使用加密过的密文
-o #允许创建有重复 GID 的组
-K #不用/etc/login.defs 中的默认值,自己指定(除非特殊情况,不然用不到这个)

3.10 修改用户组 groupmod

命令groupmod的作用是修改用户组

1
2
3
4
5
6
7
groupmod [选项] <用户组>
#选项
-g #将组 ID 改为 GID
-n #给用户组改名
-p #更改用户密码(自动加密)

-o #允许使用重复的GID

3.11 查看用户的用户组 groups

命令groups的作用是查看用户的所有用户组情况

1
group <用户名>

3.12 删除用户组 groupdel

命令groupdel的作用是删除用户组

1
2
3
groupdel [选项] <组名>
#选项
-f #强制删除,即使是用户的主组也强制删除,会导致无主组的用户账号不可用,无法登录

注:强制删除后显示该组名的地方,只能显示组ID,如果新建一个组与此ID相同,则被删除的组的数据会被新组关联

3.13 更改用户组密码 gpasswd

命令gpasswd的作用是更改组密码和修改附加组的成员关系

当组没密码只能由root来添加删除成员

1
2
3
4
5
6
7
8
9
10
gpasswd [选项] <组名>
#选项
-a #向组中添加用户
-d #向组中移除用户
-r #删除组密码
-R #不允许普通成员切换此组为主组,即使有组密码。组管理员不受影响
-M #批量添加成员加组,会覆盖之前的组成员
-A #批量设置组管理员,会覆盖以前的管理员

#注:组管理员可以不在组内。当组管理员在组里但不在-M的成员列表中,管理员也会被移除组成员,但管理权限仍然还在

3.14 临时切换用户主组 newgrp

命令newgrp的作用是临时切换主组,如果用户本不属于此组,则需要组密码

如果已经是组的成员则用户切换不需要组密码

1
newgrp [-] <组名>		#如果使用 - 选项,可以初始化用户环境

3.15 管理用户组 groupmems

命令groupmems的作用是管理附加组的成员关系,和gpasswd命令相同

1
2
3
4
5
6
7
8
groupmems [选项] <-g 组名>
#选项
-g #更改为指定组(只有root用户可以使用)

-a #指定用户加入组
-d #从组中删除用户
-p #从组中清除所有成员
-l #显示组成员列表

注:普通用户不能使用-g参数,只能给自己的主组进行管理

4 文件权限管理

4.1 Linux中的权限体系

​ 在Linux系统中,一切皆文件;

​ 对文件来讲,系统中的用户,分属于三类不同的角色,分别是属主,属组,其它用户

​ 而文件对于用户的权限,也分三种,分别是读、写、执行

image-20241121190837970

三种角色

角色 英文名 字符表示
属主:所有者 owner|user u
属组:所属组 group g
其它用户:不是所有者也不在所属组中的人 other o

三种权限

权限 英文名 字符表示 八进制表示
读权限 read r 4
写权限 write w 2
执行权限 execute x 1

程序访问文件时的权限,取决于此程序的发起者权限

  • 进程的发起者是文件的属主:则应用文件属主权限
  • 进程的发起者属于文件的属组:则应用文件属组权限
  • 应用文件的”其它”权限

image-20241121191213751

4.2 文件所有者和属组的属性更改

4.2.1 设置文件的所有者 chown

​ 命令chown的作用是修改文件的属主,也可以修改文件的属组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
chown [选项] [owner]:[group] <文件名>

#用法说明
OWNER #只修改所有者
OWNER:GROUP #同时修改所有者和属组
:GROUP #只修改属组,冒号也可用.替代
OWNER: #同时修改所有人和属组(会用用户同名的私有组)

#选项
-R #递归操作,注意确定好是否有不需要改的
-c #只显示更新成功的信息(默认不显示成功信息)
-f #不显示错误信息
-v #显示所有过程

-h #修改软链接的属性(默认是修改软链接指向的文件权限)
-H #配合R使用。如果软链接指向目录,则只修改指向的目录不改文件
-L #更改所有遇到的符号链接指向的目录
-P #不对软链接指向的目录进行更改

4.2.2 设置文件的属组信息 chgrp

​ 命令chgrp的作用是设置文件的属组

1
2
3
4
5
6
7
8
9
10
11
12
chgrp [选项] [group] <文件名>

#选项
-R #递归操作,注意确定好是否有不需要改的
-c #只显示更新成功的信息(默认不显示成功信息)
-f #不显示错误信息
-v #显示所有过程

-h #修改软链接的属性(默认是修改软链接指向的文件权限)
-H #配合R使用。如果软链接指向目录,则只修改指向的目录不改文件
-L #更改所有遇到的符号链接指向的目录
-P #不对软链接指向的目录进行更改

两个指令的选项相同,功能有部分重叠,注意区分

4.3 文件权限

4.3.1 文件权限说明

角色定义

角色 在命令中的字符 备注
owner u 属主
group g 属组
other o 其它用户
all a 所有人,包括属主,属组和其它用户

赋值写法

在命令中的字符 备注
+ 增加某些权限
- 删除某些权限
= 只保留某些权限,覆盖写法

权限表示方法

权限 在命令中的字符 八进制数字表示 备注
Readable r 4 读权限
Writeable w 2 写权限
eXecutable x 1 执行权限

常用写法

1
2
3
4
5
6
u+r					#属主加读权限
g-x #属组去掉执行权限
ug=rx #属主和属组一并权限改为读和执行(覆盖)
o= #其它用户无任何权限
a=rwx #所有用户都有读写执行权限
u+r,g-x #同时指定权限的增减

注:

  • 用户的最终权限,是从左向右进行顺序匹配。所有者,所属组,其他人。一旦匹配到,权限立刻生效,不会再往右查看其它权限
  • r和w权限对root用户无效,对没有读写权限的文件,root照样能读写
  • 只要所有者,所属组或其他用户三者之一有执行权限,root就可以执行

权限对于文件和目录的区别

权限 对文件 对目录
r 查看文件内容 读取目录中的文件名。但无法查看文件元数据
w 修改文件内容 可在目录中创建和删除文件
x 可执行,发起为一个进程 可进入目录,可查看文件元数据,允许去查看文件内容。属于目录最小权限

4.3.2 修改文件权限 chmod

命令chmod可以根据不同用户对象设置不同权限

1
2
3
4
5
6
7
8
chmod [参数] <文件名>

#选项
-R #递归操作
-v #显示过程
-c #只显示成功的信息
-f #不显示错误信息
--reference=file #复制指定文件的权限信息给他人

拓展:执行cp指令需要的最小权限是什么

1
2
3
4
5
6
7
8
执行 cp /etc/issue /data/dir/ 所需要的最小权限???
/bin/cp 需要x权限

/etc/ 需要x权限
/etc/issue 需要r权限

/data 需要x权限
/data/dir 需要w,x权限

4.4 新建文件和目录的默认权限

​ 在Linux系统,新建文件或目录会给一个默认的权限

​ Linux是通过控制umask值来间接的影响新建文件和新建目录的权限

  • 新建文件:666-umask,按位对应相减,如果所得结果为奇数则该位+1变为偶数(奇数代表有执行权限,但文件不能随便给执行权限)
  • 新建目录:777-umask,按位对应相减,所得结果是多少则权限就是多少,无额外要求
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
umask [选项] <参数>

#选项
-p #一般用于记录原始umask值便于还原
-S #用字母更直观的显示掩码所代表的权限

#例子
:umask
0022

:umask -p
umask 0022

:umask -S
u=rwx,g=rx,o=rx

​ 如何修改umask值

1
2
3
4
5
6
7
:umask 123
:umask
0123

:umask u=rw,g=r,o=
:umask
0137

注,umask默认值也是有不同的:

普通用户的umask默认是002

root的umask默认是022

​ 持久化设置umask值:

1
2
全局设置:在/etc/bashrc或/etc/bash.bashrc(ubuntu)中添加
用户设置:在~/.bashrc中添加

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
2
3
4
5
6
7
8
9
chmod u+s	文件名
chmod 4xxx 文件名
chmod u-s 文件名

#SUID权限与所属用户的x权限位共用。如果为s代表有执行权限,为S代表无执行权限

#SUID权限执行流程
第一步:判断执行命令用户是否对命令文件拥有执行权限
第二步:判断是否有SUID权限。如果有,会以命令属主身份执行操作

4.5.2 特殊权限SGID

二进制的可执行文件上SGID权限意义:

  • 启动为进程后,进程的属组为原程序文件的属组

权限SGID设置方法:

1
2
3
4
5
chmod g+s	文件名
chmod 2xxx 文件名
chmod g-s 文件名

#SGID权限与所属组的x权限位共用。如果为s代表有执行权限,为S代表无执行权限

目录上的SGID权限意义:

  • 对此目录有写权限的用户在此目录创建的文件所属的组为此目录的属组。通常用于创建一个协作目录

4.5.3 特殊权限Sticky

​ 具有写权限的目录通常用户可以删除该目录中的任何文件,无论该文件的权限或拥有权(无Sticky)

​ 在目录上设置Sticky后,目录下的文件将只有文件的所有者root才可以删除

sticky设置在文件上无意义

权限Sticky设定:

1
2
3
4
5
chmod o+t	目录名
chmod 1xxx 目录名
chmod o-t 目录名

#sticky权限与其它用户的x权限位共用,如果为t代表有执行权限,如果为T代表没执行权限

4.5.4 设定文件特殊属性

文件特殊属性的意义在于提供一套超越传统”rwx”权限的、更底层、更强大的访问控制机制。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
chattr [选项] [追加的属性] <文件名>
#选项
-R #递归设置文件特殊属性

-V #显示过程,并输出chattr的版本
-f #不输出错误信息
-v #显示版本
-p #设置文件项目编号

#操作符
+ 追加属性
- 去除属性
= 覆盖属性

#常用属性
a #对文件:只可追加内容,不可被删除,不可被修改,不可被重命名;对目录:可新建,修改文件,但不允许删除文件,不可重命名文件
i #对文件:不可删除,不可修改,不可重命名;对目录:可修改查看目录中的文件,不可新建文件,不可删除文件,不可重命名文件

显示文件特殊属性

1
2
3
lsattr <文件名>

#显示出来的e是文件系统自带的,其他的才是设置的

4.6 访问控制列表 ACL

4.6.1 ACL权限功能

​ rwx权限体系中,只能将用户分成三种角色。如果要对单独用户设置额外的权限,则无法做到

​ ACL就是为了弥补这一块的缺陷而出现的。ACL可以单独对指定的用户设定各不相同的权限;提供颗粒度更细的权限控制

ACL权限生效顺序(也与文件系统一样,匹配了立刻生效,不再向后查询):

1
所有者 --> 自定义用户 --> 所属组 --> 自定义组 --> 其他人

4.6.2 ACL相关操作

命令 setfacl 作用是设置ACL权限

命令 getfacl 作用是查看设置的ACL权限

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
setfacl	[选项] <文件名>

#选项
-m #修改acl权限
-M #从指定文件读取acl规则,将规则运用到目标文件上
-x #删除文件的指定acl权限
-X #从指定文件读取acl规则,将这些规则从目标文件删除
-b #删除文件所有acl权限
-k #删除默认acl规则

--set-file=file #从文件读取新规则,并用它覆盖目标文件上的ACL规则
--set=acl #用新规则替换旧规则,需要另外将ugo的设置都写一遍,不能只有acl规则
--mask #重新计算mask值
-n #不重新计算mask值
-d #在目录上设置默认acl(此目录下的文件或目录都会继承这些ACL规则)
-R #递归执行

使用举例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
setfacl -m u:test:rw test.txt
#给test单独加rw权限,针对test.txt文件

getfacl test.txt
#查看test.txt文件的acl权限

getfacl test.txt | setfacl --set-file=- test2.txt
#将test.txt的acl权限拷贝设置到test2.txt上

setfacl -x u:test test.txt
#将test.txt上的自定义用户test的权限移除

setfacl -b test.txt
#将test.txt上的所有acl权限移除

setfacl --set u::rw,u:test:-,g::-,o::- test.txt
#使用set设置acl权限

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
2
3
4
5
6
7
8
getfacl -R /tmp/dir > acl.txt
#对目录下的所有acl权限进行备份

setfacl --restore acl.txt
#对acl权限进行还原(更安全,因为-R的输出的内容中包含绝对路径)

setfacl -R --set-file=acl.txt /tmp/dir
#对目录下的acl权限进行还原(有可能会出现权限错乱,较危险)