Linux文件系统上的权限

Linux 文件系统上的权限

文件系统权限的概念

文件系统上的权限指文件系统上文件和目录的权限,这种权限是建立在文件系统上的,与操作系统本身没关系。不同的文件系统对文件的访问控制权限是不一样的。比如ext4,xfs等CentOS6和CentOS7上的文件系统可以使用属主、属组、其它的方式针对三类用户来设置访问控制权限,而windows上常见的FAT32文件系统却不支持这种设置方式。

实验环境是:CentOS6和CentOS7系统

常见权限分类

文件系统主要针对三类用户设置访问权限,当然还有更复杂的权限设置,后面介绍。
* 属主
* 属组
* 其它

如下所示通过ll命令可查看这三类权限

[centos7@root app]# ll file1 
-rw-r--r--. 1 user1 grp1 6 Jul 25 09:23 file1
#属主权限:-rw
#属组权限:-r--
#其它用户权限:r--

每类用户又定义了三类权限
* r : readable 可读
* w : writeable 可写
* x : executable 可执行

目录和文件可读,可写,可执行含义不一样
* 文件

权限位 含义
r 可以使用查看类命令读取文件的内容
w 可以将内容写入文件
x 可以执行文件,即将文件提请到内核启动为一个进程,对于二进制可执行文件有x权限即可将其运行起来,而对于shell脚本(文本文件),需要有r,x权限才能执行此脚本。

* 目录

权限位 含义
r 若该目录有可读权限,可以查看目录内所包含的文件名,比如使用ls 命令查看
w 可以在该目录下新建、删除文件。但是要能在该目录下新建、删除文件必须要有x权限
x 可以进入此目录,比如用户cd 命令切换到该目录下

修改属主、属组、权限命令

修改属主、属组 chown
chown [-R] [user]][:group] FileName

-R #使用-R可修改该目录及目录内所有路径下的文件和目录的属主,属组
chown即可修改属主,可以修改属主,或同时修改属主和属组
chown user FileName
chown :group FileName
chown user:group FileName

实例

[centos7@root app]# ll 1.txt
-rw-r--r--. 1 root root 0 Jul 25 10:29 1.txt

#将属主修改为user1
[centos7@root app]# chown user1 1.txt
[centos7@root app]# ll 1.txt
-rw-r--r--. 1 user1 root 0 Jul 25 10:29 1.txt

#将属组修改为grp1
[centos7@root app]# chown :grp1 1.txt
[centos7@root app]# ll 1.txt
-rw-r--r--. 1 user1 grp1 0 Jul 25 10:29 1.txt

#同时修改属主和属组为root
[centos7@root app]# chown root:root 1.txt
[centos7@root app]# ll 1.txt
-rw-r--r--. 1 root root 0 Jul 25 10:29 1.txt

#递归修改属主和属组为user1
[centos7@root app]# ll -R dir
dir:
total 0
drwxr-xr-x. 3 root root 15 Jul 25 10:33 a
-rw-r--r--. 1 root root 0 Jul 25 10:33 file2

dir/a:
total 0
drwxr-xr-x. 2 root root 6 Jul 25 10:33 b

dir/a/b:
total 0
[centos7@root app]# chown -R user1:user1 dir
[centos7@root app]# ll -R dir
dir:
total 0
drwxr-xr-x. 3 user1 user1 15 Jul 25 10:33 a
-rw-r--r--. 1 user1 user1 0 Jul 25 10:33 file2

dir/a:
total 0
drwxr-xr-x. 2 user1 user1 6 Jul 25 10:33 b

dir/a/b:
total 0

修改属组 chgrp
chgrp [-R] group FileName

修改属组不但可以使用chown命令,还可以使用chgrp进行修改

-R 递归修改目录和文件的属组

实例

#修改属组
[centos7@root app]# ll 1.txt
-rw-r--r--. 1 root root 0 Jul 25 10:29 1.txt
[centos7@root app]# chgrp grp1 1.txt
[centos7@root app]# ll 1.txt
-rw-r--r--. 1 root grp1 0 Jul 25 10:29 1.txt

# 递归修改dir目录下所有文件和子目录的属组为gpr1
[centos7@root app]# ll -R dir
dir:
total 0
drwxr-xr-x. 3 user1 user1 15 Jul 25 10:33 a
-rw-r--r--. 1 user1 user1 0 Jul 25 10:33 file2

dir/a:
total 0
drwxr-xr-x. 2 user1 user1 6 Jul 25 10:33 b

dir/a/b:
total 0
[centos7@root app]# chgrp -R grp1 dir
[centos7@root app]# ll -R dir
dir:
total 0
drwxr-xr-x. 3 user1 grp1 15 Jul 25 10:33 a
-rw-r--r--. 1 user1 grp1 0 Jul 25 10:33 file2

dir/a:
total 0
drwxr-xr-x. 2 user1 grp1 6 Jul 25 10:33 b

dir/a/b:
total 0

修改文件和目录的访问权限 chmod
chmod [-R] MODE File
chmod - -reference=SourceFile DestFile

chmod不仅可以常见的r, w, x权限,还可以用来修改SUID,SGID,Sticky特殊权限, 权限有两种表示法,数字和模式。

  • 数字法是对属主,属组和其它权限位有可读、可写、可执行位的则用1表示,无的则使用0表示,然后分别将属主、属组、其它位置的三位二进制数字转换成十进制的数字,如下面的权限位用数字表示为644。
[centos7@root app]# ll 1.txt
-rw-r--r--. 1 root grp1 0 Jul 25 10:29 1.txt
  • 模式表示法,通过下表中的三列表组合来赋予文件访问权限

Alt text

实例

[centos7@root app]# ll 1.txt 2.txt
-rw-r--r--. 1 644 grp1 0 Jul 25 10:29 1.txt
-rw-r--r--. 1 644 root 0 Jul 25 11:14 2.txt

#现在1.txt,2.txt的权限都为rw-r--r-- 644, 将其改为rwxr-xr-x 755
# 方法一
[centos7@root app]# chmod 755 1.txt
[centos7@root app]# ll 1.txt
-rwxr-xr-x. 1 644 grp1 0 Jul 25 10:29 1.txt
# 方法二
[centos7@root app]# chmod u=rwx,g=rx,o=rx 2.txt
[centos7@root app]# ll 2.txt
-rwxr-xr-x. 1 644 root 0 Jul 25 11:14 2.txt

#按照1.txt的权限设置a的权限
[centos7@root app]# ll 1.txt a -d
-r--r--r--. 1 root root 0 Jul 25 11:32 1.txt
drwxr-xr-x. 2 root root 6 Jul 25 11:32 a
[centos7@root app]# chmod --reference=1.txt a
[centos7@root app]# ll 1.txt a -d
-r--r--r--. 1 root root 0 Jul 25 11:32 1.txt
dr--r--r--. 2 root root 6 Jul 25 11:32 a

umask

umask值,影响创建文件或目录时默认访问权限,当我们创建文件或目录时,发现系统会默认给我们指定权限,这个权限就是通过与umask的值计算而来的,默认root的umask为0022,普通用户的umask 为0002

[centos7@root app]# umask 
0022
[centos7@root app]# umask -S
u=rwx,g=rx,o=rx
[centos7@root app]# su user1
[centos7@user1 app]$ umask
0002
[centos7@user1 app]$ umask -S
u=rwx,g=rwx,o=rx

umask值得设定
umaks NUM

[centos7@root app]# umask 
0022
[centos7@root app]# umask 046
[centos7@root app]# umask
0046

umask值的计算
umask值得实际作用是,在对应的位中将umask指定的权限去除,例如将umask设定为135(–x -wx r-x),则创建的新文件或目录中权限位不能含–x-wxr-x这些权限

#将umask设定为135-(-x-wxr-x)
[centos7@root app]# umask 135

创建的新文件中对应的权限位去除了--x-wxr-x权限
[centos7@root app]# > file1
[centos7@root app]# ll file1
-rw-r---w-. 1 root root 0 Jul 25 12:51 file1

创建的新文件中对应的权限位去除了--x-wxr-x权限
[centos7@root app]# mkdir dir2
[centos7@root app]# ll -d dir2
drw-r---w-. 2 root root 6 Jul 25 12:55 dir2

还有一种间接的计算方法

  • 目录
    目录权限 = 777 - umask
  • 文件
    value = 666 - umask
    • 若value每一位都为偶数,文件权限的值就是value
    • 若vlue中有奇数位,则奇数位+1 后得到的值为文件权限的值

Linux文件系统上的特殊权限

Linux系统上的普通用户是能够修改自己的密码的,修改密码时,将涉及到对/etc/passwd文件的修改,我们看一下该文件的权限

[centos7@root app]# ll /etc/passwd
-rw-r--r--. 1 root root 2412 Jul 25 09:19 /etc/passwd

发现只有属主root拥有对该文件的修改权限,而普通用户是怎么,何时拥有修改该文件的权限呢,这就是SUID, SGID, STicky这三个特殊权限在起作用,在介绍着三个权限之前,我们先普及一下相应的概念。

Linux系统上的可执行程序也是一种文件,该文件在被提取到内存中去执行后,则称为进程,文件有属主、属组的概念,进程也有属主、属组的概念。

  1. 无特殊权限的程序对文件的访问权限

(1) 任何一个可执行程序能不能够被发起为进程,取决于发起者是否对该程序有访问权限
(2) 启动为进程之后,进程的属主为发起者,进程的属组为发起者所属组
(3) 进程访问文件时的权限取决于发起者,进程的发起者与文件的属主相同,则拥有文件属主的权限,进程发起者所属组与文件属组相同,则拥有文件属组的权限,否则应用文件其它位权限。

  1. 程序有SUID权限对文件的访问权限
#passwd命令就是拥有SUID权限
[centos7@root app]# ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 27832 Jun 10 2014 /usr/bin/passwd

(1) 任何一个可执行程序能不能够被发起为进程,取决于发起者是否对该程序有访问权限
(2) 启动为进程后,进程的属主不再是发起者,而是命令本身的属主
(3) 进程访问文件时的权限取决于命令的属主

  1. 程序有SGID权限对文件的访问权限

当命令设置了SGID的权限,则用此命令去访问文件时,对该文件的访问权限为命令发起者所属的组或命令所属的组是否能够与文件所属组匹配,有任意一个能够匹配,则应用该属组的权限

SUID权限设定

chmod u+s
chmod u-s

给命令设定了SUID权限后,发起者若对该命令有执行权限,启动为进程后发起者将以命令属主的身份去访问文件

[centos7@user1 app]$ ll /etc/shadow
-r--------. 1 root root 1949 Jul 25 10:04 /etc/shadow
#shadow文件只有root用户有权读取,下面我们通过赋予cat命令SUID权限后,普通用户也能读取该文件

# 复制cat命令到/app目录下,并赋予SUID权限
[centos7@root app]# cp -a /usr/bin/cat ./
[centos7@root app]# ll cat
-rwxr-xr-x. 1 root root 54080 Nov 6 2016 cat
[centos7@root app]# chmod u+s cat <=设置SUID权限
[centos7@root app]# ll cat
-rwsr-xr-x. 1 root root 54080 Nov 6 2016 cat
[centos7@root app]# su user1 <=切换为普通用户
[centos7@user1 app]$ /usr/bin/cat /etc/shadow <=用原命令读取,无权限
/usr/bin/cat: /etc/shadow: Permission denied
[centos7@user1 app]$ ./cat /etc/shadow <=用赋予SUID权限的命令读取的结果
root:$6$P7.k5VtL$34kw1szrNeaf/uAAFwk40uaZX3n2r0/.qM.IStlFb7z0mO52O/xuvVHQNyyOqIOz.bJAECjW9Qv6lgaXhqAyd/:17368:0:99999:7:::
bin:*:17368:0:99999:7:::

SGID 权限的设定

chmod g+s
chmod g-s

  • 对命令设定了SIGD权限后,使用此命令去访问文件,发起者所属组或命令所属组,与文件所属组相同,则应用文件所属组的权限。
cat命令的属组该为user1组,并赋予SGID权限
[centos7@root app]# ll cat
-rwxr-xr-x. 1 root root 54080 Nov 6 2016 cat
[centos7@root app]# chgrp user1 cat
[centos7@root app]# chmod g+s cat
[centos7@root app]# ll cat
-rwxr-sr-x. 1 root user1 54080 Nov 6 2016 cat

[centos7@root app]# ll file1 file2
----r-----. 1 root user1 15 Jul 25 15:15 file1
----r-----. 1 root user2 23 Jul 25 15:17 file2
# 切换为user2用户去读取file1文件
[centos7@root app]# su user2
[centos7@user2 app]$ /usr/bin/cat file1 <=用原命令无权限读取
/usr/bin/cat: file1: Permission denied
[centos7@user2 app]$ ./cat file1 <=使用了加了SGID权限读取
hello everyone
[centos7@user2 app]$ ./cat file2 <=也能读取该文件,说明是累加,而不是替换为命令所属组
something so beautiful
  • 对目录设定了SGID权限后, 在该目录下所创建的文件的属组是目录的基本组,没有设定之前,新文件的属组是创建者所属组。
[centos7@root app]# mkdir -m 777 dir
[centos7@root app]# chmod g+s dir <=对目录设定SGID
[centos7@root app]# chown :grp1 dir
[centos7@root app]# ll -d dir
drwxrwsrwx. 2 root grp1 6 Jul 25 15:32 dir <=目录基本组为grp1
[centos7@root app]# touch dir/1.txt
[centos7@root app]# ll dir/1.txt
-rw-r---w-. 1 root grp1 0 Jul 25 15:33 dir/1.txt
[centos7@root app]# su user1
[centos7@user1 app]$ touch dir/2.txt
[centos7@user1 app]$ ll dir/2.txt
-rw-rw-r--. 1 user1 grp1 0 Jul 25 15:34 dir/2.txt

Sticky 权限的设定

chmod o+t
chmod o-t

在Linux系统上有一个临时文件目录/tmp,任何用户都可以在该目录下创建和删除自己的文件,系统将此目录赋予了所有用户都rwx的权限。但作为普通用户我们却发现只能删除自己创建的文件,而不能删除别人创建的文件。这就是通过Sticky权限来实现的。

[centos7@user1 app]$ ll -d /tmp
drwxrwxrwt. 49 root root 8192 Jul 25 15:21 /tmp

Sticky只能作用于目录,设置了Sticky权限后,普通用户只能删除自己创建的文件。

[centos7@root app]# mkdir -m 777 dir
[centos7@root app]# chmod o+t dir
[centos7@root app]# ll -d dir
drwxrwxrwt. 2 root root 6 Jul 25 15:53 dir
[centos7@root app]# su user1
# 可以创建,删除自己创建的文件
[centos7@user1 app]$ touch dir/1.txt
[centos7@user1 app]$ touch dir/11.txt
[centos7@user1 app]$ rm dir/11.txt
[centos7@user1 app]$ exit
exit
[centos7@root app]# su user2
[centos7@user2 app]$ ll dir
total 0
-rw-rw-r--. 1 user1 user1 0 Jul 25 15:54 1.txt
[centos7@user2 app]$ rm dir/1.txt
rm: remove write-protected regular empty filedir/1.txt’? y
rm: cannot remove ‘dir/1.txt’: Operation not permitted <=不可以删除别的用户创建的文件
[centos7@user2 app]$ touch dir/3.txt

ACL(Access Control List)

前面的篇幅介绍的权限模型都为属主,属组,其它位与readable, writable, executable 三者的组合,当我们需要更详细的权限访问控制,前面的方法将力不从心,ACL提供更详细的权限访问控制功能

  • 无ACL,对文件的访问权限匹配顺序为属主->属组->Other
  • 有ACL,对文件的访问权限匹配顺序为属主->自定义用户->原属组和自定义组权限累加->other

以上两种权限都从左到右匹配用户,匹配到就不再检查右边的,其权限将是匹配到的权限

CentOS6系统安装时设定的分区默认是带ACL功能的,而后序自己新增的分区是不带ACL的,CentOS7系统都带ACL功能

#查看分区是否带acl功能
[centos6@root ~]# tune2fs -l /dev/sda3 | grep acl
Default mount options: user_xattr acl
# sda6为我自己创建的分区,无acl功能,自己添加
[centos6@root ~]# tune2fs -l /dev/sda6 | grep acl
[centos6@root ~]# tune2fs -o acl /dev/sda6
tune2fs 1.41.12 (17-May-2010)
[centos6@root ~]# tune2fs -l /dev/sda6 | grep acl
Default mount options: acl
[centos6@root ~]# mount -o acl /dev/sda6 /mnt/ <=挂载

设置和查看ACL分别使用setfaclgetfacl命令

设置ACL权限 setfacl
setfacl [options] …

常用选项

-m acl规则(多条用逗号隔开) FILE 增加acl规则
-b 删除所有acl规则
-x 删除指定的acl规则
-R 递归设置acl规则
选项-m和-x后边跟以acl规则。多条acl规则以逗号(,)隔开。
选项-M和-X用来从文件或标准输入读取acl规则。
选项–set和–set-file用来设置文件或目录的acl规则,先前的设定将被覆盖。
选项-m(–modify)和-M(–modify-file)选项修改文件或目录的acl规则。
选项-x(–remove)和-X(–remove-file)选项删除acl规则。
-d default设定目录的默认acl规则

实例一

#创建新文件fil1
[centos6@root app]# echo "hello everyone" > fil1
[centos6@root app]# ll fil1
-rw-r--r--. 1 root root 15 Jul 25 17:03 fil1
[centos6@root app]# getfacl fil1 <=此时查看并无自定义的acl规则
# file: fil1
# owner: root
# group: root
user::rw-
group::r--
other::r--

# 设定user1有rwx权限,grp1组有r权限,原所属组有rx权限,其它无权限
[centos6@root app]# setfacl -m u:user1:rwx,g::rx,g:grp1:r,o::- fil1
[centos6@root app]# getfacl fil1
# file: fil1
# owner: root
# group: root
user::rw- <=属主
user:user1:rwx <=自定义用户
group::r-x <=原属组
group:grp1:r-- <=自定义组
mask::rwx <=mask值,设定所有用户的最大权限
other::--- <=其它

[centos6@root app]# ll fil1
-rw-rwx---+ 1 root root 15 Jul 25 17:03 fil1 <=权限位的"."变成了"+",表示设定了ACL功能

实例二 给目录设定默认ACL
当给目录设定了默认ACL,则在该目录内创建的文件将继承该目录的ACL规则

[centos6@root app]# mkdir dir <=创建目录dir
Try `setfacl --help' for more information.
[centos6@root app]# getfacl fil1 | setfacl --set-file=- dir <=把fil1的acl规则复制给dir
[centos6@root app]# ll dir -d
drw-rwx---+ 2 root root 4096 Jul 25 17:14 dir
[centos6@root app]# getfacl dir
# file: dir
# owner: root
# group: root
user::rw-
user:user1:rwx
group::r-x
group:grp1:r--
mask::rwx
other::---

[centos6@root app]# setfacl -m d:u:user2:rw dir <=设定默认acl规则
[centos6@root app]# getfacl dir
# file: dir
# owner: root
# group: root
user::rw-
user:user1:rwx
group::r-x
group:grp1:r--
mask::rwx
other::---
default:user::rw- <=默认acl规则,会将属主,属主,other这基本acl也设定为默认acl
default:user:user2:rw- <=我们定义的acl
default:group::r-x
default:mask::rwx
default:other::---

#然后在该目录下创建文件,将继承目录设定的默认acl规则
[centos6@root app]# cd dir
[centos6@root dir]# pwd
/app/dir
[centos6@root dir]# touch file2
[centos6@root dir]# getfacl file2
# file: file2
# owner: root
# group: root
user::rw-
user:user2:rw- <=从目录处继承下来的
group::r-x #effective:r--
mask::rw-
other::---

[centos6@root dir]# ll file2
-rw-rw----+ 1 root root 0 Jul 25 17:21 file2

实例三 给文件备份,恢复ACL规则
当我们使用cp 命令加-p 或-a 选项时将保留acl,而tar命令却无法保留acl,此时可以将ACL备份到文件中,后面再恢复

#设定ACL规则
[centos6@root dir]# setfacl -Rm u:user1:rwx,g:grp1:rx dir
[centos6@root dir]# getfacl dir
# file: dir
# owner: root
# group: root
user::rw-
user:user1:rwx
group::r-x
group:grp1:r-x
mask::rwx
other::---

# 备份ACl规则
[centos6@root dir]# getfacl -R dir > acl.txt

#删除ACL规则
[centos6@root dir]# setfacl -Rb dir
[centos6@root dir]# getfacl dir
# file: dir
# owner: root
# group: root
user::rw-
group::r-x
other::---

# 恢复ACL规则
[centos6@root dir]# setfacl --restore acl.txt
[centos6@root dir]# getfacl dir
# file: dir
# owner: root
# group: root
user::rw-
user:user1:rwx
group::r-x
group:grp1:r-x
mask::rwx
other::---