9. Linux文件权限

Date:

2018-09-02

9.1. Linux文件权限说明

文件权限整体可以分为以下几个部分:
  • 文件所有者(文件所有者、文件所有者所属的组、文件所有者及所属组以外其他用户)

  • 文件所有者的权限(读、写、执行,注意文件和目录对待这三种权限的区别)

  • 文件类型(一般常见的其中文件类型)

  • 文件大小

  • 文件的时间信息

  • 文件安全相关属性(SUID、SGID、sticky、chattr设置)

9.1.1. 文件所属用户信息

文件系统上的权限是指文件系统上文件和目录的权限,只要针对三种人群。
  • owner(user)

    所有者,简写u

  • group

    所在组,简写g

  • other

    其他,简写o

  • all

    所有用户(是前面三种用户合称,是方便设置用户权限而设置的),简写a

9.1.2. 文件一般属性查看

通过 ls -l 查看的结果说明:

zzjlogin's image loss

文件权限说明:

zzjlogin's image loss

9.1.3. 文件所属各种用户对应的权限

权限说明参考:
权限分为三种:
  • r 读取,read

  • w 写入,write

  • x 执行,execute

文件权限说明:
r
  • 即对应的用户可以读。

  • 即可以ls查看到文件。

  • 但是不能通过 ./ 执行这个文件,所以执行时 tab 键不能显示文件名,但是可以通过 sh 来执行文件。

  • 通过vi打开可以,会提示 Warning: Changing a readonly file

  • 当vi插入模式输入内容后通过x不能退出,但是可以通过 wq! 强制退出并把内容写入文件。

  • 不能通过 echo 把内容输入文件。会提示 Permission denied

  • 不能通过cat、less、tail显示目录下文件内容。

w
  • 对应的用户可以写入。

  • 只有 w 权限时,即使通过 sh 来执行这个文件也会提示权限问题不能执行。

  • 通过 echo 把内容输入文件不提示权限问题,使用当前用户是通过 vi 查看会发现没有内容输入文件,切换到root用户查看即可发现内容已经出入到文件。

  • 因为可以通过 echo 把内容输入到文件,所以即可以增加又可以修改文件内容。

  • 当vi插入模式输入内容后通过x不能退出,但是可以通过 wq! 强制退出并把内容写入文件。当前用户是使用 vi 再次打开文件查看会发现没有内容输入文件,切换到root用户查看即可发现内容已经出入到文件。

  • 不能通过cat、less、tail显示目录下文件内容。

  • 也不能用 sed

x
  • 即对应的用户可以执行这个文件。

  • 可以通过 ./ 然后输入一部分文件名然后用 tab 键会补全提示。如果是shell脚本可以直接执行。

  • 如果只有x全息,文件也执行不了。需要结合r权限才可以执行( wx 也不能执行)

目录权限说明:
r
  • 即对应的目录可读。

  • 可以通过ls查看目录以及目录内的文件名,

  • 通过 ls -l 可以看到文件类型,看不到目录内文件权限以及所有者信息。会显示?,。

  • 不能通过 cd 进入这个目录。

  • 目录下的文件即使权限是777,也不能写入。而且可以通过 vi 打开目录内的文件 wq! 强制插入内容也不能保存。

  • 不能通过cat、less、tail显示目录下文件内容。

w
  • 对应的目录可以通过ls查看到,但是ls查看不到目录内的文件

  • 不能通过 cd 进入这个目录。

  • 目录下的文件即使权限是777,也不能写入。而且可以通过 vi 打开目录内的文件 wq! 强制插入内容也不能保存。

  • 不能通过cat、less、tail显示目录下文件内容。

  • 需要和 x 权限结合使用。有 x 时,可以在目录内创建、删除文件

  • 当目录权限为 wx 时目录内容看不到,但是可以通过touch在目录下创建文件。

  • 当目录权限为 wx 时也可以通过 echo 把内容输入文件,但是需要手动输入文件名, tab 不能自动补全文件名。

x
  • 目录可执行权限

  • 目录的x权限即可以通过 cd 进入这个目录,如果没有 r 权限,即使进入了这个目录也看不到目录内所有文件,连文件名也看不到。

9.1.4. 文件类型有一下几类

  • - 普通文件

  • d 目录文件

  • b 块设备文件

  • c 字符设备文件

  • s socket文件

  • p 管道文件

  • l 连接文件

9.1.5. 权限表如下

文件类型

r

w

x

文件

可以查看文件内容

可以写入文件

可以提交内核执行

目录

可以查看目录列表

可以在目录删除和添加文件

可以进入目录

权限表示方法:

字母表示法

二进制法

数值法

000

0

–x

001

1

-w-

010

2

-wx

011

3

r–

100

4

r-x

101

5

rw-

110

6

rwx

111

7

9.2. 普通权限的修改chmod

修改权限方法有下面几种:

1

直接设置所有权限的

1chmod 644 file1
2chmod a=rwx,g=rw,o=--- file1

添加和去除权限的

1chmod a+x file1
2chmod o-x file1

小技巧

可以指定”-R”选项来递归设置下。

9.3. 文件所有者的修改chown

chown的使用案例

修改属主和属组

1chown mysql.mysql file.txt

修改属主

1chown mysql file.txt

修改属组

1chown .mysql file.txt

修改属组

1chgrp mysql file.txt

备注

文件的属主和属组仅root可以修改。

9.4. umask

遮罩码用于设置创建一个新的文件或者目录时候的默认权限。

  • file: 666-umask

  • dir: 777-umask

备注

如果相减只有还有x权限,就再对应权限为加1。

9.4.1. umask查看和临时修改

1[root@centos-155 ~]# umask
20022
3[root@centos-155 ~]# umask 0002
4[root@centos-155 ~]# umask
50002
6[root@centos-155 ~]# umask 0022
7[root@centos-155 ~]# umask
80022

9.4.2. 永久修改umask

可以修改以下两个文件中的 umask 值:
  • /etc/profile:只在用户第一次登录时被执行

  • /etc/bashrc:在用户每次登录加载Bash Shell时都会被执行

小技巧

有的资料修改用户家目录的 .profile.bash_profile ,家目录的配置文件只对指定用户有效。

9.5. 文件特殊权限

在linux文件系统上,特殊权限:
  • suid

  • sgid

  • sticky

  • chattr命令设置的权限保护

9.5.1. 安全上下文:

前提条件: 进程有属主和属组,文件有属主和属组。

  1. 任何一个可执行程序文件能不能启动为进程,取决于发起者对程序文件是否有执行权限。

  2. 启动为进程之后,其进程的属主为发起者,进程的属组为发起者所属组。

  3. 进程访问文件时候的权限,取决于进程的发起者。

  4. 进程的发起者同文件的属主,则应用文件的属主权限。

  5. 进程的发起者同文件的属组,则应用文件的属组权限。

  6. 应用文件其他位权限。

4 为 SUID = u+s 2 为 SGID = g+s 1 为 SBIT = o+t

0: 不设置特殊权限 1: 只设置sticky 2: 只设置SGID 3: 只设置SGID和sticky 4: 只设置SUID 5: 只设置SUID和sticky 6: 只设置SUID和SGID 7: 设置3种权限

9.5.2. suid

SUID

即Set User ID

setuid
  • 只对文件有效

  • 设置这个标志的文件一般二进制执行文件。

  • 设置这个标志的特点:任何用户执行这个文件时都具有文件所有者权限。一般passwd即设置了setuid

  • 设置setuid的标志是在文件所有者权限的标识 rwx 会显示为 rws

  • 一般如有原有文件设置了所有者的 x 权限这时候设置setuid后会显示小 s ,如果原来没有设置 x ,则会显示大写 S ,这是提示没有执行权限。

  • 如果特殊权限位置上变成了大写的了(S/T),那么,就说明,这里的权限已经不起作用了。

  1. 任何一个可执行程序文件能不能启动为进程,取决于发起者对程序文件是否拥有执行权限。

  2. 启动为进程之后,其进程的属主为原有程序文件的属主

示例

如果一个程序文件passwd,属主root,属组root,且属主、 属组和其他人都有执行权限,且还有suid权限,那么 zzj 用户来执行这个命令的时候,对zzj来说 有执行权限,但是passwd这个进程起来的时候,进程的属主是root,而不是zzj。

权限设定和查看

 1[root@centos-155 bin]# cd /usr/bin                      # 进入bin目录
 2[root@centos-155 bin]# ls -l vim                        # 查看默认权限信息
 3-rwxr-xr-x. 1 root root 2289640 Aug  2  2017 vim
 4[root@centos-155 bin]# chmod u+s vim                    # 添加suid
 5[root@centos-155 bin]# ls -l vim                        # 查看
 6-rwsr-xr-x. 1 root root 2289640 Aug  2  2017 vim
 7[root@centos-155 bin]# chmod a-x vim                    # 去除执行权限
 8[root@centos-155 bin]# ls -l vim                        # 查看
 9-rwSr--r--. 1 root root 2289640 Aug  2  2017 vim
10[root@centos-155 bin]# chmod a+x vim                    # 恢复执行权限
11[root@centos-155 bin]# chmod u-s vim                    # 去除suid权限
12[root@centos-155 bin]# ls -l vim                        # 查看
13-rwxr-xr-x. 1 root root 2289640 Aug  2  2017 vim

通过上面的实验,可以看出来原有属主有执行权限的时候添加suid对应执行权限位为s,如果 原有属主没有执行权限的时候,添加suid对应的执行权限为S。

警告

suid设置有风险,普通用户可以通过suid权限临时使用属主身份修改重要文件。慎用!

9.5.3. sgid

SGID

即Set Group ID

setgid
  • 只对目录有效

  • 当s这个标志出现在文件所有者的x权限上时,则就被称为SUID。那么把这个s放到文件的所属用户组x位置上的话,就是SGID

  • SGID对二进制程序有用

  • 只是SGID是获得该程序所属用户组的权限。如果用户在此目录下具有w权限的话,若使用者在此目录下建立新文件,则新文件的群组与此目录的群组相同。

默认情况下,用户创建文件时候,其属组为此用户所属的基本组。

一旦目录设置了sgid,则对此目录有写权限的用户在此目录创建的文件所属的组为此目录的属组。

权限的设定

1chmod g+s dir
2chmod g-s dir

备注

这个权限在团队开发中非常有用的, 一个目录,你创建的文件团队其他人没法访问是不是很尴尬。

9.5.4. sticky

Sticky Bit

这个就是针对other来设置的了,和上面两个一样,只是功能不同而已。

作用

当用户在该目录下建立文件或目录时,仅有自己与 root才有权力删除。

sticky
  • 只对文件有效

  • 最具有代表的就是/tmp目录,任何人都可以在/tmp内增加、修改文件(因为权限全是rwx),但仅有该文件/目录建立者与 root能够删除自己的目录或文件。

  • 这个SBIT对文件不起作用。

对于一个多人可写的目录,如果设置了sticky,则每个用户仅能删除自己创建的文件。

权限的设定

1chmod o+t dir
2chmod o-t dir

备注

这个权限在团队开发中是非常有用的,防止恶意删除别人的文件。

9.5.5. chattr文件防篡改

chattr是结合了sticky,并扩充了这个角色的功能。

通过 chattr 命令锁定/解除文件锁定。通过 lsattr 命令查看文件是否锁定

提示

chattr命令不能保护/、/dev、/tmp、/var目录

整理下chattr命令的用法:

chattr [-RVf] [-+=AacDdeijsSu] [-v version] files...

最关键的是[-+=AacDdeijsSu]这部分,它是用来控制文件的属性。与chmod这个命令相比,chmod只是改变文件的读写、执行权限,更底层的属性控制是由chattr来改变的。

各参数选项中常用到的是a和i。a选项强制只可添加不可删除,多用于日志系统的安全设定。而i是更为严格的安全设定,只有superuser (root) 或具有CAP_LINUX_IMMUTABLE处理能力(标识)的进程能够施加该选项。

+    在原有参数设定基础上,追加参数。
-    在原有参数设定基础上,移除参数。
=    更新为指定参数设定。
A    文件或目录的atime(accesstime)不可被修改(modified),可以有效预防例如手提电脑磁盘I/O错误的发生。【可以重命名,可以删除,不可修改】
a    即append,设定该参数后,只能向文件中添加数据,而不能删除内容和文件也不能修改文件名称,多用于服务器日志文件安全,只有root才能设定这个属性。【只能用>>重定向来追加内容】
c    即compresse,设定文件是否经压缩后再存储。读取时需要经过自动解压操作。
D    常见为目录属性,任何改变将同步到磁盘,相当于mount命令中的dirsync选项同步目录;检查压缩文件中的错误的功能。
d    即nodump,设定文件不能成为dump程序的备份目标。
e     (extent format)表示该文件使用ext文件系统存储,可以发现linux下几乎所有文件都有e这个隐藏属性。而且chattr-e这个命令是无法执行成功的,因为在manchattr中已经有了说明。
i    (immutable)设定文件不能被删除、改名、设定链接关系,同时不能写入或新增内容。i参数对于文件系统的安全设置有很大帮助。
j    即journal,设定此参数使得当通过mount参数data=ordered或者data=writeback挂载的文件系统,文件在写入时会先被记录(在journal中)。如果filesystem被设定参数为data=journal,则该参数自动失效。
s    保密性地删除文件或目录,即硬盘空间被全部收回。
S    (synchronous)硬盘I/O同步选项,功能类似sync,一旦应用程序对这个文件执行了写操作,使系统立刻把修改的结果写到磁盘。
u    与s相反,当设定为u时,数据内容其实还存在磁盘中,可以用于undeletion。当一个应用程序请求删除这个文件,系统会保留其数据块以便以后能够恢复删除这个文件,用来防止意外删除文件或目录。

隐藏属性:

T    将被视为目录结构的顶极目录,这是为了Orlov块的分配
t    它和其他文件合并时,该文件的末尾不会有部分块碎片(为支持尾部合并的文件系统使用)。
X    用来标记一个能直接访问的裸内容压缩文件。目前它还不能使用chattr来设置或者重置,可以使用lsattr命令来显示。
Z    用来标记一个脏的压缩文件。目前它还不能使用chattr来设置或者重置,可以使用lsattr命令来显示。

其他:

-R    递归处理,将指定目录下的所有文件及子目录一并处理。
-V    显示指令执行过程。
-f    显示错误信息。
-v    <版本编号>设置文件或目录版本。
  1. 可追加不可做其他修改和删除

    说明:

    设置+a参数以后可以用重定向“>>”向文件追加内容,不可删除和重命名,也不能用vi编辑,不可以用mv命令转移文件位置,可以用cp命令复制,但是不能复制+a属性。 去掉a属性方法:把参数+a改为参数-a

    实例:

 1[root@CaseServer ~]# ll
 2total 4
 3-rw-r--r-- 1 root root 23 Nov 25 17:27 test.txt
 4[root@CaseServer ~]# lsattr
 5-------------e-- ./test.txt
 6[root@CaseServer ~]# chattr +a test.txt
 7[root@CaseServer ~]# lsattr
 8-----a-------e-- ./test.txt
 9[root@CaseServer ~]# ll
10total 4
11-rw-r--r-- 1 root root 23 Nov 25 17:27 test.txt
12[root@CaseServer ~]# rm -rf test.txt
13rm: cannot remove ‘test.txt’: Operation not permitted
  1. 不可更改不可删除锁定

    说明:

    设置+i参数以后文件不能修改和追加,也不能删除和重命名。

    实例:

 1[root@CaseServer ~]# ll
 2total 4
 3-rw-r--r-- 1 root root 23 Nov 25 17:27 test.txt
 4[root@CaseServer ~]# lsattr
 5-------------e-- ./test.txt
 6[root@CaseServer ~]# chattr +i test.txt
 7[root@CaseServer ~]# lsattr
 8----i--------e-- ./test.txt
 9[root@CaseServer ~]# echo "test" >> test.txt
10-bash: test.txt: Permission denied
11[root@CaseServer ~]# mv test.txt abc.txt
12mv: cannot move ‘test.txt’ to ‘abc.txt’: Operation not permitted
13[root@CaseServer ~]# chattr -i test.txt
14[root@CaseServer ~]# lsattr
15-------------e-- ./test.txt