用户、组和权限

内容概述

  • Linux 的安全模型

  • 用户和组相关文件

  • 用户和组管理命令

  • 理解并设置文件权限

  • 默认权限

  • 特殊权限

  • 文件访问控制列表

1 Linux安全模型

资源分派

Authentication:认证,验证用户身份
Authorization:授权,不同的用户设置不同权限
Accouting|Audition:审计
当用户登录成功时,系统会自动分配令牌token,包括:用户标识和组成员等信息

1.1 用户

Linux系统通过用户的uid号码和用户密码登录系统中,管理系统服务程序、数据。

管理员用户 root		 皇帝		 uid:0		 权限至高无上
系统虚拟用户 nobody	傀儡		uid:1-999	只能管理一些进程服务。没有用户家目录,不能登录系统。
系统普通用户 xuan		平民		uid:1000+	权利有限,可以管理对应用户进程。拥有家目录,可以登录系统

系统用户:1-499(CentOS 6以前), 1-999 (CentOS 7以后)对守护进程获取资源进行权限分配
登录用户:500+(CentOS6以前), 1000+(CentOS7以后)给用户进行交互式登录使用

1.2 用户组

Linux中可以将一些需要相同权限用户加入一个用户组,用户组是通过Group ID(GID) 来唯一标识的。

管理员组:root, 0
系统组:1-499(CentOS 6以前), 1-999(CentOS7以后), 对守护进程获取资源进行权限分配
普通组:500+(CentOS 6以前), 1000+(CentOS7以后), 给用户使用

1.3 用户和用户组关系

  • 用户的主要组(primary group):用户必须属于一个且只有一个主组,默认创建用户时会自动创建和用户名同名的组,做为用户的主要组,由于此组中只有一个用户,又称为私有组
  • 用户的附加组(supplementary group): 一个用户可以属于零个或多个辅助组,附属组

用户组:把对文件有相同权限功能的用户划分为一个组,统一对数据进行管理。

1对1		  一个用户只属于一个用户组
1对多		 一个用户可以属于多个用户组
多对1		 多个用户可以属于一个用户组
多对多		多个用户可以属于多个用户组

2 用户和组的配置文件

2.1 passwd文件

/etc/passwd文件保存Linux系统用户属性配置信息,passwd文件实际内容如下

passwd文件每一行表示一个用户属性信息,以":"划分7列
第一列	用户名
第二列	用户密码信息,centos7版本为了系统安全,把用户密码记录在/etc/shadow文件,这里显示为X
第三列	用户的uid信息
第四列	用户组的gid信息
第五列	对该用户注释说明信息,如:mysql用户(manager datebase user),后面有命令可以设置
第六列	用户的家目录信息
第七列	用户登录系统的shell解释器
root用户和创建新用户默认都是/bin/bash
系统用户使用是/sbin/nologin解释器, 无法登录系统

2.2 shadow文件

/etc/shadwo文件保存Linux系统用户的密码信息

第一列 登录用名
第二列 用户密码:一般用sha512加密
第三列 从1970年1月1日起到密码最近一次被更改的时间
第四列 密码再过几天可以被变更(0表示随时可被变更)
第五列 密码再过几天必须被变更(99999表示永不过期)
第六列 密码过期前几天系统提醒用户(默认为一周)
第七列 密码过期几天后帐号会被锁定
第八列 从1970年1月1日算起,多少天后帐号失效

第二列详细说明
1.此字段可能为空,在这种情况下,作为指定的登录身份验证不需要密码
2.以感叹号开头的密码字段或者星号,表示此用户被所锁定,无法通过密码登录系统

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

第一步:修改shadow文件, 把root用户的第二列的"!"删除
[root@ubuntu ~ ]# getent shadow root
root::18722:0:99999:7:::

第二步: 给root用户设置密码
[root@ubuntu ~ ]# passwd
New password:
Retype new password:
passwd: password updated successfully		
此时我们就可以使用root用户本地登录到Ubuntu系统上

第三步: 如果想使用root用户远程登录, 需修改/etc/ssh/sshd_config文件
[root@ubuntu ~ ]# vi /etc/ssh/sshd_config
PermitRootLogin yes

密码的安全策略

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

更改Linux用户的密码加密算法

authconfig   --passalgo=sha256 --update

范例: 生成随机密码

tr -dc '[:alnum:]' < /dev/urandom | head -c 12
openssl rand -base64 100
生成随机密码:https://suijimimashengcheng.51240.com/

2.3 group文件

/etc/group文件保存系统用户组的属性信息

第一列 群组名称:就是群组名称
第二列 群组密码:通常不需要设定,密码是被记录在 /etc/gshadow 
第三列 GID:就是群组的 ID 
第四列 以当前组为附加组的用户列表(分隔符为逗号)

2.4 gshadow文件

/etc/gshdow文件保存Linux系统用户组密码信息

第一列 用户组名称
第二列 群组密码
第三列 组管理员,更改组密码和增删用户组成员
第四列 以当前组为附加组的用户列表:多个用户间用逗号分隔

2.5 配置文件操作

**vipw / vigr 命令: ** 编辑/etc/passwd、/etc/shadow、/etc/group和/etc/gshadow文件, 该方式将设置适当的锁,以防止文件损坏。

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

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

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

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

getent passwd		查看/etc/passwd文件
getent shadow		查看/etc/shadow文件
getent group 		查看/etc/grooup文件
getent gshadow		查看/etc/gshadow文件

getent可以直接过滤文件内容
[root@centos7 ~]# getent passwd root
root:x:0:0:root:/root:/bin/bash

3 用户和组管理命令

3.1 创建用户 useradd

useradd命令可以创建Linux新用户, 同时创建用户的主组

选项

useradd -u		#指定该用户的UID
useradd -o		#配合-u 选项,不检查UID的唯一性
useradd -d		#指定宿主目录,默认为 /home/用户名
useradd -g		#指定用户所属主组(必须已存在)
useradd -G		#指定用户所属的附加组(必须已存在)
useradd -N		#不单独创建私用组做主组,使用users组做主组
useradd -m		#用户目录如不存在则自动建立
useradd -M		#不为用户建立并初始化宿主目录,优先于/etc/login.defs文件的设定
useradd -r		#创建系统用户,但使用shell解释器是/bin/bash
useradd -s		#指定用户的登录Shell
useradd -D		#查看创建用户的/etc/default/useradd的配置内容

--------------------------------------------------------------------
#对于uUbuntu系统: 默认创建用户使用/bin/sh解释器,且不会自动创建家目录
useradd -r -d /home/apache -m -S /bin/bash apache

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

[root@centos7 ~]# cat /etc/default/useradd
#定义useradd -N 创建用户不创建私用组, 使用的用户组
GROUP=100
#定义创建新用户的家目录所在位置
HOME=/home
#对应/etc/shadow文件第7列,即用户密码过期的宽限期
INACTIVE=-1
#对应/etc/shadow文件第8列,即用户帐号的有效期
EXPIRE=
#定义创建新用户使用的解释器
SHELL=/bin/bash
#/etc/skel是创建用户家目录模板
SKEL=/etc/skel
#创建mail文件
CREATE_MAIL_SPOOL=yes

通过命令修改/etc/default/useradd文件属性

useradd -D 
useradd –D -s SHELL
useradd –D –b BASE_DIR
useradd –D –g GROUP

3.2 修改用户属性

usermod命令修改系统用户属性

usermod -u UID			#修改用户UID
usermod -g GID			#修改用户主组
usermod -G GROUP1		#新附加组,原来的附加组将会被覆盖;若保留原有,则要同时使用-a选项
usermod -s SHELL		#新的默认SHELL
usermod -c 'COMMENT'	 #新的注释信息
usermod -d HOME			#新家目录不会自动创建;若要创建新家目录并移动原家数据,同时使用-m选项
usermod -l login_name	 #新的名字
usermod -L				#lock指定用户,在/etc/shadow 密码栏的增加 ! 
usermod -U			     #unlock指定用户,将 /etc/shadow 密码栏的 ! 拿掉
usermod -e YYYY-MM-DD	 #指明用户账号过期日期
usermod -f INACTIVE		#设定非活动期限,即宽限期

范例: 修改附加组

[root@centos7 ~]# usermod -G tom1 tom
[root@centos7 ~]# id tom
uid=1005(tom) gid=1005(tom) groups=1005(tom),1006(tom1)

[root@centos7 ~]# usermod -G xuan tom
[root@centos7 ~]# id tom
uid=1005(tom) gid=1005(tom) groups=1005(tom),996(xuan)

[root@centos7 ~]# usermod -aG tom1 tom
[root@centos7 ~]# id tom
uid=1005(tom) gid=1005(tom) groups=1005(tom),996(xuan),1006(tom1)

情空附加组
[root@centos7 ~]# usermod -G "" tom
[root@centos7 ~]# id tom
uid=1005(tom) gid=1005(tom) groups=1005(tom)

3.3 删除用户

userdel删除系统用户

userdel				   #不加参数删除用户,不会删除用户的家目录文件和邮件文件
userdel -f, --force   	#强制删除用户
userdel -r, --remove 	#删除用户家目录和用户邮件服务mail

3.4 查看用户相关的ID信息

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

id -u	#显示UID
id -g 	#显示GID
id -G	#显示用户所属的私有组的ID

3.5 切换用户su

su命令即switch user切换用户,并且以指定用户的身份执行命令。

su命令格式

su [options] [-] [USER [arg]...]

su参数说明

su [-, -l, --login]		  #完全切换用户
su -c					#指定用户的shell终端传递命令, 返回执行结果给当前用户

su切换用户方式

su root 	#不完全切换用户, 此方式不会读取目标用户的配置文件,不改变当前工作目录,不会加载用户相关环境变量
su - root	#完全切换用户身份,会读取目标用户的配置文件,切换至自已的家目录,加载用户相关环境变量

注意:su 切换新用户后,使用 exit 退回至旧的用户,而不要再用 su 切换至旧用户,否则会生成很多的bash子进程,环境可能会混乱

范例

1.使用su 切换用户, 查看用户相关变量是否改变
[root@centos7 ~ ]# su xuan
[xuan@centos7 /root ]$ env | grep root
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
MAIL=/var/spool/mail/root
PWD=/root

2.使用su - 切换用户, 查看用户相关变量是否改变
[root@centos7 ~ ]# su - xuan
Last login: Mon Apr 12 16:04:01 CST 2021 on pts/0
[xuan@centos7 ~ ]$ env | grep root
[xuan@centos7 ~ ]$ env | grep xuan
USER=xuan
MAIL=/var/spool/mail/xuan
PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/xuan/.local/bin:/home/xuan/bin
PWD=/home/xuan
HOME=/home/xuan
LOGNAME=xuan

3. 切换指定用户执行命令
[xuan@centos7 ~ ]$ su - root -c "getent shadow"

3.6 设置用户密码passwd chpasswd

passwd可以修改系统用户的密码

passwd -d				#删除指定用户密码
passwd -l				#锁定指定用户
passwd -u				#解锁指定用户
passwd -e				#强制用户下次登录修改密码, 设置后shadow文件第三字段为0 *****
passwd -f				#强制操作
passwd -n mindays		#指定用户的密码最短使用期限
passwd -x maxdays		#指定用户的密码最大使用期限
passwd -w warndays		#提前多少天开始警告更改密码
passwd -i inactivedays	#非活动期限
passwd --stdin			#免交互修改用户密码, 从标准输入接收用户密码,Ubuntu无此选项 *****

范例

#1.免交互式修改用户密码
echo 123456 | passwd --stdin xuan
echo root:123456 | chpas

#2.批量创建用户并设置密码
for num in {1..10};do useradd user$num;echo 123456|passwd --stdin user$num;done

#3.批量查看用户
for num in {1..10};do id user$num;done

#4.批量删除用户
for num in {1..10};do userdel -r user$num;done

3.7 修改用户密码策略chage

chage命令可以修改用户密码策略

chage -d 0			   #设置用户几天后必须修改密码, "chage -d 0" 和 "passwd -e" 作用一样
chage -m MIN_DAYS	    #设置用户几天后可以修改密码
chage -M MAX_DAYS	    #设置密码后的最大天数(密码使用时长)
chage -W WARN_DAYS	    #设置过期警告天数
chage -I INACTIVE_DAYS 	#设置密码过期后的宽限期
chage -E EXPIRE_DATE	#设置用户的有效期
chage -l			   #显示用户密码设置情况

范例

#修改xuan用户密码策略,3天后可以正常修改密码,47天密码过期,过期前14天发送警告,密码过期宽容7天,并且xuan用户账户可以使用到2021-10-10
[root@centos7 ~ ]# chage -m 3 -M 47 -W 14 -I 7 -E 2021-10-10 xuan
[root@centos7 ~ ]# chage -l xuan
Last password change								: Apr 12, 2021
Password expires									: May 29, 2021
Password inactive									: Jun 05, 2021
Account expires										: Oct 10, 2021
Minimum number of days between password change		: 3
Maximum number of days between password change		: 47
Number of days of warning before password expires	: 14

#下次用户登录强制修改密码
[root@centos7 ~ ]# passwd -e xuan
[root@centos7 ~ ]# chage -l xuan
Last password change								: password must be changed
Password expires									: password must be changed
Password inactive									: password must be changed

3.8 用户相关其他命令

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

[root@centos7 ~ ]# chfn xuan
Changing finger information for xuan.
Name []: xuan
Office []: yunweirenyuan
Office Phone []: 110
Home Phone []: 119
Finger information changed.

[root@centos7 ~ ]# getent passwd xuan
xuan:x:1007:1007:xuan,yunweirenyuan,110,119:/home/xuan:/bin/bash

chsh指定用户的shell解释器,同usermod -s

chsh -l		#查看系统shell解释器(ubuntu无此参数)
[root@centos7 ~ ]# chsh -l
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin

chsh -s		#设置用户解释器
[root@centos7 ~ ]# chsh -s /bin/sh xuan
[root@centos7 ~ ]# getent passwd xuan
xuan:x:1007:1007:xuan,yunweirenyuan,110,119:/home/xuan:/bin/sh

finger查看用户最近一次登录信息

yum install -y  finger
finger xuan

3.9 创建用户组 groupadd

groupadd创建用户组

groupadd -g		#创建用户组指定GID,除非指定-o选项,否则ID值必须是唯一的数字
groupadd -r		#创建系统组

3.10 修改用户组 groupmod

groupmod修改用户组

groupmod -n group_name	 #修改用户组名称
groupmod -g GID			#新的GID

3.11 查看用户的用户组 groups

groups可以查看用户的所有用户组情况

[root@centos7 ~ ]# groups xuan
xuan : xuan
[root@centos7 ~ ]# gpasswd -a xuan root
Adding user xuan to group root
[root@centos7 ~ ]# groups xuan
xuan : xuan root
[root@centos7 ~ ]# id xuan
uid=1007(xuan) gid=1007(xuan) groups=1007(xuan),0(root)

3.12 删除用户组 groupdel

groupdel删除用户组

gropudel f, --force 	#强制删除,即使是用户的主组也强制删除组

3.13 更改用户组密码 gpasswd

gpasswd命令可以更改组密码,也可以修改附加组的成员关系

gpasswd			#设置用户组密码
gpasswd -a 		#将user添加至指定组中
gpasswd -d 		#移除用户
gpasswd -A 		#设置用户组的管理员用户
gpasswd -r		#删除用户组密码

gpasswd -W		#用户加入用户组

范例

#添加用户组成员
[root@centos7 ~ ]# groupadd admins
[root@centos7 ~ ]# gpasswd -a xuan admins
Adding user xuan to group admins

[root@centos7 ~ ]# id xuan
uid=1007(xuan) gid=1007(xuan) groups=1007(xuan),1008(admins)
[root@centos7 ~ ]# groups xuan
xuan : xuan admins

#删除用户组成员
[root@centos7 ~ ]# gpasswd -d xuan admins
Removing user xuan from group admins
[root@centos7 ~ ]# groups xuan
xuan : xuan
[root@centos7 ~ ]# id xuan
uid=1007(xuan) gid=1007(xuan) groups=1007(xuan)

3.14 临时切换用户主组

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

newgrp [-] [group]		#如果使用 - 选项,可以初始化用户环境

范例:把xuan用户临时切换root用户组作为所属组,如果用户本不属于此组,则需要组密码

#1.设置root组密码
[root@centos7 ~ ]# gpasswd root
Changing the password for group root
New Password:
Re-enter new password:
#2.切换xuan用户,临时切换root用户组
[root@centos7 ~ ]# su - xuan
Last login: Sat Apr 17 18:03:33 CST 2021 on pts/0
[xuan@centos7 ~ ]$ newgrp root
Password:
#3.创建文件测试, 文件的所属组
[xuan@centos7 ~ ]$ touch test.txt
[xuan@centos7 ~ ]$ ll test.txt
-rw-r--r--. 1 xuan root 0 Apr 17 18:09 test.txt

3.15 管理用户组

groupmems 可以管理附加组的成员关系,同gpasswd命令

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

范例

#用户组添加成员
[root@centos7 ~ ]# groupmems -l -g admins
[root@centos7 ~ ]# groupmems -a xuan -g admins
[root@centos7 ~ ]# groupmems -l -g admins
xuan
[root@centos7 ~ ]# groupmems -a tom -g admins
[root@centos7 ~ ]# groupmems -l -g admins
xuan  tom

#除用户组所有成员
[root@centos7 ~ ]# groupmems -p -g admins
[root@centos7 ~ ]# groupmems -l -g admins

4 文件权限管理

4.1 文件所有者和属组属性操作

4.1.1 设置文件的所有者chown

chown 命令可以修改文件的属主,也可以修改文件属组

chown OWNER					 #只修改所有者
chown OWNER:GROUP			 #同时修改所有者和属组
chown :GROUP				 #只修改属组,冒号也可用 "." 替换
chown --reference=RFILE  	 #按照指定文件的的属性,来修改目标文件属性   
chown -R					 #递归,此选项慎用,非常危险!

4.1.2 设置文件的属组信息chgrp

chgrp 命令可以只修改文件的属组

chgrp --reference=RFILE  		#按照指定文件的的属性,来修改目标文件属性
chgrp -R					   #递归,此选项慎用,非常危险!

4.2 文件权限控制

4.2.1 文件权限介绍

文件权限主要针对三种用户对象进行定义

owner	文件属主用户(类似父母), 拥有对该文件最高权限, 可以更改文件权限
group	文件所属组用户(类似亲人)
other	其他系统用户(类似隔壁老王)

注意:用户的最终权限,是从左向右进行顺序匹配,即,所有者,所属组,其他人,一旦匹配权限立即 生效,不再向右查看其权限


每个文件目录针对三种用户分别定义了三种权限

r	read  	读权限
w	write	写权限
x	execute 执行权限

权限对文件来说

r	读权限可以查看文件内容
w	写权限可以修改文件内容
x	执行权限可以执行文件

权限对目录来说

r 	可以使用ls查看此目录中文件列表
w 	可在此目录中创建文件,也可删除此目录中的文件,而和此被删除的文件的权限无关
x 	可以cd进入此目录,可以使用ls -l查看此目录中文件元数据(须配合r权限),属于目录的可访问的最小权限
X 	在递归目录授权a+X权限,只给所有子目录授予x权限,子文件9位权限只要存在一个x执行权限就会授权a+x,否则不授权执行权限

4.2.2 修改文件权限chmod

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

[root@centos7 /data ]# chmod --help
Usage: chmod [OPTION]... MODE[,MODE]... FILE...		权限字母表达式模式	
  or:  chmod [OPTION]... OCTAL-MODE FILE...			数字表达式模式
  or:  chmod [OPTION]... --reference=RFILE FILE...	按照一个文件设置目标文件权限

权限字母表达式授权授权

文件属主授予权限(说明:权限信息可以随意组合 rw rwx rx wx)
添加权限信息	chmod u+[ r / w / x ] 
删除权限信息	chmod u-[ r / w / x ]
设置权限信息	chmod u=[ r / w / x ]

文件属组授予权限
添加权限信息	chmod g+[ r / w / x ]
删除权限信息	chmod g-[ r / w / x ]
设置权限信息	chmod g=[ r / w / x ]

其他用户授予权限
添加权限信息	chmod o+[ r / w / x ]
删除权限信息	chmod o-[ r / w / x ]
设置权限信息	chmod o=[ r / w / x ]

所有用户授予权限
添加权限信息	chmod a+[ r / w / x ]
删除权限信息	chmod a-[ r / w / x ]
设置权限信息	chmod a=[ r / w / x ]

数字表达式授予权限

权限位表示:r		数字表示:4
权限位表示:w		数字表示:2
权限位表示:x		数字表示:1
权限位表示:-		数字表示:0

4.2.3 用户和权限关系

文件权限和用户关系

只赋予文件权限 000
root用户:可以读写文件内容,不能直接执行文件./t1.txt,可以通过bash解释器执行
属主: 不能读写执行
属组: 不能读写执行
其他: 不能读写执行

只赋予文件读权限 444
属主,属组,其他:只能查看文件内容,不能修改文件和执行文件,可以通过bash解释器执行
注意: 可以使用vim编辑工具强制保存修改内容,成为文件所属用户

只赋予文件写权限 222
属主,属组,其他:只能echo修改文件内容,不能直接查看文件内容和执行文件,可以通过bash解释器执行
注意: 可以使用vim编辑工具强制保存修改内容,会覆盖原有内容数据,成为文件所属用户

只赋予文件执行权限 111
root用户:正常操作文件,直接执行文件./t1.txt
属主,属组,其他:不能查看文件内容,不能修改文件内容,不能执行文件,不能通过bash解释器执行
注意: 可以使用vim编辑工具强制保存修改内容,会覆盖原有内容数据,成为文件所属用户

总结
1.root用户,只能文件授予执行权限,就可以对文件任意操作
2.普通用户(属主,属组),至少授予读权限
r + w 权限可以正常编辑文件内容
r + x 权限可以执行文件

目录权限和用户关系

只赋予文件读权限 444
属主,属组,其他:只能ls查看目录下文件,不能删除文件,不能cd进入目录

只赋予文件写权限 222
属主,属组,其他:不能查看目录下文件,不能删除文件,不能cd进入目录

只赋予文件执行权限 111
属主,属组,其他:只能cd进入目录,不能查看目录下文件和删除文件,但如果事先知道目录下文件名,可以查看修改文件内容

总结
1.root用户,对目录默认拥有最大权限 rwx
2.普通用户(属主,属组),对于目录至少授予执行权限
x + r 权限可以查看目录下子文件信息
x + w 权限可以创建删除子文件

读取文件数据原理
目录的权限只管控子文件操作,不管控子目录下文件的创建删除
所以,读取文件数据是按照文件的绝对路径,从根目录开始判断权限
可以理解为:图书馆看书,第一步需要进入图书馆权限,第二步需要获取书架权限,第三步需要书查看权限

面试题

执行 cp /etc/issue /data/dir/ 需要授予最小权限?
cp命令需要执行权限
/etc目录需要执行权限
/etc/issue文件需要读权限
/data目录需要执行权限
/data/dir目录需要读权限和执行权限

4.3 新建文件目录权限控制umask

umask数值用来控制新建文件或者目录权限

对于root用户, umask数值默认是022
对于普通用户, umask数值默认是002

由/etc/profile文件控制默认umask数值
[root@centos7 /data ]# cat /etc/profile
if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
    umask 002
else
    umask 022
fi
说明:如果用户的UID小于199,并且用户和用户所属组名字相同时,umask等于002, 否则umask等于022

umask数值如何控制新建文件目录权限

新建文件的默认权限: 666-umask , 如果所得结果某位存在执行(奇数)权限,则将其权限+1,偶数不变
新建目录的默认权限: 777-umask

umask命令参数

umask -p 	查看umask数值	
umask -S	按照字母表达式显示

设置umask数值

临时设置
[root@centos7 ~ ]# umask 123
[root@centos7 ~ ]# umask
0123

永久设置:写入配置文件
/etc/bashrc
~/.bashrc

4.4 Linux文件特殊权限

4.4.1 特殊权限 SUID

SUID作用:其他用户执行命令,以命令文件的属主身份运行命令

  • 必须是可执行(x)的二进制命令文件或者一些脚本文件设定setUID权限
  • 命令执行者(当前用户)要对该命令文件拥有执行权限(x)
  • 命令的执行者在执行该程序时会以该程序文件的属主身份(在执行程序的过程中灵魂附体为文件的属主)
  • setUID权限只在该程序的执行过程中有效,也就是说身份改变只在程序执行过程中有效

SUID设置方法

方法一:chmod u+s  文件
方法二:chmod 4644 文件
suid权限与执行权限位共用, 执行权限位出现小写s表示文件属主有执行权限, 大写S表示文件文件属主没有执行权限

使用场景

一个用户是否可以修改文件信息,与用户执行什么命令无关,与操作文件对象对应权限有关
[root@centos7 ~ ]# ll /etc/shadow
----------. 1 root root 1107 Apr 17  2021 /etc/shadow

/etc/shadow文件权限是000,普通用户无法查看修改文件内容
[root@centos7 ~ ]# su - xuan
[xuan@centos7 ~ ]$ cat /etc/shadow
cat: /etc/shadow: Permission denied
    
但是xuan用户可以通过passwd命令可以更改密码, 原因是passwd命令文件的属主权限设置了suid特殊权限
[xuan@centos7 ~ ]$ ll `which passwd`
-rwsr-xr-x. 1 root root 27832 Jun 10  2014 /bin/passwd

SUID权限执行流程

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

4.4.2 特殊权限 SGID

SGID作用:其他用户执行命令,以命令文件的属组身份执行

sgid权限作用在文件

只有可执行的二进制程序才能设置SGID权限
命令执行者要对该程序拥有x(执行)权限
命令执行在执行程序的时候,组身份升级为该程序文件的属组
SUID权限同样只在该程序执行过程中有效,也就是说组身份改变只在程序执行过程中有效

sgid设置方法

方法一: chmod g+s  文件
方法二: chmod 2644 文件
guid权限与属组执行权限位共用, 执行权限位出现小写s表示文件属组有执行权限, 大写S表示文件文件属组没有执行权限

sgid权限作用在目录

默认情况下,用户创建文件时,其属组为此用户所属的主组,一旦某目录被设定了SGID,则对此目录有
写权限的用户在此目录中创建的文件所属的组为此目录的属组,通常用于创建一个协作目录

范例

[root@centos7 /data ]# mkdir dir1
[root@centos7 /data ]# chmod 2777 dir1
[root@centos7 /data ]# ll -d dir1/
drwxrwsrwx. 2 root root 6 Apr 13 16:20 dir1/
[root@centos7 /data ]# su xuan
[xuan@centos7 /data ]$ touch dir1/t1
[xuan@centos7 /data ]$ ll dir1/t1
-rw-rw-r--. 1 xuan root 0 Apr 13 16:20 dir1/t1
说明:目录设定为sgid权限,其他用户在此目录下创建文件的属组用户为此目录属组用户

4.4.3 特殊权限 Sticky

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

在目录设置Sticky 权限位,只有文件的所有者或root可以删除该文件,sticky权限设置在文件上无意义

Sticky权限设置

方法一: chmod o+t  文件
方法二: chmod 1644 文件
sticky权限与其他用户执行权限位共用, 执行权限位出现小写s表示文件其他用户有执行权限, 大写T表示文件其他用户没有执行权限

范例

[root@centos7 /data ]# chmod 1777 /data/
[root@centos7 /data ]# ll -d /data/
drwxrwsrwt. 2 root admins 6 Apr 13 16:35 /data/
[root@centos7 /data ]# su xuan
[xuan@centos7 /data ]$ ll
total 0
-rw-r--r--. 1 root admins 0 Apr 13 20:08 file1.txt
-rw-rw-r--. 1 tom  admins 0 Apr 13 20:09 tom_file1.txt
-rw-rw-r--. 1 xuan admins 0 Apr 13 20:08 xuan_file1.txt
[xuan@centos7 /data ]$ rm -rf tom_file1.txt
rm: cannot remove ‘tom_file1.txt’: Operation not permitted

4.4.4 隐藏权限

设置文件的特殊隐藏属性,可以访问 root 用户误操作删除或修改文件目录

chattr设置特殊权限

chattr -R	递归处理目录下的所有文件
chattr -v	设置文件或目录版本
chattr -V	显示指令执行过程
chattr +	开启文件或目录的该项属性
chattr -	关闭文件或目录的该项属性
chattr =	指定文件或目录的该项属性

lsattr查看特殊权限

-a 	列出目录中的所有文件,包括隐藏文件
-d 	只显示目录名称
-R	递归地处理指定目录下的所有文件及子目录
-v 	显示文件或目录版本
-D	显示属性的名称、默认值
-E	显示从用户设备数据库中获得属性的当前值

隐藏权限模式

chattr +i 	root用户和所有用户不能删除,移动,重命名文件,修改文件内容
chatrr +a 	只能追加内容, 不能删除,移动,重命名文件

范例:查看目录隐藏权限,只能查看父目录,不能带星号

[root@centos7 /data ]# chattr +i dir1
[root@centos7 /data ]# lsattr *
[root@centos7 /data ]# lsattr
----i----------- ./dir1

4.5 访问控制列表

4.5.1 ACL功能

ACL:Access Control List,实现灵活的权限管理 除了文件的所有者,所属组和其它人,可以对更多的用户设置权限

CentOS7 默认创建的xfs和ext4文件系统具有ACL功能

CentOS7 之前版本,默认手工创建的ext4文件系统无ACL功能,需手动增加

查看ext4文件系统是否支持ACL权限
第一步: df -T 确认文件系统
第二步: tune2fs -l /dev/sda1  查看是否支持acl权限功能

centos7之前系统开启acl功能
tune2fs –o acl /dev/sdb1
mount –o acl /dev/sdb1 /mnt/test

ACL权限生效顺序: 所有者,自定义用户,所属组,自定义组,其他人

4.5.2 ACL相关操作

setfacl用于设置ACL权限

格式: setfacl -m 	[u / g]:user:[rwx] 文件
setfacl -m
设定 ACL 权限。如果是给予用户 ACL 权限,参数则使用 "u:用户名:权限" 的格式,
例如 setfacl -m u:st:rx /project 表示设定 st 用户对 project 目录具有 rx 权限

如果是给予组 ACL 权限,参数则使用 "g:组名:权限" 格式,
例如 setfacl -m g:tgroup:rx /project 表示设定群组 tgroup 对 project 目录具有 rx 权限。

setfacl -x
删除指定用户(参数使用 u:用户名)或群组(参数使用 g:群组名)的 ACL 权限,
例如 setfacl -x u:st /project 表示删除 st 用户对 project 目录的 ACL 权限。

setfacl -b
删除所有的 ACL 权限,例如 setfacl -b /project 表示删除有关 project 目录的所有 ACL 权限

setfacl -R
递归设定 ACL 权限,指设定的 ACL 权限会对目录下的所有子文件生效
命令格式为 "setfacl -m u:用户名:权限 -R 文件名"(群组使用 g:群组名:权限)
例如 setfacl -m u:st:rx -R /project 表示 st 用户对已存在于 project 目录中的子文件和子目录拥有 rx 权限。

===================================================================================================
setfacl -d 
对目录下创建新文件默认 ACL 权限,命令格式为 "setfacl -m d:u:用户名:权限 文件名"(如果是群组,则使用 d:g:群组名:权限)
只对目录生效,指目录中新建立的文件拥有此默认权限
例如 setfacl -m d:u:st:rx /project 表示 st 用户对 project 目录中新建立的文件拥有 rx 权限。

setfacl -k 
删除默认 ACL 权限

getfacl用于查看ACL权限

-a	显示文件的ACL
-d	显示默认的ACL
-c	不显示注释标题
-e	显示所有的有效权限
-E	显示没有的有效权限
-R	递归到子目录

范例

#设置文件acl权限
[root@centos7 /data ]# touch file1.txt
[root@centos7 /data ]# setfacl -m u:xuan:rw file1.txt
[root@centos7 /data ]# setfacl -m u:tom:5 file1.txt
[root@centos7 /data ]# ll file1.txt
-rw-rw-r--+ 1 root root 0 Apr 13 22:03 file1.txt 
#权限位后面多了一个"+",表示此文件拥有ACL权限

#查看文件acl权限
[root@centos7 /data ]# getfacl file1.txt
# file: file1.txt	文件名称
# owner: root		文件所属主用户
# group: root		文件所属组
user::rw-			文件所属主权限
user:tom:r-x		tom用户权限
user:xuan:rw-		xuan用户权限
group::r--			文件所属组权限
mask::rw-			mask权限
other::r--			文件其他用户权限

#删除tom用户ACL权限
setfacl -x u:xuan file1.txt

#对用户组设置ACL权限
setfacl -m g:admins:rwx file1.txt

#情空文件所有用户ACL权限
setfacl -b file1.txt

#复制file1的acl权限给file2
getfacl file1 | setfacl --set-file=-   file2  

范例:ACL权限从上到下生效顺序: 所有者,自定义用户,所属组,自定义组,其他人

[root@centos7 /data ]# setfacl -m u:xuan:rw file1.txt
[root@centos7 /data ]# setfacl -m g:admins:w file1.txt
[root@centos7 /data ]# gpasswd -a xuan -g admins
Adding user xuan to group admins
[root@centos7 /data ]# id xuan
uid=1007(xuan) gid=1007(xuan) groups=1007(xuan),1008(admins)

[root@centos7 /data ]# getfacl file1.txt
# file: file1.txt
# owner: root
# group: root
user::rw-
user:xuan:rw-
group::r--
group:admins:-w-
mask::rw-
other::r--
说明:ACL权限是从上到下生效, 比如:xuan用户对文件有rw权限, xuan用户属于admins用户组w权限, xuan用户最终对文件权限是rw

[xuan@centos7 /data ]$ echo "123">file1.txt
[xuan@centos7 /data ]$ cat file1.txt
123

4.5.3 mask权限

mask权限说明

一旦设置了ACL权限,就会产生一个mask权限代替group所属组权限,默认权限是rw
mask只影响除所有者和other的之外的人和组的最大权限
用户或组的设置ACL权限必须是小于或者等于mask权限,否则mask需要与用户的权限进行逻辑与运算后,才能变成有限的权限(Effective Permission)

范例

#1. 一旦设置了ACL权限,就会产生一个mask权限代替group所属组权限
[root@centos7 /data ]# setfacl  -b file1.txt
[root@centos7 /data ]# setfacl -m u:xuan:rw file1.txt
[root@centos7 /data ]# chmod g=rw file1.txt
[root@centos7 /data ]# getfacl file1.txt
# file: file1.txt
# owner: root
# group: root
user::rw-
user:xuan:rw-
group::r--			#此时group权限为无效权限位
mask::rw-
other::r--

#2. 一旦setfacl对其他用户设置权限大于mask权限,mask权限会自动抬高权限
[root@centos7 /data ]# setfacl -m g:admins:rwx file1.txt
[root@centos7 /data ]# getfacl file1.txt
# file: file1.txt
# owner: root
# group: root
user::rw-
user:xuan:rw-
group::r--
group:admins:rwx
mask::rwx
other::r--
[root@centos7 /data ]# ll file1.txt
-rw-rwxr--+ 1 root root 4 Apr 13 22:34 file1.txt

#3. 一旦修改了文件所属组权限,或者setfacl修改了mask权限; 除了文件属主用户权限和其他用户other权限不变以外,自定义用户和自定义组的ACL权限会被下降至mask相同权限
[root@centos7 /data ]# setfacl -m mask::r file1.txt
[root@centos7 /data ]# getfacl file1.txt
# file: file1.txt
# owner: root
# group: root
user::rw-
user:xuan:rw-			#effective:r--
group::r--
group:admins:rwx		#effective:r--
mask::r--
other::r--

4.5.4 ACL备份还原

主要的文件操作命令cp和mv都支持ACL,只是cp命令需要加上-p 参数。但是tar等常见的备份工具是不会保留目录和文件的ACL信息

#备份ACL
getfacl -R /tmp/dir > acl.txt
#消除ACL权限
setfacl -R -b /tmp/dir
#还原ACL权限,注意按照文件最后一个ACL权限进行还原
setfacl -R  --set-file=acl.txt /tmp/dir
#还原ACL权限
setfacl --restore acl.txt
#查看ACL权限
getfacl -R /tmp/dir