Linux 文件系统权限

1.文件的一般权限

1.1.权限含义

文件详细信息

  • 用命令 ll 或 ls -l 查看文件详细信息

1.2.权限构成

文件权限构成

根据文件归属性对象分为:

  • owner:所有者,缩写 u

  • group :所属组,缩写 g

  • other :其他人,缩写 o

组成模式分析

字符表示二进制表示数字表示
---0000
--x0011
-w-0102
-wx0113
r--1004
r-x1015
rw-1106
rwx1117

文件与目录权限含义

权限对文件对目录
r(read)可以读取文件的内容可以列出目录下的内容,即目录下的文件的文件名
w(write)可以更改文件的内容可以创建或者删除目录中的任意文件 (只有 w 权限无法创建删除文件,需要和 x 权限一起使用)
x(execute)

可以作为可执行文件,如脚本执行

(只有 x 权限不可执行文件,需要与 r 权限连用)

可以切换到目录(cd)
文件可能出现的权限目录可能出现的权限
---、r--、r-x、rw-、rwx---、r-x、rwx

注意:

root 不受读写权限限制

只受执行权限限制

1.3.修改文件所属者和组

1.3.1.chown

  • 修改文件或目录的所有者和所属组

格式

chown -选项 所有者:所属组 文件名/目录名 # chown root file 修改所属者为 root # chown root: file 修改所属者为 root 所属组为所属者的基本组 # chown redhat:root file 修改所属者为 redhat 所属组为 root # chown :root file 修改所属组为 root

选项

参数功能
-R递归修改目录即所有子文件、子目录的所属者/组
# 修改文件的所属者/组 [root@zzz ~]# touch t1.txt [root@zzz ~]# ll t1.txt -rw-r--r-- 1 root root 0 Jan 3 14:58 t1.txt [root@zzz ~]# chown zyz:zyz t1.txt [root@zzz ~]# ll t1.txt -rw-r--r-- 1 zyz zyz 0 Jan 3 14:58 t1.txt # 递归修改目录即目录下的子文件、子目录的所属者/组 [root@zzz ~]# mkdir test [root@zzz ~]# touch test/file{1..3} [root@zzz ~]# ll -d test/ ; ll test/ drwxr-xr-x. 2 root root 45 Feb 15 13:53 test/ total 0 -rw-r--r--. 1 root root 0 Feb 15 13:53 file1 -rw-r--r--. 1 root root 0 Feb 15 13:53 file2 -rw-r--r--. 1 root root 0 Feb 15 13:53 file3 [root@zzz ~]# chown -R zyz:zyz test/ [root@zzz ~]# ll -d test/ ; ll test/ drwxr-xr-x. 2 zyz zyz 45 Feb 15 13:53 test/ total 0 -rw-r--r--. 1 zyz zyz 0 Feb 15 13:53 file1 -rw-r--r--. 1 zyz zyz 0 Feb 15 13:53 file2 -rw-r--r--. 1 zyz zyz 0 Feb 15 13:53 file3

1.4.修改文件权限

1.4.1.chmod

  • chmod(change mode):修改文件或目录的权限

# 字符型 chmod -选项 [ugoa] [+-=] [rwx] 文件或目录名... # 数字型 chmod -选项 nnn 文件或目录名... # nnn: 用数字表示的权限
选项功能
-R递归修改目录下所有文件,以及子目录下所有文件权限
  • 例如

[root@zzz ~]# touch t1.txt [root@zzz ~]# ll t1.txt -rw-r--r-- 1 root root 0 Jan 3 14:50 t1.txt [root@zzz ~]# ll t1.txt -rwxr-xr-x 1 root root 0 Jan 3 14:50 t1.txt [root@zzz ~]# chmod o+w t1.txt [root@zzz ~]# ll t1.txt -rwxr-xrwx 1 root root 0 Jan 3 14:50 t1.txt

2.特殊权限

  • Linux 系统中,用户对文件或目录的访问权限除了 rwx 一般权限外,还有

    • SET UID(SUID)

    • SET GID(SGID)

    • Sticky Bit(粘滞位)

  • 用于对文件或目录进行更加灵活方便的访问控制

2.1.SUID

  • 可执行文件设置:普通用户执行此文件时临时获得该文件所有者权限

    • 所有者 u 执行位显示 s(文件本身有 x 权限) 或 S(文件本身没有 x 权限)

    • 设置 SUID:chmod u+s

    • 取消 SUID:chmod u-s

  • 普通用户修改自身密码,修改的新密码需要保存到 /etc/shadow 文件中,而 /etc/shadow 文件的权限为 ---(只有 root 可修改),那么怎么修改自己的密码呢

    • passwd 命令用于修改用户密码,其所属所有者为 root,且设置了 SUID 权限。

    • 普通用户执行 passwd 时,可获得 root 权限,从而能够修改 /etc/shadow 文件中的密码信息

[root@zzz ~]# ll /usr/bin/passwd -rwsr-xr-x. 1 root root 32648 Aug 10 2021 /usr/bin/passwd [root@zzz ~]# ll /etc/shadow ---------- 1 root root 1140 Jan 2 18:03 /etc/shadow

注意:

  • suid 仅对二进制文件有效

  • 在执行过程中,调用者会暂时获得该文件的所有者权限

  • 该权限只在程序执行的过程中有效

2.2.SGID

  • 目录设置:在此目录下新创建的文件和子目录继承其组属性(所属组为该目录所属组)(团队协作)

  • 可执行文件设置:普通用户执行此文件时临时获得文件所属组权限

    • 所属组 g 执行位显示 s(文件/目录本身有 x 权限) 或 S(文件/目录本身没有 x 权限)

    • 设置 SGID:chmod g+s

    • 取消 SGID:chmod g-s

注意:

一般 SGID 多用在特定的多人团队的项目开发上,在系统中用的很少

# 实验准备 [root@zzz ~]# mkdir /test [root@zzz ~]# ll -d /test drwxr-xr-x. 2 root root 6 6月 8日 18:18 /test [root@zzz ~]# groupadd kaifa [root@rhcsa ~]# chown :kaifa /test # 该目录所属组修改为了 kaifa [root@zzz ~]# ll -d /test drwxr-xr-x. 2 root kaifa 6 6月 8日 18:18 /test # 在该目录没有 SGID 的权限下,创建文件,文件所属组不会继承父目录的所属组 [root@zzz ~]# touch /test/rootfile1 [root@zzz ~]# ll /test/ 总计 0 -rw-r--r--. 1 root root 0 6月 8日 18:20 rootfile1 # 添加 SGID 权限 [root@zzz ~]# chmod g+s /test [root@zzz ~]# ll -d /test drwxr-sr-x. 2 root kaifa 6 6月 8日 18:18 /test # 在该目录有 SGID 的权限下,创建文件,文件所属组会继承父目录的所属组 [root@zzz ~]# touch /test/rootfile2 [root@zzz ~]# ll /test 总计 0 -rw-r--r--. 1 root root 0 6月 8日 18:20 rootfile1 -rw-r--r--. 1 root kaifa 0 6月 8日 18:22 rootfile2 # 所属组继承父目录 # 给该目录其他人添加上 w 权限 [root@zzz ~]# ll -d /test drwxr-sr-x. 2 root kaifa 40 6月 8日 18:22 /test [root@zzz ~]# chmod o+w /test [root@zzz ~]# ll -d /test drwxr-srwx. 2 root kaifa 40 6月 8日 18:22 /test # 用 redhat 用户登录 [redhat@zzz ~]$ touch /test/redhatfile1 [redhat@zzz ~]$ ll /test 总计 0 -rw-r--r--. 1 redhat kaifa 0 6月 8日 18:25 redhatfile1 # 普通用户创建文件,所属组继承父目录 -rw-r--r--. 1 root root 0 6月 8日 18:20 rootfile1 -rw-r--r--. 1 root kaifa 0 6月 8日 18:22 rootfile2

2.3.Sticky Bit

  • 目录设置:公共可写目录,在该目录下,用户只能 “删除/重命名/移动” 自己创建的文件(root 不受限制)

    • 其他人 o 执行位显示 t(目录本身有 x 权限) 或 T(目录本身没有 x 权限)

    • 设置 Sticky Bit:chmod o+t

    • 取消 Sticky Bit:chmod o-t

# 上述公共目录里的文件,所有人都可以删除,不安全 [redhat@zzz ~]$ ll /test 总计 0 -rw-r--r--. 1 redhat kaifa 0 6月 8日 18:25 redhatfile1 -rw-r--r--. 1 root root 0 6月 8日 18:20 rootfile1 -rw-r--r--. 1 root kaifa 0 6月 8日 18:22 rootfile2 # redhat 用户可以把 root 的文件删除 [redhat@zzz ~]$ rm -rf /test/rootfile1 [redhat@zzz ~]$ ll /test 总计 0 -rw-r--r--. 1 redhat kaifa 0 6月 8日 18:25 redhatfile1 -rw-r--r--. 1 root kaifa 0 6月 8日 18:22 rootfile2 # 给其他人这一组添加上 t 的权限(使用 root 账户添加)

2.4.设置特殊权限

  • 字符格式:

    • SUID:chmod u ± s

    • SGID:chmod g ± s

    • Sticky Bit:chmod o ± t

  • 数字格式:chmod nnnn

    • 后三位是一般权限,第一位是特殊权限(第一位标志数字如下)

特殊权限二进制表示数字表示
-0000
Sticky0011
SGID0102
SGID、Sticky0113
SUID1004
SUID、Stikcy1015
SUID、SGID1106
SUID、SGID、Sticky1117

3.ACL 权限

  • 给指定用户,指定目录分配指定权限(更细化的权限设置)

  • 上述权限的设置都是针对所属者所属组其他人,这三个大类的限制,如果要对其他人中的某一个人进行限制,就要用到 ACL 访问控制列表来更加精确的限制某个人的权限

3.1.getfacl

  • 查看 ACL 权限

getfacl 文件名
[root@zzz ~]# touch temp.cfg [root@zzz ~]# getfacl temp.cfg # 默认无 ACL 权限 # file: temp.cfg # owner: root # group: root user::rw- group::r-- other::r--

3.2.setfacl

  • 设置 ACL 权限

格式

setfacl -选项 文件名

选项

参数功能
-m

设置 ACL 条目

给用户设置 ACL 权限:setfacl -m u:用户名:权限 文件名

给用户组设置 ACL 权限:setfacl -m g:组名:权限 文件名

-x删除指定 ACL 条目
-b删除所有 ACL 条目
-d

设置目录默认ACL条目(针对目录)

(在此目录下新创建的文件和子目录会继承该默认ACL)

-k删除目录默认 ACL 权限
-R递归设置 ACL 权限
  • 例:root 用户在根目录下创建目录 /project 及所属工作组 QQgroup

  • 所属组里面创建两个用户 zhangsan 和 lisi,此文件权限是 770

  • 再创建一个旁听用户 pt,给他设定 /project 目录的 ACL 为 r-x

[root@zzz ~]# mkdir /project [root@zzz ~]# groupadd QQgroup [root@zzz ~]# useradd zhangsan [root@zzz ~]# useradd lisi [root@zzz ~]# gpasswd -M zhangsan,lisi QQgroup [root@zzz ~]# chown root:QQgroup /project [root@zzz ~]# chmod 770 /project [root@zzz ~]# ll -d /project/ drwxrwx---. 2 root QQgroup 6 Jan 3 17:09 /project/ [root@zzz ~]# getfacl /project/ getfacl: Removing leading '/' from absolute path names # file: project/ # owner: root # group: QQgroup user::rwx group::rwx other::--- [root@zzz ~]# useradd pt [root@zzz ~]# setfacl -m u:pt:rx /project/ [root@zzz ~]# ll -d /project/ drwxrwx---+ 2 root QQgroup 6 Jan 3 17:09 /project/ # 注意:某文件基本权限后有+标志则说明其具有 acl 权限 [root@zzz ~]# getfacl /project/ getfacl: Removing leading '/' from absolute path names # file: project/ # owner: root # group: QQgroup user::rwx user:pt:r-x group::rwx mask::rwx # mask 限制除了所有者(user::)和其他人(other::)之外的所有 ACL 权限的 “最大可用权限” other::--- # 测试 [root@zzz ~]# su - pt [pt@zzz ~]$ cd /project/ [pt@zzz project]$ touch a1 touch: cannot touch 'a1': Permission denied
# 删除 ACL 权限 [root@zzz ~]# setfacl -x u:pt /project/ [root@zzz ~]# getfacl /project/ getfacl: Removing leading '/' from absolute path names # file: project/ # owner: root # group: QQgroup user::rwx group::rwx mask::rwx other::--- # 删除指定用户的 ACL 权限 setfacl -x u:用户名 文件名 # 删除指定组的 ACL 权限 setfacl -x g:组名 文件名 # 删除文件所有 ACL 权限 setfacl -b 文件名

4.权限掩码

4.1.umask

  • 显示或者设置文件和目录的默认权限

  • 在 Linux 系统中,当用户创建一个新的文件或目录时,系统都会为新建的文件或目录分配默认的权限,该默认权限与 umask 值有关

  • 文件:实际默认权限 = 理论默认权限(0666) - umask 值

  • 目录:实际默认权限 = 理论默认权限(0777) - umask 值

# 查看默认 umask 值 [root@zzz ~]# umask 0022 # 新建文件,查看默认权限 [root@zzz ~]# touch file [root@zzz ~]# ll file -rw-r--r-- 1 root root 0 Jan 3 17:28 file # 新建目录,查看默认权限 [root@zzz ~]# mkdir dir1 [root@zzz ~]# ll -d dir1/ drwxr-xr-x 2 root root 6 Jan 3 17:29 dir1/
# 临时修改 umask 值 [root@zzz ~]# umask 000 # 永久修改 umask 值 # 方法一 [root@zzz ~]# vim /etc/profile umask 0000 # 在文件最后添加此行内容 [root@zzz ~]# source /etc/profile # 方法二 [root@zzz ~]# vim ~/.bashrc umask 0000 [root@zzz ~]# source ~/.bashrc