7 文件系统权限(二):权限

rwx, chmod, chgrp, chown, SUID, SGID, Sticky, chattr, lsattr, umask, ACL, setfacl, getfacl

权限

假设这样几个场景:    
1) A用户在/testdir目录中创建了A.txt文件,B用户是否可以删除、修改、移动、重命名该文件呢?    
2) 公司有一个项目组,成员是A,B,C,D,对于/testdir/project目录下的文件,用户均可查看、修改、创建,
   但是不可删除其他人创建的文件,该项目下新建的文件或目录均属于该项目组,组外成员对该项目不能访问。
   该如何实现该要求?
3) 有一个可执行文件f1,如何在不改变属主和属组及其他用户权限设定的情况下,使A用户只能查看和执行f1,
   B用户仅具有执行权限,组G1的所有成员仅能查看。要达成该要求,又该如何完成相关设定?

为了解决上述类似的情况,Linux多采用如下三种权限模式:

一、读写执行 rwx(read,write,execute)

[root@centos7 testdir]# ll
total 4drwxr-xr-x. 2 root it      6 Aug  7 15:29 dir
-rw-r--r--. 1 root root 2338 Aug  5 10:43 passwd
#----------------------------------------------------------------------------------------------
# 以第一行为例:
# 第一列:drwxr-xr-x.
#   i)r=read,w=write,x=execute,-=nothing
#  ii)其中 rwxr-xr-x 为文件/目录的权限设定,其中:
#       1)前三位 rwx :代表文件拥有者owner的权限为“可读、可写  、可执行”
#       2)中三位 r-x :代表文件所属组group的权限为“可读、不可写、可执行”
#       3)后三位 r-x :代表 非owner和group的权限为“可读、不可写、可执行”
# iii)权限格式固定为:
#       rwx为固定顺序,owner group other 的顺序也是固定的
#           1)若将“权限位”中有权限设为1,无权限设为0,则rwxr-xr-x = 111101101(二进制)
#           2)由于每三位的rwx设定情况决定了其对应用户的权限,将rwx转换为 “八进制” 数字标识为:
#               * --x = 1(001)
#               * -w- = 2(010)
#               * -wx = 3(011)
#               * r-- = 4(100)
#               * r-x = 5(101)
#               * rw- = 6(110)
#               * rwx = 7(111)
# 第三列:root 为文件/目录的拥有者owner
# 第四列:it   为文件/目录的所属组group
#----------------------------------------------------------------------------------------------

通过上面的示例,可以初步了解Linux的权限设定的含义。 那么有 三个问题

1)如何设置权限?

chmod 修改文件/目录权限

#----------------------------------------------------------------------------------------------
# 1)chmod [OPTION]... MODE[,MODE]...     FILE... 使用字符模式修改权限
#       a. 修改一类用户的所有权限:      u=  g= o= ug=  a= u=,g=
#       b. 修改一类用户某位或某些位权限:u+  u- g+ g- o+ o- a+ a- + -
#----------------------------------------------------------------------------------------------
[root@centos7 testdir]# ll passwd
-rw-r--rw-. 1 root root 2352 Aug  7 20:54 passwd
[root@centos7 testdir]# chmod u=rwx,g+x,o-w passwd
[root@centos7 testdir]# ll passwd-rwxr-xr--. 1 root root 2352 Aug  7 20:54 passwd
[root@centos7 testdir]# chmod a=rwx passwd
[root@centos7 testdir]# ll passwd-rwxrwxrwx. 1 root root 2352 Aug  7 20:54 passwd
[root@centos7 testdir]# chmod u=rwx,go=rw passwd
[root@centos7 testdir]# ll passwd -rwxrw-rw-. 1 root root 2352 Aug  7 20:54 passwd

#----------------------------------------------------------------------------------------------
# 2)chmod [OPTION]... OCTAL-MODE         FILE... 使用8进制模式修改权限 
#----------------------------------------------------------------------------------------------
[root@centos7 testdir]# chmod -R 777 dir
[root@centos7 testdir]# tree -p .
├── [drwxrwxrwx]  dir
│   └── [-rwxrwxrwx]  f1
└── [-rwxrw-rw-]  passwd

#----------------------------------------------------------------------------------------------
# 3)chmod [OPTION]... --reference=RFILE  FILE... 参考RFILE文件的权限,将FILE的修改为同RFILE
#----------------------------------------------------------------------------------------------
[root@centos7 testdir]# lltotal 4drwxrwxrwx. 2 root root   15 Aug  8 11:23 dir
-rwxrw-rw-. 1 root root 2352 Aug  7 20:54 passwd
[root@centos7 testdir]# chmod --reference=passwd dir    ### 将dir目录的权限设为与passwd一样的权限
[root@centos7 testdir]# lltotal 4drwxrw-rw-. 2 root root   15 Aug  8 11:23 dir
-rwxrw-rw-. 1 root root 2352 Aug  7 20:54 passwd

#----------------------------------------------------------------------------------------------
# 4)大写X:给目录设定X权限,即对目录下现有内容,凡是目录都给予x权限,凡是文件都不增加x权限,不影响文件已有设定
#----------------------------------------------------------------------------------------------
[root@centos7 testdir]# tree -p /testdir/testdir
├── [drwxrw-rw-]  dir
│   ├── [-rw-rw-rw-]  cat2.sh
│   ├── [-rwxrwxrwx]  f1
│   └── [drwxrw-rw-]  subdir
└── [-rwxrw-rw-]  passwd

[root@centos7 testdir]# chmod -R g+rwX dir
[root@centos7 testdir]# tree -p /testdir/testdir
├── [drwxrwxrw-]  dir
│   ├── [-rw-rw-rw-]  cat2.sh
│   ├── [-rwxrwxrwx]  f1
│   └── [drwxrwxrw-]  subdir
└── [-rwxrw-rw-]  passwd
#----------------------------------------------------------------------------------------------
# 5)修改文件的属主、属组
#       chgrp  sales        testfile    ### 修改testfile的属组为sales
#       chown  root:admins  testfile    ### 将testfile的属主设为root,属组设为admins
#       chown  liang:       testfile    ### 将testfile的属组和属主均设为liang
#       chown  :liang       testfile    ### 将testfile的属组设为liang
#----------------------------------------------------------------------------------------------

2)三种权限rwx对文件和目录而言,含义有何差异?

读权限r

#----------------------------------------------------------------------------------------------
# 1)对文件而言,仅具备读权限,用户可查看当前workdir的文件内容
# 2)对目录而言,仅具备读权限,用户可查看目录内的文件列表,不能进入目录而无法查看目录下文件的元数据,
#    即使用户对目录下的文件也具有读权限
# 3)若用户需要查看、执行某个目录下的文件,需要具备如下条件(得一即可):
#   a. 用户想要查看或执行的文件 在用户当前的workdir下
#   b. 用户具有对目录的执行权限(目录的读权限可以没有,但建议设置,否则用户无法得知目录内文件列表的信息,
#      也不能使用tab键补全),具有对文件的读权限
# 4)对于文件/目录的元数据,用户需具有该文件或目录的上层目录的执行权限,至于对文件或目录本身是否拥有权限并不影响
#----------------------------------------------------------------------------------------------
[root@centos7 testdir]# chmod 777 /testdir          ### 使所有人都具有读写执行的权限
[root@centos7 testdir]# ll -d /testdirdrwxrwxrwx. 3 root root 42 Aug  7 15:29 /testdir

[root@centos7 testdir]# mkdir dir                   ### root用户创建/testdir/dir目录
[root@centos7 testdir]# chmod 754 dir               ### 权限设为754(owner读写执行,group读执行,other读)
[root@centos7 testdir]# cd dir
[root@centos7 dir]# touch f1 f2 f3                  ### root用户在/testdir/dir目录下创建文件f1,f2,f3
[root@centos7 dir]# tree -p /testdir                ### root用户查看/testdir的目录树及对应的权限/testdir
├── [drwxr-xr--]  dir
│   ├── [-rw-r--r--]  f1
│   ├── [-rw-r--r--]  f2
│   └── [-rw-r--r--]  f3
└── [-rw-r--r--]  passwd1 directory, 4 files

[root@centos7 testdir]# su liang               ### 临时切换到 liang 用户 
[liang@centos7 testdir]$ groups liang          ### 查看liang的组(对于dir及其下文件来说,liang属于other)
liang : liang wangcai it
[liang@centos7 testdir]$ pwd                   ### 查看liang用户当前所在的workdir/testdir

[liang@centos7 testdir]$ cat passwd            ### liang用户查看passwd文件内容
root:x:0:0:root:/root:/bin/bashliang:x:1000:1000:liang:/home/liang:/bin/bash
[liang@centos7 testdir]$ cd dir                ### (1)liang用户对于dir目录没有执行权限,不能进入dir目录
bash: cd: dir: Permission denied

[liang@centos7 testdir]$ ll -d dir             ### (2)liang用户查看 dir 目录本身
drwxr-xr--. 2 root root 33 Aug  7 17:09 dir    ###      
 [liang@centos7 testdir]$ cat /testdir/dir/f1  ### (3)liang用户查看/testdir/dir/f1的内容,但权限受限。
 cat: /testdir/dir/f1: Permission denied       ###  【问题1】为什么liang对f1有读权限,却发生访问被拒绝呢?
 [liang@centos7 testdir]$ ll dir               ### (4)liang用户 查看dir信息
 ls: cannot access dir/f1: Permission denied   ###     结果“Permission denied”及“???”,因为:
 ls: cannot access dir/f2: Permission denied   ###     1)liang对 dir 只有读权限,没有写与执行权限
 ls: cannot access dir/f3: Permission denied   ###     2)liang用 ll,能看dir下都有哪些文件
 total 0                                       ###     3)对无执行权限的dir下的文件,没获取文件元数据
 ?????????? ? ? ? ?            ? f1
 ?????????? ? ? ? ?            ? f2
 ?????????? ? ? ? ?            ? f3

[liang@centos7 testdir]$ exit
exit
[root@centos7 testdir]# chmod 755 dir          ### 切换至root,对dir设权限,使other用户具有r-x权限
[root@centos7 testdir]# tree -p /testdir/testdir
├── [drwxr-xr-x]  dir
│   ├── [-rw-r--r--]  f1
│   ├── [-rw-r--r--]  f2
│   └── [-rw-r--r--]  f3
└── [-rw-r--r--]  passwd

[root@centos7 testdir]# su liang                    ### 临时切换至liang用户
[liang@centos7 testdir]$ cat /testdir/dir/f1        ### (3’)获取dir执行权限后,查看f1 >>>参考(3)
this is file1 in /testdir/dir

[liang@centos7 testdir]$ ll dir                     ### (4’)获取dir执行权限后,查看dir>>>参考(4)
total 4-rw-r--r--. 1 root root 30 Aug  7 17:14 f1
-rw-r--r--. 1 root root  0 Aug  7 17:09 f2
-rw-r--r--. 1 root root  0 Aug  7 17:09 f3

[liang@centos7 testdir]$ cd dir                     ### (1’)获取dir执行权限后,进入dir>>>参考(1)
[liang@centos7 dir]$ 
[root@centos7 testdir]# chmod 751 dir               ### dir权限751,liang对dir目录仅有执行权限
[root@centos7 testdir]# ll
total 4drwxr-x--x. 2 root root   33 Aug  7 17:09 dir
-rw-r--r--. 1 root root 2338 Aug  5 10:43 passwd

[root@centos7 testdir]# su liang                    
[liang@centos7 testdir]$ ll dir                     ### (5)切至liang查看dir,无读权限,访问被拒绝
ls: cannot open directory dir: Permission denied
[liang@centos7 testdir]$ ll -d dir                  ### (5’)使用 ll -d 命令查看dir本身的信息
drwxr-x--x. 2 root root 33 Aug  7 17:09 dir

[liang@centos7 testdir]$ cat /testdir/dir/f1        ### (3’)liang对dir可执行,f1可读,可看f1的内容
this is file1 in /testdir/dir

#----------------------------------------------------------------------------------------------
# 对于文件/目录的元数据,用户需具有该文件或目录的上层目录的执行权限,至于对文件或目录本身是否拥有权限并不影响
#----------------------------------------------------------------------------------------------
[root@centos7 testdir]# chmod 754 dir               ### 修改dir权限,liang仅可读,对/testdir可读写执行
[root@centos7 testdir]# tree -p /testdir            ### 查看/testdir的目录树/testdir
├── [drwxr-xr--]  dir
│   ├── [-rw-r--r--]  f1
│   ├── [-rw-r--r--]  f2
│   ├── [-rw-r--r--]  f3
│   └── [-rw-rw-r--]  f4
└── [-rw-r--r--]  passwd1 directory, 5 files
[root@centos7 testdir]# su liang -c 'stat dir'      ### liang对dir仅可读,对/testdir可读写执行
  File: ‘dir’  Size: 42        	Blocks: 0          IO Block: 4096   
  directoryDevice: 805h/2053d	Inode: 33609792    Links: 2
  Access: (0754/drwxr-xr--)  Uid: (    0/    root)   Gid: (    0/    root)
  Context: unconfined_u:object_r:etc_runtime_t:s0
  Access: 2016-08-07 20:35:41.645416968 +0800
  Modify: 2016-08-07 20:19:11.577370211 +0800
  Change: 2016-08-07 20:35:33.845416599 +0800
 Birth: -
[root@centos7 testdir]# su liang -c 'stat dir/f1'   ### liang对dir、f1仅可读
stat: cannot stat ‘dir/f1’: Permission denied
[root@centos7 testdir]# chmod 751 dir               ### 修改dir权限,liang仅可执行,/testdir可读写执行
[root@centos7 testdir]# chmod 750 dir/f1            ### 修改dir/f1权限,使liang用户无权限
[root@centos7 testdir]# tree -p /testdir/testdir
├── [drwxr-x--x]  dir
│   ├── [-rwxr-x---]  f1
│   ├── [-rw-r--r--]  f2
│   ├── [-rw-r--r--]  f3
│   └── [-rw-rw-r--]  f4
└── [-rw-r--r--]  passwd

[root@centos7 testdir]# su liang -c 'stat dir'      ### liang对dir仅可执行,对/testdir可读写执行
  File: ‘dir’  Size: 42        	Blocks: 0          IO Block: 4096   
  directoryDevice: 805h/2053d	Inode: 33609792    Links: 2
  Access: (0751/drwxr-x--x)  Uid: (    0/    root)   Gid: (    0/    root)
  Context: unconfined_u:object_r:etc_runtime_t:s0
  Access: 2016-08-07 20:36:34.889419482 +0800
  Modify: 2016-08-07 20:19:11.577370211 +0800
  Change: 2016-08-07 20:36:20.875418820 +0800
 Birth: -
[root@centos7 testdir]# su liang -c 'stat dir/f1'   ### liang用户查看dir/f1的元数据(liang用户对dir仅有执行权限,对dir/f1无任何权限)
  File: ‘dir/f1’  Size: 0         	Blocks: 0          IO Block: 4096   
  regular empty fileDevice: 805h/2053d	Inode: 33609793    Links: 1
  Access: (0750/-rwxr-x---)  Uid: (    0/    root)   Gid: (    0/    root)
  Context: unconfined_u:object_r:etc_runtime_t:s0
  Access: 2016-08-07 20:12:25.865351051 +0800
  Modify: 2016-08-07 20:12:25.865351051 +0800
  Change: 2016-08-07 20:45:49.182445659 +0800
 Birth: -

写权限w

#----------------------------------------------------------------------------------------------
# 1)对于文件而言,拥有写权限,意味着用户可以修改文件内容,但是不能删除文件本身
# 2)对于目录而言,写权限以为着可以在目录中创建或删除文件,但是必须拥有执行权限才可以
#----------------------------------------------------------------------------------------------
[root@centos7 testdir]# ll
total 4
drwxr-xr-x. 2 root root   42 Aug  7 20:19 dir
-rw-r--r--. 1 root root 2338 Aug  5 10:43 passwd
[root@centos7 testdir]# su liang
[liang@centos7 testdir]$ echo "god is a girl" >> passwd ### liang对passwd无写权限,修改失败
bash: passwd: Permission denied
[liang@centos7 testdir]$ rm -f dir/f1                   ### liang用户对dir没有写权限,不能删除文件
rm: cannot remove ‘dir/f1’: Permission denied
[root@centos7 testdir]# chmod 753 dir                   ### 修改dir权限
[root@centos7 testdir]# chmod 646 passwd                ### 修改passwd权限
[root@centos7 testdir]# su liang 
[liang@centos7 testdir]$ echo "god is a girl" >> passwd ### 修改后,liang对passwd有写权限,修改成功
[liang@centos7 testdir]$ rm -f dir/f1                   ### 修改后,liang对dir有写权限,能删除文件
[liang@centos7 testdir]$ 
[root@centos7 testdir]# mkdir dir                       ### 创建dir目录
[root@centos7 testdir]# touch dir/f1 dir/f2 dir/f3      ### 在dir目录下创建f1,f2,f3文件
[root@centos7 testdir]# chmod 754 dir                   ### 设dir权限为:754,liang用户只有读权限
[root@centos7 testdir]# tree -p /testdir                ### 查看/testdir的目录树/testdir
├── [drwxr-xr--]  dir
│   ├── [-rw-r--r--]  f1
│   ├── [-rw-r--r--]  f2
│   └── [-rw-r--r--]  f3
└── [-rw-r--r--]  passwd1 directory, 4 files

[root@centos7 testdir]# su liang                        ### 切换至liang用户
[liang@centos7 testdir]$ tree -p /testdir               ### 查看/testdir的目录树/testdir
├── [drwxr-xr--]  dir
└── [-rw-r--r--]  passwd1 directory, 1 file

[liang@centos7 testdir]$ touch dir/f4                   ### liang对dir仅可读,不能在目录下创建文件
touch: cannot touch ‘dir/f4’: Permission denied

[root@centos7 testdir]# chmod 751 dir                   ### 更改dir权限设定,other权限设为仅可执行
[root@centos7 testdir]# ll -d dir
drwxr-x--x. 2 root root 42 Aug  7 20:19 dir
[root@centos7 testdir]# su liang
[liang@centos7 testdir]$ touch dir/f5                   ### liang对dir仅可执行,不能创建文件
touch: cannot touch ‘dir/f5’: Permission denied


[root@centos7 testdir]# chmod 753 dir                   ### 更改dir的权限设定,为other增加w权限
[root@centos7 testdir]# tree -p /testdir/testdir
├── [drwxr-x-wx]  dir
│   ├── [-rw-r--r--]  f1
│   ├── [-rw-r--r--]  f2
│   └── [-rw-r--r--]  f3
└── [-rw-r--r--]  passwd1 directory, 4 files

[root@centos7 testdir]# su liang                        
[liang@centos7 testdir]$ tree -p /testdir               
/testdir
├── [drwxr-x-wx]  dir [error opening dir] ###liang看/testdir目录树,对dir不可读,不能列内部文件信息
└── [-rw-r--r--]  passwd
[liang@centos7 testdir]$ touch dir/f4       ###liang对dir可写执行,可在其中建/删文件(删除示例略)
[liang@centos7 testdir]$

执行权限x

#----------------------------------------------------------------------------------------------
# 1)对于二进制程序或脚本而言,可以执行文件
# 2)对于目录而言,意味着用户可以进入目录,访问目录中的文件的元数据,若要查看文件内容或修改文件,则需拥有读写权限
#----------------------------------------------------------------------------------------------
[root@centos7 testdir]# chmod 754 /bin/cat                   ### 修改/bin/cat权限,使liang不可执行
[root@centos7 testdir]# ll /bin/cat /testdir/dir/f2             
-rwxr-xr--. 1 root    root    54048 Oct 10  2016 /bin/cat
-rw-r--r--. 1 wangcai wangcai    13 Aug  7 21:12 /testdir/dir/f2
[root@centos7 testdir]# su liang -c 'cat /testdir/dir/f2' ### 用/bin/cat看f2,提示/usr/bin/cat权限受限
bash: /usr/bin/cat: Permission denied                     ### 该提示为v7版本,v6:/bin/cat: Permission denied.

3)为什么不同的用户创建的文件和目录默认的权限不一致呢?

umask

  • 说明

    用户登录系统后,在创建文件和目录后会发现其都有了默认的权限设定,该默认设定即为umask。umask采用补码的形式,与chmod相反。

  • 语法说明

#----------------------------------------------------------------------------------------------
# 1) umask      : 查看用户默认的权限设定补码(数字形式)
#       a. root用户    :默认022
#       b. 非特权用户   :默认002
# 2) umask -S   :查看用户默认的权限设定补码(字符形式)
# 3) umask 补码 :修改当前用户的umask值
# 4) 全局设置: /etc/bashrc 
#    用户设置:~/.bashrc
#----------------------------------------------------------------------------------------------[root@centos7 ~]# umask             ### 查看root用户的umask0022[root@centos7 ~]# umask -S          ### 查看root用户的umasku=rwx,g=rx,o=rx
[root@centos7 ~]# umask 033         ### 修改root用户的umask
[root@centos7 ~]# umask0033
[liang@centos7 root]$ umask         ### 查看liang用户的umask
0002
[liang@centos7 root]$ umask -S      ### 查看liang用户的umask
u=rwx,g=rwx,o=rx

[root@centos7 ~]# umask -p
umask 0022
  • 注意点

#----------------------------------------------------------------------------------------------# 1) 对于目录而言,目录的权限 = 777 - umask# 2) 对于文件而言,文件的权限 = 666 - umask 的结果的“奇数位”+1#----------------------------------------------------------------------------------------------[root@centos7 dir]# lltotal 0-rw-r--r--. 1 root root 0 Aug  8 10:07 f1       ### 文件f1的权限为  :644 = 666-022(root的umask=022)-rw-rw-rw-. 1 root root 0 Aug  8 10:10 f2       ### 文件f2的权限为  :666 = 666-011 = 655,655的奇数位+1 = 666(root的umask=011)drwxr-xr-x. 2 root root 6 Aug  8 10:07 test     ### 目录test的权限为:755 = 777-022(root的umask=022)drwxrw-rw-. 2 root root 6 Aug  8 10:10 test2    ### 目录test的权限为:766 = 777-011(root的umask=011)

特殊权限SUID/SGID/Sticky

本文最开始,场景2 中描述的情况,使用上述的权限并没有办法解决,这就引入了特权体系。

            前提内容:文件有属主和属组,同样一个程序被启动为进程后也有属主和属组 

            (1)程序能发启动为进程,取决于发起者是否对程序文件有执行权限(不管是owner、group、other都可以) 

            (2)程序启动为进程后,进程的属主为发起者,属组为发起者所属的组 

            (3)进程若要访问文件,要看进程的发起者的权限,其顺序为: 

                    (a)判断 文件属主 进程发起者 的关系,相同则应用属主权限,不再向后看属组和其他 

                    (b)判断 文件属组 进程发起者 所属组的关系,相同则应用属组权限,不再向后看其他 

                    (c)应用其他权限

    SUID

  • 应用场景

    普通用户需要在执行某些操作时,拥有root用户的权限(如修改密码),SUID可以使用户临时以root用户或属主的身份来执行二进制程序。

    注意:

    • 1)SUID只能应用于二进制可执行程序,对目录无效

    • 2)用户将程序启动为进程之后,其进程的属主为原程序的属主

    • 3)s: 属主拥有x权限; S:属主没有x权限

  • 示例说明

#----------------------------------------------------------------------------------------------
# 修改SUID的设定:chmod u+s/u-s/4XXX FILE... (前提:必须有x权限)
#----------------------------------------------------------------------------------------------
[root@centos7 dir]# ll /bin/passwd              ### /bin/passwd有SUID
-rwsr-xr-x. 1 root root 27832 Jun 10  2014 /bin/passwd      
[root@centos7 dir]# su liang                    ### liang执行时继承属主root权限,以属主身份发起进程       
[liang@centos7 dir]$ passwd                     ### 切换至liang用户,执行/bin/passwd,挂起程序
Changing password for user liang.
Changing password for liang.
(current) UNIX password: 

[root@centos7 ~]# ps aux | grep passwd          ### 查看进程发现,passwd进程的发起人为root
root       4107  0.0  0.1 185304  2336 pts/1    S+   10:43   0:00 passwd

SGID

1)文件:SGID 使用户在执行某程序时,以该程序所属组的身份运行该程序,程序启动为进程后的属组为原程序的属组
        s: group拥有x权限 
        S:group没有x权限
2)目录:        
        a. 默认情况下,用户创建的文件/目录的属组为用户的主组;        
        b. 一旦某目录被设定了SGID,则对此目录有写权限的用户 在此目录中创建的文件 所属的组为此目录的属组
        c. 通常用于创建一个协作目录
#----------------------------------------------------------------------------------------------
# 修改SGID的设定:chmod g+s/g-s/2xxx FILE/DIR... (前提:必须有x权限)
#----------------------------------------------------------------------------------------------
[root@centos7 testdir]# groups liang                            ### liang用户的所属组
liang : liang wangcai it
[root@centos7 testdir]# tree -pgu /testdir                      ### 查看目录树、权限、属主、属组
/testdir
├── [drwxrwxrwx root     it      ]  dir
│   ├── [-rw-rw-rw- root     root    ]  f2
│   └── [drwxr-xr-x root     root    ]  test
└── [-rw-r--rw- root     root    ]  passwd

[root@centos7 testdir]# chmod g+s dir                           ### 修改dir的权限,增加SGID
[root@centos7 testdir]# su liang -c "touch /testdir/dir/f3"     ### liang用户创建f3
[root@centos7 testdir]# tree -pgu /testdir            ### 查看发现f3属组为dir属组,其他原有文件不改变
/testdir
├── [drwxrwsrwx root     it      ]  dir
│   ├── [-rw-rw-rw- root     root    ]  f2
│   ├── [-rw-rw-rw- liang    it      ]  f3
│   └── [drwxr-xr-x root     root    ]  test
└── [-rw-r--rw- root     root    ]  passwd

Sticky

1. 对于拥有写权限的目录,用户可以删除目录中的任何文件,无论用户对该文件是否有任何权限或拥有权
2. 对目录设置Sticy权限,用户可以修改其下的文件,但只有root或owner才可以删除文件
3. sticky 设置在文件上无意义
4. t: other拥有x权限; 
   T:other没有x权限
#----------------------------------------------------------------------------------------------
# 修改SGID的设定:chmod o+t/o-t/1xxx DIR... 
#----------------------------------------------------------------------------------------------
[root@centos7 testdir]# tree -pgu /testdir                      ### 当前dir目录设定/testdir
├── [drwxrwxrwx root     root    ]  dir
└── [-rw-r--rw- root     root    ]  passwd
[root@centos7 testdir]# su liang -c "touch /testdir/dir/f1"     ### liang用户创建f1
[root@centos7 testdir]# chmod o+t dir                           ### 为dir增加Sticy权限
[root@centos7 testdir]# tree -pgu /testdir/testdir
├── [drwxrwxrwt root     root    ]  dir
│   └── [-rw-rw-rw- liang    liang   ]  f1
└── [-rw-r--rw- root     root    ]  passwd

[root@centos7 testdir]# su wangcai -c "rm -rf /testdir/dir/f1"  ### wangcai用户无法删除f1
rm: cannot remove ‘/testdir/dir/f1’: Operation not permitted

[root@centos7 testdir]# su wangcai -c "echo "wangcai" >> /testdir/dir/f1" ### wangcai可以修改f1
[root@centos7 testdir]#

chattr 设定 / lsattr查看 文件特殊属性

  • chattr语法说明:

    chattr [ -RVf ] [ -v version ] [ mode ] files...
    其中mode的格式为:+-=[aAcCdDeijsStTu]
  • 示例

#----------------------------------------------------------------------------------------------
# 1) chattr +i :不能删除,改名,更改 
#----------------------------------------------------------------------------------------------
[root@centos7 testdir]# chattr +i passwd.txt        ### 为文件增加 i 属性
[root@centos7 testdir]# lsattr passwd.txt 
----i----------- passwd.txt

[root@centos7 testdir]# echo xx >> passwd.txt 
-bash: passwd.txt: Permission denied

[root@centos7 testdir]# mv passwd.txt user.txt
mv: cannot move ‘passwd.txt’ to ‘user.txt’: Operation not permitted

[root@centos7 testdir]# rm passwd.txt 
rm: cannot remove ‘passwd.txt’: Operation not permitted

[root@centos7 testdir]# chattr -i passwd.txt 
[root@centos7 testdir]# lsattr passwd.txt 
---------------- passwd.txt

[root@centos7 testdir]# echo test >> passwd.txt 
[root@centos7 testdir]#

#----------------------------------------------------------------------------------------------
# 2) chattr +A :不能更改atime 
#----------------------------------------------------------------------------------------------
[root@centos7 testdir]# stat passwd.txt 
……
Access: 2016-08-02 20:37:10.497505648 +0800
……  

[root@centos7 testdir]# chattr +A passwd.txt            ### 增加A属性,防止更改atime
[root@centos7 testdir]# cat passwd.txt > /dev/null
[root@centos7 testdir]# stat passwd.txt 
……
Access: 2016-08-02 20:37:10.497505648 +0800             ### 读后,atime没有改变   
……

[root@centos7 testdir]# ll passwd.txt 
-rwxrwxrwx. 1 root it 64 Aug  1 16:56 passwd.txt
[root@centos7 testdir]# lsattr passwd.txt               ### 查看passwd.txt的特殊属性
-------A-------- passwd.txt
[root@centos7 testdir]# chattr -A passwd.txt            ### 去掉A属性,允许更改atime
[root@centos7 testdir]# cat passwd.txt > /dev/null
[root@centos7 testdir]# lsattr passwd.txt 
---------------- passwd.txt
[root@centos7 testdir]# stat passwd.txt 
……
Access: 2016-08-03 16:47:23.768832575 +0800             ### 读后,atime发生改变
……

#----------------------------------------------------------------------------------------------
# 3) chattr +a :只能追加文件内容,不能覆盖、删除
#----------------------------------------------------------------------------------------------
[root@centos7 testdir]# chattr +a testfile

[root@centos7 testdir]# echo "haha" > testfile
-bash: testfile: Operation not permitted

[root@centos7 testdir]# echo "haha" >> testfile
[root@centos7 testdir]# cat testfile haha

[root@centos7 testdir]# rm -f testfile 
rm: cannot remove ‘testfile’: Operation not permitted

[root@centos7 testdir]# chattr -a testfile 
[root@centos7 testdir]# rm -f testfile

ACL(Access Control List)访问控制列表

  • 说明

    1. ACL 可以实现在除了文件的所有者、所属组、其他人之外,对更多的场景做出对应的权限设置。

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

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

                 tune2fs –o acl /dev/sdb1 mount –o acl /dev/sdb1 /mnt

    4. ACL生效顺序:所有者,自定义用户,自定义组,其他人

setfacl

1. ACL文件上的group权限是mask 值(自定义用户,自定义组,拥有组的最大权限),而非传统的组权限
2. 默认ACL权限给了x,文件也不会继承x权限
3. base ACL 不能删除
4. mask只影响除所有者和other的之外的人和组的最大权限
5. Mask需要与用户的权限进行逻辑与运算后,才能变成有限的权限(Effective  Permission)
6. 用户或组的设置必须存在于mask权限设定范围内才会生效。
7. --set选项会把原有的ACL项都删除,用新的替代,需要注意的是一定要包含UGO的设置,不能象-m一样只是添加ACL就可以.
    如:setfacl --set u::rw,u:wang:rw,g::r,o::- file1
# setfacl  -m  u:wang:rwx       file|directory      ### 修改文件或目录的ACL设定,wang权限为rwx
# setfacl  -m  g:salesgroup:rw  file|directory      ### 修改文件或目录ACL设定,salesgroup组权限为rw
# setfacl  -m  d:u:wang:rx      directory           ### 修改目录的ACL的默认设定(只能针对于目录)
# setfacl  -m  mask::rx         file                ### 修改文件的mask值
# setfacl  -Rm g:sales:rwX      directory           ### 修改目录及下层内容的ACL的默认设定(只能对目录)
# setfacl  -M  file.acl         file|directory      ### 按照file.acl的指定要求,设定文件或目录的权限
# setfacl  -x  u:wang           file |directory     ### 清除wang用户的权限设定
# setfacl  -X  file.acl         directory           ### 按照file.acl的指定要求,清除目录的权限设定
# setfacl  -k                   directory           ### 删除目录默认ACL权限
# setfacl  -b                   file1               ### 清除所有ACL权限
# getfacl  file1 | setfacl --set-file=- file2       ### 复制file1的acl权限给file2
# setfacl --set u::rw,u:wang:rw,g::r,o::- file1     ### 将原ACL项删除,用新的代替,要包含UGO的设置,
                                                    ###   不能像-m一样只是添加ACL即可

getfacl

#----------------------------------------------------------------------------------------------
# 1. 查看文件或目录的ACL设置: getfacl file|directory 
# 2. getfacl 可看到特殊权限 :flags
#----------------------------------------------------------------------------------------------
[root@centos7 testdir]# getfacl dir
# file: dir
# owner: root
# group: root
# flags: --t
user::rwx
group::rwx
other::rwx

ACL 备份与恢复

1. 文件操作命令cp和mv都支持ACL,只是cp命令需要加上-p 参数。但tar等常见备份工具不会保留目录和文件的ACL信息
# getfacl -R     /tmp/dir1 > acl.txt         ### 将dir1目录及其下内容的ACL设置备份到文件acl.txt中
# setfacl -R -b  /tmp/dir1                   ### 清除dir目录及其下内容的ACL设置
# setfacl -R --set-file=acl.txt  /tmp/dir1   ### 用acl.txt的设置恢复dir1的ACL权限设置
# getfacl -R     /tmp/dir1                   ### 查看dir1目录及其下内容的ACL设置

原创文章,作者:taobaibai,如若转载,请注明出处:http://www.178linux.com/31280

(0)
taobaibaitaobaibai
上一篇 2016-08-19
下一篇 2016-08-19

相关推荐

  • DNS的基本配置、子域授权与bind编译(第十八九天)

        DNS( Domain Name System)是“域名系统”的英文缩写,是一种组织成域层次结构的计算机和网络服务命名系统,它用于TCP/IP网络,它所提供的服务是用来将主机名和域名转换为IP地址的工作。     DNS利用类似于树形目录的结构,将主机名的管理分配在不同层…

    Linux干货 2016-06-12
  • 配置Nginx作为反向代理服务器

    配置Nginx作为反向代理服务器      一、nginx作为反向代理的工作模型: 1、nginx作为反向代理的工作模型       nginx工作在应用层,其能理解并可以提取出http请求报文中的首部信息中的请求方法、url、http协议版本等信息。   &…

    Linux干货 2016-10-29
  • https搭建

    https             http over ssl = https 443/tcp                 ssl: v3           &nb…

    Linux干货 2016-06-28
  • Python函数式编程指南:目录和参考

    目录: 概述 这一篇简要地描述了函数式编程和一些相关的概念。 函数 这一篇展示了关于函数可能不常用到的部分特征并尝试引导诸位使用函数式的思维解决问题,并介绍了诸多有用的内建函数。 迭代器 这一篇介绍了迭代器以及Python对迭代器的语法级的支持,还包括了内置模块itertools的介绍。 生成器 这一篇介绍了自定义的迭代器——生成器,并展示了生成器的用途和使…

    Linux干货 2015-03-11
  • CentOS计划任务详解

    一、计划任务应用场景:        需要每天对服务器上的数据进行备份,但是白天服务器的访问量较大,服务器承受着较大的压力,备份任务只能在夜晚服务器较空闲时才能进行。或者需要临时在某时间点执行一个任务等,都需要用到计划任务的功能。 二、计划任务分类:    &…

    Linux干货 2016-09-09
  • LAMP的编译安装

    一、编译安装amp: (1)系统环境:centos6,7 httpd依赖于apr和apr-util appache protable runtime (2)开发环境: Development Tools,Server Platform Development (3)各程序的版本: httpd:2.2,2.4 php:5.x mysql:5.1,5.5,5.6…

    Linux干货 2016-10-17

评论列表(4条)

  • 护栏网
    护栏网 2016-11-21 10:15

    不错的文章,内容博学多才.禁止此消息:nolinkok@163.com

  • 钢筋网
    钢筋网 2016-11-28 09:40

    好文章,内容欢风华丽.禁止此消息:nolinkok@163.com

  • 外墙保温网格布
    外墙保温网格布 2016-12-05 09:46

    好文章,内容一针见血.禁止此消息:nolinkok@163.com

  • 丝网
    丝网 2016-12-10 18:27

    好文章,内容惊心动魄.禁止此消息:nolinkok@163.com