用户、组、文件权限
1~3 重点
- 若对某个用户的所属组进行修改,
相应权限变化不会立即生效,需要重新登录来更新自己的token!!! - 对某个文件的某一项权限修改,是立即生效的
1 Linux安全模型
资源分派:
- Authentication:认证,验证用户身份
- Authorization:授权,不同的用户设置不同权限
- Accouting | Audition:审计
当用户登录时,系统会自动分配令牌token,包括用户标识和组成员等信息
1.1 用户 user
Linux中每个用户是通过User Id (UID)来唯一标识的
[root@CentOS8 ~]#id -u #查看当前用户UID
0
[root@CentOS8 ~]#id -u jacklee #查看指定用户UID
1000
- 管理员:root, UID=0
- 普通用户:1-60000 自动分配
- 系统用户:对进程获取资源进行权限分配
1-499 (CentOS 6以前), 1-999 (CentOS7以后) - 登录用户:给用户进行交互式登录使用
500+ (CentOS6以前), 1000+(CentOS7以后)
- 系统用户:对进程获取资源进行权限分配
1.2 用户组 group
Linux中可以将一个或多个用户加入用户组中,用户组是通过Group ID(GID) 来唯一标识的
GID与UID可使用相同的数字,是相互独立的部分(各自使用各自的1~999)
- 管理员组:root, 0
- 普通组:
- 系统组:对进程获取资源进行权限分配
1-499 (CentOS 6以前), 1-999 (CentOS7以后) - 登录组:给用户进行交互式登录使用
500+ (CentOS6以前), 1000+(CentOS7以后)
- 系统组:对进程获取资源进行权限分配
1.3 用户和组的关系
- 用户的主要组(primary group):用户必须属于一个且只有一个主组
- 默认创建用户时会自动创建和用户名同名的组,做为用户的主要组
- 组中只有一个用户,称为私有组
- 用户的附加组(supplementary group): 一个用户可以属于零个或多个辅助组
组的存在是为了进行多个用户批量授权,提高效率
范例:查看指定ID的用户和组信息
[root@CentOS8 ~]#id jacklee
uid=1000(jacklee) gid=1000(jacklee) groups=1000(jacklee)
1.4 安全上下文
运行中的程序称之为进程 (process)
进程能够访问资源的权限取决于进程的 运行者的身份,与进程本身无关!!!
范例:root能访问/etc/shadow ,而用户jacklee不行
[root@CentOS8 ~]#cat /etc/shadow
root:$6$ogqukkz6XDmQP2c3$lYEMf.Fuf5sXr8Y4G4Upzc/ii6n2WszGq5Yfz6ImMbLY1QPY04a2JzyqVBYk9w4z5h/tSYxb3ymON0fYQbHlY1::0:99999:7:::
bin:*:18027:0:99999:7:::
daemon:*:18027:0:99999:7:::
adm:*:18027:0:99999:7:::
[jacklee@CentOS8 ~]$cat /etc/shadow
cat: /etc/shadow: Permission denied
2 配置文件
2.1 用户和组的主要配置文件
- /etc/passwd: 用户及其属性信息(名称、UID、主组ID等)
- /etc/shadow: 用户密码及其相关属性
- /etc/group: 组及其属性信息
- /etc/gshadow:组密码及其相关属性
查看上述文件,除了cat命令,还可使用getent更为方便!直接 getent + basename
[root@CentOS8/~]# getent passwd #不需要写路径
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
......
#也可以指定用户查看
[root@CentOS8/~]# getent shadow jacklee
jacklee:$6$ByWgJCxL2f/Afybr$wuxHkxi04SjJmsbQAGyO82K537ZR9vv/LwRjKMKC1lkyrmBEH/OHiuHbU8UcdUdmfgc4LcTpeO/DWNuJ07ncl1:18475:0:99999:7:::
2.2 passwd文件格式
用户名 | 密码 | UID | GID | 描述信息 | 家目录 | 默认shell |
---|---|---|---|---|---|---|
root | x(表示隐藏) | 0 | 0 | root | /root | bash |
在不理解格式的情况下,应该主动使用帮助功能,对于passwd操作如下:
[root@CENTOS7 ~]#whatis passwd
sslpasswd (1ssl) - compute password hashes
passwd (1) - update user's authentication tokens
passwd (5) - password file
#此时是为了查看文件,应该查看第五章内容!
[root@CENTOS7 ~]#man 5 passwd #进入文件后使用page翻页!
Each line of the file describes a single user, and contains
seven colon-separated fields:
name:password:UID:GID:GECOS:directory:shell #七个项目的含义,用:号隔开
用户名:密码:UID:GID:描述信息:家目录:默认shell
实际操作查看:
[root@CentOS8 ~]#cat /etc/passwd
最后一行:jacklee:x:1000:1000:jacklee:/home/jacklee:/bin/bash
注意:
- 密码位置的字符 x 是为了兼容性留下的占位符,表示密码文件不在此处
(实际存放在 /etc/shadow文件) - shell类型为nologin表示此用户不需要登录,开机自启,用于程序的相关服务
- 在/etc/passwd文件中修改对应信息,即可实现对应功能,但一般不直接修改文本
2.3 shadow文件格式
shadow存放密码与其策略,因此只有root用户有权限查看!!!
[jacklee@CentOS8 ~]$cat /etc/shadow
cat: /etc/shadow: Permission denied #无权限
同理,可使用 man 5 shadow查看格式
[root@CentOS8 ~]#cat /etc/shadow
root:$6$ogqukkz6XDmQP2c3$lYEMf.Fuf5sXr8Y4G4Upzc/ii6n2WszGq5Yfz6ImMbLY1QPY04a2JzyqVBYk9w4z5h/tSYxb3ymON0fYQbHlY1::0:99999:7:::
bin:*:18027:0:99999:7:::
...
jacklee:$6$QlCPFppDpXzzYYRB$Zot.igaBz4y8VWcAOKVjEfo54fnvC9GKd2DwmxOTXFCES5UU0zolUzUduI/607qQW6iLV04QFjxheuva/3lyd0:18449:0:99999:7:::
#其中jacklee的 salt 为 QlCPFppDpXzzYYRB
所有信息依次表示:
- 登录名
- 密码:字符 ! ! 表示密码锁定;字符 * 表示兼容占位符,即无密码(多为系统用户)
一长串乱码表示密码使用了 SHA512 加密,标志是以 和第3个$之间的字符) - 上次改密码的时间:从1970年1月1日起 到密码最近一次被更改的时间(天)
设置为0,下次登录必须修改(chage -d 0) - 最短有效期:密码再过几天可以被变更(0表示随时可被变更)
- 最长有效期:密码再过几天必须被变更(99999表示永不过期)
- 密码过期前几天系统提醒用户(默认为一周)
- 宽限期:密码过期几天后帐号会被锁定!!!
- 从1970年1月1日算起,多少天后帐号失效(不填写此项,表示永久)
用户名 | 密码 | 上次修改 | 最短期限 | 最长期限 | 提前提醒 | 宽限期 | 有效期 |
---|---|---|---|---|---|---|---|
jacklee | sha512加密 | 18449天 | 0=随时可改 | 99999=不过期 | 7天 | 99999天 | 永久 |
#直接查看指定用户的密码策略
[root@CentOS8/~]# chage -l jacklee
Last password change : Aug 01, 2020
Password expires : never
Password inactive : never
Account expires : never
Minimum number of days between password change : 0
Maximum number of days between password change : 99999
Number of days of warning before password expires : 7
#修改密码策略:
[root@CentOS8/~]# chage jacklee
Changing the aging information for jacklee
Enter the new value, or press ENTER for the default
Minimum Password Age [0]: #按格式依次输入设置值即可
注意:新建用户都无密码,默认使用 !! 锁定
-
shadow文件中密码处的字符 ! ! 表示密码锁定(如Ubuntu的root)
普通用户:将 !! 删除后直接保存,则为空口令,可直接登录
nologin用户:删除 ! 也不能登录,因为本身就不需要登录shadow中字符 * 与passwd中的 x 一样,为兼容而留下的占位符
普通用户即使有密码,root也可以直接删除加密字符,成为空口令
为了允许Ubuntu远程ssh登录,需要修改/etc/ssh/sshd_config文件
将#PermitRootLogin prohibit-password修改为 PermitRootLogin yes-
快速生成一个12位随机密码
[root@CentOS8/~]# tr -dc '[:alnum:]' < /dev/urandom | head -c 12 iQpKEMfMP1BZ [root@CentOS8/~]# openssl rand -base64 12 (可能带符号) Bf2goiJ9p7gfEWar
-
快速查看今天距离1970-1-1的天数:
echo `date +%s`/86400 | bc
2.4 group文件格式
[root@CentOS8 ~]#cat /etc/group
root:x:0:
bin:x:1:
jacklee:x:1000:
......
组名 | 组密码 | GID | 以当前组为 附加组的 用户列表 |
---|---|---|---|
root | x | 0 |
组密码存在的意义:
- 管理员添加组员,相当于赋予权限,需要验证密码
- 用户主动加入组,验证密码通过即可
注意:
- 若有多个组员,使用逗号分隔
- 同理,x 表示密码储存在其他文件(gshadow)
2.5 gshadow文件格式
[root@CentOS8 ~]#cat /etc/gshadow
root:::
bin:::
jacklee:!::
组名 | 组密码 | 管理员列表 | 以当前组为附加组的用户列表 |
---|---|---|---|
jacklee | !锁定 | 无 | 无 |
注意:
- 空密码表示没有密码,因此普通用户不能自己加入
- 无管理员,则默认管理员为root
- 同理,!表示锁定
2.6 文件操作
-
getent直接查看文件,也可指定用户查看
getent passwd getent shadow jacklee
vipw和vigr(vi + 文件名:编辑文件内容)
-
pwck和grpck(文件名+check:具有检查语法错误的功能)
[root@CentOS8 ~]#pwck 检查passwd文件的语法错误 user 'pulse': directory '/var/run/pulse' does not exist user 'gluster': directory '/run/gluster' does not exist user 'saslauth': directory '/run/saslauthd' does not exist user 'clevis': directory '/var/cache/clevis' does not exist user 'pipewire': directory '/var/run/pipewire' does not exist user 'gnome-initial-setup': directory '/run/gnome-initial-setup/' does not exist pwck: no changes
3 用户与组的管理
用户 | 组 | |
---|---|---|
新建 | useradd | groupadd |
修改属性 | usermod | groupmod |
修改密码 | passwd | gpasswd |
修改密码策略 | chage | — |
删除 | userdel | groupdel |
查看用户的属组 | id user_name | groups user_name |
管理组员 | — | gpasswd 或 groupmems |
3.0 重点&易错点
-
要求下次登录必须修改密码
passwd -e jack chage -d 0 jack
3.1 用户创建@@@
useradd 命令可以创建新的Linux用户
useradd [options] NEWUSER
-r 创建系统用户 CentOS 6之前: ID<500,CentOS 7以后: ID<1000
-u UID(指定想要的UID,不可重复)
-o 不检查UID唯一性 '因此 -uo 相当于对用户创建硬链接!!!一个UID两个name
-g GID 指明用户所属基本组,'输入时可指定组名或GID
-s SHELL 指明用户的默认shell程序,可用列表在/etc/shells文件中
'在Ubuntu中创建新用户默认使用sh而不是bash(可修改配置)
-d DIR 以指定的路径为家目录 '必须是不存在的目录
-m 指定UID小于1000时,加上 -m 可将其视为普通用户,并创建家目录
-c COMMENT 用户的注释信息
-p 指定密码 '要求输入的内容为加密后的结果!!!
典型应用:
- 创建指定信息用户
useradd -r -u 48 -g apache -s /sbin/nologin -d /var/www -c "Apache" apache
#创建一个系统用户,UID=48,属于主组apache,shell类型nologin,指定家目录为/var/www,注释信息为Apache,用户名为apache
-
批量创建用户
newuser passwd 格式文件
-
批量修改密码(一键修改密码)
echo username:passwd | chpasswd
注意
- 普通用户默认会创建家目录,系统用户无家目录
-
各个系统生成加密密码的方式
-
Centos8 生成sha512加密密码
#选项-6表示SHA512加密算法,centos8特有 [root@CentOS8/~]# openssl passwd -6 mimamima $6$nPam4qhiviJsajFj$VPu0EHBZ4kVc1rJNyRWkg76aZUwPrkcXHDX3v7RebfKMVPD6Pw3j5dSHKPyj9azStLuKbTeG4inmVV3mTlCpc1
-
Centos7 使用Python 生成sha512加密密码
python -c 'import crypt,getpass;pw="jacklee";print(crypt.crypt(pw))' [root@CentOS7/~]# python -c 'import crypt,getpass;pw="jacklee";print(crypt.crypt(pw))' $6$X3QI12Kgouk0r.VN$yTQDu9kxetQ3H1X2W8paI.4TnpIGN2YorprSub3XLAKWEaA0UGZ/iA0zPRN2X6kXIpXwl50SUFFJGN.JgBc4r1
-
Centos6 生成sha512加密密码
[root@CentOS6/~]# grub-crypt --sha-512 Password: #需要手动输入 Retype password: $6$bQkDf7TFR/YkAfRD$XfxboLIuWxcauEwuLKGOCe4FiN4952XzbBciKXq0.sBPXIfuB0ejTKVpIP3viVma8dbDOCIhA4O7pZO2zWQSh0 #使用加密结果创建新用户,名为jacky [root@CentOS6/~]# useradd -p '$6$bQkDf7TFR/YkAfRD$XfxboLIuWxcauEwuLKGOCe4FiN4952XzbBciKXq0.sBPXIfuB0ejTKVpIP3viVma8dbDOCIhA4O7pZO2zWQSh0' jacky [root@CentOS6/~]# id jacky uid=500(jacky) gid=500(jacky) groups=500(jacky)
-
-
useradd命令的默认设置,在文件/etc/defalut/useradd
#使用useradd -D可查看当前设置 [root@CentOS8/~]# useradd -D GROUP=100 系统默认组users的GID HOME=/home 默认家目录 INACTIVE=-1 密码过期的宽限期 EXPIRE= 账户有效期(从1970开始算) SHELL=/bin/bash 默认shell类型 SKEL=/etc/skel/ 新用户的家目录中'默认创建的文件的模板 CREATE_MAIL_SPOOL=yes 是否创建邮箱 #编辑默认设置 useradd -D 显示默认设置 useradd -D -s shell 修改默认值 useradd -D -b 家目录 修改默认值 useradd -D -g group 修改默认值
-
adduser命令在centos中与useradd等效,在Ubuntu中有所不同
[root@CentOS8 ~]#which adduser /usr/sbin/adduser [root@CentOS8 ~]#which useradd /usr/sbin/useradd [root@CentOS8 ~]#ll /usr/sbin/adduser lrwxrwxrwx. 1 root root 7 May 11 2019 /usr/sbin/adduser -> useradd
3.2 用户属性修改(少用)
usermod 命令可以修改用户属性
usermod [OPTION] user
-u UID: 新UID
-l login_name: '设置新的名字
-g GID: 新GID或新组名
-G GROUP1[,GROUP2,...[,GROUPN]]]:
设置新的附加组,原来的附加组将会被覆盖;
若想保留原有的附加组,则要同时使用 -a选项
-s 新的默认SHELL
-c 新的注释信息
-d newdir 修改家目录为newdir
新指定的家目录不会自动创建,若要'创建新家目录并移动原家数据,同时使用-m选项
-L lock指定一个用户,在/etc/shadow 密码栏的增加 ! '表示进行锁定,禁止登录
-U unlock指定一个用户,将 /etc/shadow 密码栏的!拿掉,'表示解锁
若提示禁止解锁,同时 -p 设置新密码即可
-e YYYY-MM-DD: 指明用户账号过期日期
-f INACTIVE: 设定非活动期限
3.3 删除用户
userdel 可删除Linux 用户
userdel [OPTION]... user
-f, --force 强制删除
-r, --remove 删除用户家目录和邮箱
注意:若不加选项直接删除,无法删除用户的配置文件
3.4 查看用户相关的ID信息
id [OPTION]... [USER]
-u: 显示UID
-g: 显示GID
-G: 显示用户的所属组的ID(主+附加)
-n: 显示名称'需配合ugG使用
[root@CentOS8/~]# id
uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[root@CentOS8/~]# id -u
0
[root@CentOS8/~]# id -u jacklee
1000
[root@CentOS8/~]# id jacky
uid=1001(jacky) gid=1001(jacky) groups=1001(jacky)
3.5 切换用户@@@
su: 即switch user
可以切换用户身份
切换用户的两种方式:
- su UserName:非登录式切换,即不会读取目标用户的配置文件,不改变当前工作目录
- su - UserName:登录式切换,会读取目标用户的配置文件,切换至家目录,完全切换
说明:
- root 切换至其他用户无须密码;其他用户切换时需要密码
- 使用 su 切换之后,exit 返回原用户,避免重复 su 导致bash子进程环境混乱
以指定用户的身份执行命令
普通用户想要执行高级命令:
su [-] UserName -c 'COMMAND'
#用户jacklee查看shadow文件
[jacklee@CentOS8 ~]$su - root -c "getent shadow"
Password: #需要输入密码
root:$6$zPRAwzA.VZmVBIZ0$z5mVDGTn7jdDUBUINVr2at9kI45e9ScHQGaLjPqIFKnOVEv51Fq6feVhrJH33MEz/.m/XXvk/o6ro0kj22Jva1::0:99999:7:::
bin:*:18027:0:99999:7:::
daemon:*:18027:0:99999:7:::
adm:*:18027:0:99999:7:::
......
禁止普通用户登录
su -s /sbin/nologin user
3.6 设置用户密码@@@
新建用户useradd命令默认不设置密码
passwd 可以修改用户密码
passwd [OPTIONS] UserName
-d 删除指定用户密码
-l 锁定指定用户
-u 解锁
-e 强制用户下次登录修改密码!!!!!!!!!!!同 chage -d 0 jack
-f 强制操作
-n 指定最短使用期限
-x 指定最长使用期限
-w 指定提醒期限
--stdin:从标准输入接收用户密码,'ubuntu没有此选项
对密码策略各种时间期限的图解:
- passwd expiration date —— 密码到期日期
- inactive days —— 到期后的宽限期
- inactive dte —— 密码失效日期
常用功能:一键修改密码
#适用各种Linux版本:
[root@CentOS8/~]# echo -e '123456\n123456' | passwd jacky
Changing password for user jacky.
New password: BAD PASSWORD: The password is shorter than 8 characters
Retype new password: passwd: all authentication tokens updated successfully.
#适用红帽系列:
[root@CentOS8/~]# echo 'jacklee' | passwd --stdin jacky
Changing password for user jacky.
passwd: all authentication tokens updated successfully.
3.7 修改密码策略
chage 可以修改用户密码策略
chage [OPTION]... LOGIN
选项:
-l 显示密码策略
-d LAST_DAY -d 0 表示下次登录必须修改密码
-m --mindays MIN_DAYS
-M --maxdays MAX_DAYS
-W --warndays WARN_DAYS
-I --inactive INACTIVE 密码过期后的宽限期
-E --expiredate EXPIRE_DATE 用户的有效期
范例:
[root@CentOS8 ~]#chage -m 3 -M 42 -W 14 -I 7 -E 2020-10-10 jacklee
#将用户jacklee的密码策略进行重新定义
[root@CentOS8 ~]#chage -l jacklee
Last password change : Jul 06, 2020
Password expires : Aug 17, 2020
Password inactive : Aug 24, 2020
Account expires : Oct 10, 2020
Minimum number of days between password change : 3
Maximum number of days between password change : 42
Number of days of warning before password expires : 14
[root@CentOS8 ~]#getent shadow jacklee
jacklee:$6$QlCPFppDpXzzYYRB$Zot.igaBz4y8VWcAOKVjEfo54fnvC9GKd2DwmxOTXFCES5UU0zolUzUduI/607qQW6iLV04QFjxheuva/3lyd0:18449:3:42:14:7:18545:
#下一次登录强制重设密码
[root@CentOS8 ~]#chage -d 0 jacklee
[root@CentOS8 ~]#getent shadow jacklee
jacklee:$6$QlCPFppDpXzzYYRB$Zot.igaBz4y8VWcAOKVjEfo54fnvC9GKd2DwmxOTXFCES5UU0zolUzUduI/607qQW6iLV04QFjxheuva/3lyd0:0:3:42:14:7:18545:
[root@CentOS8 ~]#chage -l jacklee
Last password change : password must be changed
Password expires : password must be changed
Password inactive : password must be changed
Account expires : Oct 10, 2020
Minimum number of days between password change : 3
Maximum number of days between password change : 42
Number of days of warning before password expires : 14
3.8 用户相关的其它命令
- chfn 指定个人信息
- chsh 指定shell( 等于命令usermod -s )
- finger 可看用户个人信息
[root@CentOS8 ~]#chfn jacklee #手动输入相关信息
Changing finger information for jacklee.
Name [jacklee]: abb #将会在开机界面显示!!!!!!!
Office []: bba
Office Phone []: 110
Home Phone []: 120
Finger information changed.
[root@CentOS8 ~]#chsh -s /bin/sh jacklee
Changing shell for jacklee.
Shell changed.
[root@CentOS8 ~]#getent passwd jacklee
jacklee:x:1000:1000:abb,bba,110,120,:/home/jacklee:/bin/sh
注意:若修改普通用户的shell类型为nologin,将导致用户无法登录
3.9 管理组
组没有"管理员组"的说法,root组就是一个名为root的普通组
3.9.1 创建组
groupadd实现创建组
groupadd [OPTION]... group_name
-g GID 指明GID号;[GID_MIN, GID_MAX]
-r 创建系统组,CentOS 6之前: ID<500,CentOS 7以后: ID<1000
用法:
groupadd -g 48 -r apache
#表示创建组名为apache、GID为48的系统组
3.9.2 修改组
groupmod [OPTION]... group
-n group_name: 新名字
-g GID: 新的GID
3.9.3 删除组
groupdel [options] GROUP #此操作只能删除空组
-f, --force 强制删除,即使是用户的主组也强制删除组
[root@CentOS8/~]# id jacky
uid=1001(jacky) gid=1001(jacky) groups=1001(jacky)
[root@CentOS8/~]# groupdel -f jacky
[root@CentOS8/~]# id jacky
uid=1001(jacky) gid=1001 groups=1001
3.9.4 管理组成员
-
gpasswd命令
-
可修改组密码
gpasswd GROUP [root@CentOS8/~]# gpasswd jacklee Changing the password for group jacklee New Password: #手动输入密码 Re-enter new password:
-
修改组的成员关系
gpasswd [OPTION] GROUP 常见选项: -a user 将user添加至指定组中 -d user 从指定组中移除用户user -A user1,user2,... 批量设置管理员 [root@CentOS8/~]# id jacky uid=1001(jacky) gid=1003(jacky) groups=1003(jacky) [root@CentOS8/~]# gpasswd -a jacky admin Adding user jacky to group admin [root@CentOS8/~]# id jacky uid=1001(jacky) gid=1003(jacky) groups=1003(jacky),1002(admin) [root@CentOS8/~]# groups jacky jacky : jacky admin [root@CentOS8/~]# getent group admin admin:x:1002:jacky [root@CentOS8/~]# gpasswd -d jacky admin Removing user jacky from group admin [root@CentOS8/~]# groups jacky jacky : jacky [root@CentOS8/~]# id jacky uid=1001(jacky) gid=1003(jacky) groups=1003(jacky) [root@CentOS8/~]# getent group admin admin:x:1002:
-
-
groupmems命令可以显示、管理组成员关系(格式与gpasswd不同: -g group)
groupmems [options] [action] -g groupname 更改为指定组 (只有root可用) -a 指定用户加入组 格式:groupmems -a user -g group -d 从组中删除用户 格式:groupmems -d user -g group -p 从组中清除所有成员 -l 显示组成员列表
-
groups命令 可查看用户的属组
#查看用户所属组列表 groups [USERNAME]... [root@CentOS8/~]# groupmems -a jacky -g root [root@CentOS8/~]# groups jacky jacky : jacky root [root@CentOS8/~]# id jacky uid=1001(jacky) gid=1003(jacky) groups=1003(jacky),0(root)
3.9.5 临时切换主组
newgrp命令可以临时切换主组, 如果用户本不属于此组,则需要组密码
newgrp [-] [group]
如果使用 - 选项,可以初始化用户环境
如果用户不属于此组,则需要组密码
4 文件权限管理
4.0 重点
讨论文件权限的前提,必须指明是对哪个或哪一类用户的权限
讨论文件权限的前提,必须指明是对哪个或哪一类用户的权限
讨论文件权限的前提,必须指明是对哪个或哪一类用户的权限
4.1 所有者和所属组
4.1.1 设置文件的所有者chown@@@
chown 命令可以修改文件的属主,也可以修改文件所属组
chown [OPTION]... [OWNER][:[GROUP]] FILE... #冒号也可用 . 替换
chown [OPTION]... --reference=RFILE FILE...
用法说明:
OWNER 只修改所有者
OWNER:GROUP 同时修改所有者和属组
:GROUP 只修改属组
-R: 递归
--reference=RFILE 参考指定的的属性,来修改
[root@CentOS8 data]#cp /etc/fstab f1.txt
[root@CentOS8 data]#ll
total 4
-rw-r--r-- 1 root root 709 Jul 8 16:08 f1.txt
[root@CentOS8 data]#chown jacklee f1.txt
[root@CentOS8 data]#ll
total 4
-rw-r--r-- 1 jacklee root 709 Jul 8 16:08 f1.txt
[root@CentOS8 data]#chown :jacklee f1.txt
[root@CentOS8 data]#ll
total 4
-rw-r--r-- 1 jacklee jacklee 709 Jul 8 16:08 f1.txt
[root@CentOS8 data]#chown root:bin f1.txt
[root@CentOS8 data]#ll
total 4
-rw-r--r-- 1 root bin 709 Jul 8 16:08 f1.txt
[root@CentOS8 data]#chown jacklee.root f1.txt #用.代替:
[root@CentOS8 data]#ll
total 4
-rw-r--r-- 1 jacklee root 709 Jul 8 16:08 f1.txt
[root@CentOS8 data]#touch f2.txt
[root@CentOS8 data]#ll
total 4
-rw-r--r-- 1 jacklee bin 709 Jul 8 16:08 f1.txt
-rw-r--r-- 1 root root 0 Jul 8 16:12 f2.txt
[root@CentOS8 data]#chown --reference=f1.txt f2.txt
[root@CentOS8 data]#ll
total 4
-rw-r--r-- 1 jacklee bin 709 Jul 8 16:08 f1.txt
-rw-r--r-- 1 jacklee bin 0 Jul 8 16:12 f2.txt
4.1.2 设置文件的属组信息 chgrp
chgrp [OPTION]... GROUP FILE...
chgrp [OPTION]... --reference=RFILE FILE...
-R 递归
此命令也可由 chown :GROUP完成
4.2 文件权限@@@
4.2.0 重要原则
讨论文件权限的前提,必须指明是对哪个或哪一类用户的权限
讨论文件权限的前提,必须指明是对哪个或哪一类用户的权限
讨论文件权限的前提,必须指明是对哪个或哪一类用户的权限
并不是每个文件系统都支持设置权限
例如,Linux也支持FAT文件系统,但是此系统不能设置权限
4.2.1 文件权限说明
- 文件的权限主要针对三类对象进行定义(ACL权限设置第四类)
owner 属主, u
group 属组, g
other 其他, o
用户的最终权限,根据ugo的顺序从左往右进行匹配!一旦匹配到,权限立即生效 - 每个文件针对每类访问者都定义了三种权限
r Readable
w Writable
x eXcutable
对root来说,只有 x 权限可能会受到限制!!!!!!!!!!!!
- 对文件的权限的意义(能否删除文件是由文件夹权限决定的)
- 读 r ——能访问文件
- 写 w ——能修改文件内容
- 执行 x ——能运行此程序
- 对目录的权限的意义(一般情况下目录同时给 r-x )
- 读 r ——可以在外面使用ls查看此目录中文件列表
- 写 w——可在此目录新建或删除文件
与 被删除的文件具有什么权限 无关!!! - 执行 x——可cd进入此目录(最小权限)
- 特别 X——递归设置时只给目录x权限,避开文件
other对目录的权限: | r - - | - - x | r - x |
---|---|---|---|
不在目录中 ls | 可看到文件列表 | Permission denied | 可 |
不在目录中 ll | 可看到文件列表 | Permission denied | 可 |
能否 cd 进入目录 | Permission denied | 能进入 | 可 |
cd 进入目录中 ls | —— | Permission denied | 可 |
已知文件名能否查看文件 | Permission denied | 可查看文件属性及内容 | 可 |
[jacklee@centos8/~]$ ll -d /data/
drwxr-xr--. 3 root root 45 Aug 2 20:26 /data/ o=r的情况(ls成功,cd失败)
[jacklee@centos8/~]$ ls /data/
ls: cannot access '/data/f1.txt': Permission denied
ls: cannot access '/data/f2.txt': Permission denied
ls: cannot access '/data/dir': Permission denied
dir f1.txt f2.txt
[jacklee@centos8/~]$ cd /data/
-bash: cd: /data/: Permission denied
[jacklee@centos8/~]$ ll -d /data/
drwxr-x--x. 3 root root 45 Aug 2 20:26 /data/ o=x的情况(ls失败,cd成功)
[jacklee@centos8/~]$ ls /data/
ls: cannot open directory '/data/': Permission denied
[jacklee@centos8/~]$ cd /data/
[jacklee@centos8/data]$ ls
ls: cannot open directory '.': Permission denied
权限还可用数字代替字母表示
因此总共存在8种不同的权限搭配方式:
--- | --x | -w- | -wx | r-- | r-x | rw- | rwx |
---|---|---|---|---|---|---|---|
000 | 001 | 010 | 011 | 100 | 101 | 110 | 111 |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
范例 :
- 640 rw- r-- ---
- 755 rwx r-x r-x
4.2.2 修改文件权限 chmod
格式:
chmod who opt mod file
who= u,g,o,a
opt= +,-,= '修改某个权限使用 +,- 修改全部权限使用 =
mod= r,w,x
-R 递归修改权限(用于多级目录)
#参考RFILE文件的权限,将FILE的修改为与RFILE一致
chmod opt --reference=RFILE FILE...
#清空所有类型用户权限
chmod a= file或/dir
使用格式举例:
chmod u+wx,g-r,o=rx file
chmod -R g+rwX /dir
chmod 644 file
实操范例:
[root@CentOS8 data]#ll
total 4
-rw-r--r-- 1 root root 709 Jul 8 16:08 f1.txt
-rw-r--r-- 1 root root 0 Jul 8 16:12 f2.txt
[root@CentOS8 data]#chmod u-w,g+w,o-r f1.txt
[root@CentOS8 data]#ll
total 4
-r--rw---- 1 root root 709 Jul 8 16:08 f1.txt #对应权限已修改
-rw-r--r-- 1 root root 0 Jul 8 16:12 f2.txt
[root@CentOS8 data]#chmod u=rwx,g=rw f2.txt
[root@CentOS8 data]#ll
total 4
-r--rw---- 1 root root 709 Jul 8 16:08 f1.txt
-rwxrw-r-- 1 root root 0 Jul 8 16:12 f2.txt #对应权限已修改(有x权限变绿)
[root@CentOS8 data]#chmod 666 f1.txt #直接输入八进制权限
[root@CentOS8 data]#ll
total 4
-rw-rw-rw- 1 root root 709 Jul 8 16:08 f1.txt #对应权限已修改为666
-rwxrw-r-- 1 root root 0 Jul 8 16:12 f2.txt
子目录权限递归范例:
[root@CentOS8 data]# ll
total 0
drwxr-xr-x 3 root root 16 Jul 8 19:40 a1 #原始属性
[root@CentOS8 data]# ll a1
total 0
drwxr-xr-x 3 root root 16 Jul 8 19:40 a2 #a2的原始属性
[root@CentOS8 data]# ll a1/a2
total 0
drwxr-xr-x 2 root root 6 Jul 8 19:40 a3 #a3的原始属性
[root@CentOS8 data]# chmod a-x a1 #不使用递归
[root@CentOS8 data]# ll
total 0
drw-r--r-- 3 root root 16 Jul 8 19:40 a1 #a1属性修改成功
[root@CentOS8 data]# ll a1
total 0
drwxr-xr-x 3 root root 16 Jul 8 19:40 a2 #a2无变化
[root@CentOS8 data]# ll a1/a2
total 0
drwxr-xr-x 2 root root 6 Jul 8 19:40 a3 #a3无变化
[root@CentOS8 data]# chmod -R a-x a1 #使用递归
[root@CentOS8 data]# ll a1
total 0
drw-r--r-- 3 root root 16 Jul 8 19:40 a2 #a2修改成功
[root@CentOS8 data]# ll a1/a2
total 0
drw-r--r-- 2 root root 6 Jul 8 19:40 a3 #a3修改成功
4.2.3 新建文件和目录的默认权限
umask的值可以用来设置创建新文件的权限
- 新建文件的默认权限为 666-umask的计算结果
- root默认umask=022,新建文件权限为644=rw-r--r--
- 普通用户默认umask=002,新建文件权限为664=rw-rw-r--
- 当umask被修改时,所得结果有可能出现奇数(表示文件有执行权限),
此时应将其权限+1(消除x权限),防止执行病毒**;若为偶数则不变
- 新建目录的默认权限为 777-umask的计算结果(目录的执行权限不存在风险)
- root新建目录的权限为755
- 普通用户新建目录的权限为775
临时修改 uamsk
umask # (#即为想要的设置)
持久保存umask,应该修改配置文件
- 全局设置: /etc/bashrc
- 用户设置:~/.bashrc
为了更直观显示出umask的数值表达的意思,可使用 -S 选项
[root@CentOS8 data]#umask
0022
[root@CentOS8 data]#umask -S
u=rwx,g=rx,o=rx
#此即为当前的默认设置
4.4 Linux文件系统上的特殊权限
- 三种常见的权限:r, w, x
- 三种特殊权限:SUID, SGID, Sticky
权限名称 | SUID | SGID | Sticky |
---|---|---|---|
功能说明 | 继承所有者权限 | 继承所属组权限 | 防止外人删除文件 |
适用范围 | 只对bin文件设置 | 文件和目录 | 只对目录设置 |
添加权限的操作 | u+s 或 4xxx | g+s 或 2xxx | o+t 或 1xxx |
删除权限的操作 | u-s | g-s | o-t |
添加权限之后的显示 | rwS 或 rws | rwS 或 rws | r - T 或 r - t |
特别说明 | 设置在目录用于协作 |
关于添加权限之后的显示:rwS表示没有 x 权限 ,rws 表示 rwxs 权限全部都有
删除权限的操作:也可以 chmod xxx file/dir 直接覆盖
4.4.1 特殊权限SUID—继承own
SUID只对二进制可执行程序有效,设置在目录上无意义
设置此权限的前提:进程有属主和属组;文件有属主和属组
chmod u+s FILE...
chmod 4xxx FILE
chmod u-s FILE...
SUID权限的功能(u+s): 任何用户运行此程序,都可继承 ‘ 此程序的所有者 ’ 的权限
#若给nano设置 s 权限,则nano可修改任意文件,因为nano的所有者为root,任意用户运行都相当于root
[root@CentOS8 ~]# ll /bin/nano
-rwxr-xr-x. 1 root root 260848 May 11 2019 /bin/nano(绿色,表示可执行)
[root@CentOS8 ~]# chmod u+s /bin/nano
[root@CentOS8 ~]# ll /bin/nano
-rwsr-xr-x. 1 root root 260848 May 11 2019 /bin/nano(红色,表示危险权限)
[root@CentOS8 ~]# chmod u-s /bin/nano # u-s取消
执行程序的基本原则:
任何一个可执行程序文件能不能启动为进程,取决于 发起者对程序文件是否拥有执行权限
即:程序能否执行,与程序文件本身无关,与谁来运行相关
- 启动为进程之后,其进程的属主为原程序文件的属主,属组为原程序文件的属组
- 同时,进程访问文件时的权限,取决于进程的发起者
#普通用户不能访问/etc/shadow文件的原因
[root@CentOS8 data]# su jacklee
[jacklee@CentOS8 data]$ cat /etc/shadow
cat: /etc/shadow: Permission denied
[jacklee@CentOS8 data]$ ll /etc/shadow
----------. 1 root root 1423 Jul 7 18:13 /etc/shadow #没有给出任何权限
[root@CentOS8 ~]# ll /bin/cat
-rwxr-xr-x. 1 root root 51856 May 12 2019 /bin/cat #而cat程序本身权限无问题
4.4.2 特殊权限SGID—继承grp
即可对文件设置,也可对目录设置
- 对二进制文件:(g+s)表示任何人运行此程序,都可继承 ‘ 此程序的所属组 ’ 的权限
chmod g+s FILE...
chmod 2xxx FILE
chmod g-s FILE...
- 与SUID不同,目录上的SGID权限功能(使新建文件属组继承为dir的属组):
默认情况下,用户创建文件时,其属组为此用户所属的主组,一旦某目录被设定了SGID,则对此目录有写权限的用户 在此目录中创建的文件 所属的组 都为此目录的属组(而不是创建者的),通常用于创建一个协作目录
chmod g+s DIR...
chmod 2xxx DIR
chmod g-s DIR...
4.4.3 特殊权限 Sticky —防止删除
sticky 设置在文件上无意义,只针对目录设置
在目录设置Sticky 位(o+t),只有文件的所有者 或root可以删除该文件
而一般情况下,具有写权限的目录,普通用户可以任意删除文件
chmod o+t DIR...
chmod 1xxx DIR
chmod o-t DIR...
4.4.4 特殊权限数字法
根据三者对应的作用位置,恰好也可分为4.2.1,并独立计算放在第一位
[root@CentOS8 data]# ll abc1.log
-rw-r--r-- 1 root root 0 Jul 8 19:33 abc1.log
[root@CentOS8 data]# chmod 4644 abc1.log #第一位4表示u+s
[root@CentOS8 data]# ll abc1.log
-rwSr--r-- 1 root root 0 Jul 8 19:33 abc1.log
[root@CentOS8 data]# chmod 2644 abc1.log #第一位2表示g+s
[root@CentOS8 data]# ll abc1.log
-rw-r-Sr-- 1 root root 0 Jul 8 19:33 abc1.log
[root@CentOS8 data]# chmod 1644 abc1.log #第一位1表示o+t
[root@CentOS8 data]# ll abc1.log
-rw-r--r-T 1 root root 0 Jul 8 19:33 abc1.log
[root@CentOS8 data]# chmod 7644 abc1.log #第一位7表示全部加上
[root@CentOS8 data]# ll abc1.log
-rwSr-Sr-T 1 root root 0 Jul 8 19:33 abc1.log
###此处全部是大写ST,因为源文件本身没有执行权限x,若有则为小写
#取消特殊权限,输入三位数即可:
[root@CentOS8 data]# chmod 555 abc1.log
[root@CentOS8 data]# ll abc1.log
-r-xr-xr-x 1 root root 0 Jul 8 19:33 abc1.log
4.5 设定文件特殊属性约束root
可以防止 root 用户误操作删除或修改文件
若发现某文件或目录 除了查看 无法进行任何操作,使用lsattr查看是否设置了特殊属性!!!
也有可能是此目录下存在某个文件被设置了attr属性
-
设置为不能编辑内容、删除、改名
若对目录设置,目录下的文件是可以被编辑的,但不能删除chattr +i file或dir
-
设置为只能追加内容,不能删除、改名
chattr +a file或dir
-
显示已经设置的特定属性
lsattr file或dir [root@centos8/data]# chattr +a f2.txt [root@centos8/data]# ll total 8 drw-r--r--. 2 root root 17 Aug 2 20:32 dir -rw-r--r--. 1 jack admins 709 Aug 2 19:52 f1.txt #普通权限界面看不到 -rwxr-xr-x. 1 jack root 23 Aug 2 19:53 f2.txt [root@centos8/data]# lsattr ------------------ ./f1.txt -----a------------ ./f2.txt #必须使用命令lasttr查看 ------------------ ./dir
4.6 访问控制列表
4.6.1 ACL权限功能
ACL:Access Control List,实现灵活的权限管理
作用:除了文件的所有者,所属组和其它人,可以对更多的用户设置权限(第四类用户)
要点:
- 文件一旦设置了ACL权限,中间3位表示mask权限,而不是group!!!
- ACL权限的生效顺序优先于other
CentOS7 默认创建的xfs和ext4文件系统具有ACL功能
CentOS7 之前版本,默认手工创建的ext4文件系统无ACL功能,需手动增加
tune2fs –o acl /dev/sda2
#查看结果中的Default mount options ,若有acl表示ext4文件系统支持此功能
4.6.2 ACL相关命令
- setfacl 可以设置ACL权限(作用:指定某个特定的用户对文件的权限)
设置成功之后,权限末尾有 + 号(表示第四种用户) - getfacl 可查看设置的ACL权限
setfacl -m u:jacklee:MODE FILE #添加权限:设置用户jacklee对文件FILE的权限为MODE
setfacl -m g:admins:MODE FILE #添加权限:设置admins组对文件FILE的权限为MODE
setfacl -x u:jacklee FILE #删除权限:删除用户jacklee对文件FILE的特殊权限
setfacl -b FILE #清除 对文件FILE设置的所有ACL权限
setfacl --set 把原有的ACL权限全部删除,用新的覆盖,'但是必须连同ugo的权限一起指定
如:setfacl --set u::rw,g::r,o::-,u:jacklee:rw file
getfacl FILE #查看文件对 所有用户类型 的权限
getfacl file1 | setfacl --set-file=- file2 #复制file1的acl权限给file2
[root@CentOS8 data]# setfacl -m u:jacklee:x abc2.log
[root@CentOS8 data]# ll abc2.log
-rw-r-xr--+ 1 root root 0 Jul 8 19:33 abc2.log #设置成功之后,权限末尾有+号
[root@CentOS8 data]# setfacl -m u:jacklee:x abc2.log
[root@CentOS8 data]# getfacl abc2.log
# file: abc2.log
# owner: root
# group: root
user::rw-
user:jacklee:--x #权限添加成功
group::r--
mask::r-x #同时ll中间三位权限表示mask!!而不是group!!!
other::r--
[root@CentOS8 data]# setfacl -b abc2.log
[root@CentOS8 data]# ll abc2.log
-rw-r--r-- 1 root root 0 Jul 8 19:33 abc2.log #+号消失
[root@CentOS8 data]# getfacl abc2.log
# file: abc2.log
# owner: root
# group: root
user::rw-
group::r--
other::r-- #正常三种用户的权限
mask 权限(限高杆)
- mask只影响除所有者和other之外的人和组的最大权限
- mask需要与用户的权限进行逻辑与运算后,才能变成有限的权限(Effective Permission)
- 用户或组的设置必须在mask权限设定范围内才会生效(逻辑与运算,取权限较小值)
setfacl -m mask::MODE file #设置mask权限
文件权限生效优先级顺序:
所有者 >> 自定义用户 >> 所属组 | 自定义组 >> other
mask权限 最多针对中间三者进行限制!!!
4.6.3 备份和还原ACL
主要的文件操作命令cp和mv都支持ACL,cp命令加上 -p 选项即可复制权限信息
但是tar等常见的备份工具是不会保留目录和文件的ACL信息
为了防止权限丢失,应使用ACL备份功能
#备份ACL
getfacl -R /tmp/dir > acl.txt #保存设置过的ACL权限信息
#还原ACL
setfacl --restore acl.txt (正常还原)
#将每一个文件的ACL权限 递归还原到所有文件!!!
setfacl -R --set-file=acl.txt /tem/dir