使用ls命令查看文件,可以发现列表分为几个部分,各自所代表的意义如图所示:

linux用户权限管理_linux

文件属性

文件属性操作

    chown 设置文件的所有者

    chgrp 设置文件的属组信息

修改文件的属主:chown

语法:chown[OPTION]... [OWNER][:[GROUP]] FILE...

用法:

    OWNER

    OWNER:GROUP

    :GROUP

    命令中的冒号可用.替换;

    -R: 递归

chown[OPTION]... --reference=RFILE FILE...

linux用户权限管理_reference_02

修改文件的属组:chgrp

语法:

chgrp[OPTION]... GROUP FILE...

chgrp[OPTION]... --reference=RFILE FILE...参考RFILE文件的属组,将FILE的修改为同RFILE

linux用户权限管理_linux_03

用法:-R 递归

linux用户权限管理_reference_04



文件权限

文件的权限主要针对三类对象进行定义:

owner: 属主, u

group: 属组, g

other: 其他, o

每个文件针对每类访问者都定义了三种权限:

r: Readable

w: Writable

x: eXcutable

同样的权限作用于不同的文件是所代表的意义有所不同:

文件:

r: 可使用文件查看类工具获取其内容

w: 可修改其内容

x: 可以把此文件提请内核启动为一个进程

目录:

r: 可以使用ls查看此目录中文件列表

w: 可在此目录中创建文件,也可删除此目录中的文件

x: 可以使用ls -l查看此目录中文件列表,可以cd进入此目录

X:只给目录x权限,不给文件x权限

文件权限对照表:

linux用户权限管理_reference_05

权限也可以使用八进制数字表示,相对应的

---  000 0

--x  001 1

-w-  010 2

-wx  011 3

r--  100 4

r-x  101 5

rw-  110 6

rwx  111 7

例如:

rw- r-- ---:640

rwx r-x r-x: 755


修改文件权限

语法:

chmod[OPTION]... OCTAL-MODE FILE...

-R: 递归修改权限

chmod[OPTION]... MODE[,MODE]... FILE...

MODE:

修改一类用户的所有权限:

u= g= o= ug= a= u=,g=

修改一类用户某位或某些位权限

u+ u-g+ g-o+ o-a+ a-+ -

chmod[OPTION]... --reference=RFILE FILE...

参考RFILE文件的权限,将FILE的修改为同RFILE;

linux用户权限管理_linux_06

X:只给目录x权限,不给文件x权限(若文件初始有x权限,则增加)

linux用户权限管理_访问者_07

也可数字表示权限

linux用户权限管理_linux_08

新建文件和目录的默认权限

新建普通文件

用户新建文件就会发现新建文件的权限不是完整的权限,

linux用户权限管理_reference_09

而普通用户所新建的文件的权限和root所创建的文件的权限又有所不同

linux用户权限管理_reference_10

新建目录

新建目录可以发现新建目录的权限也是不完整,但是和新建的普通文件的权限还是有些不同

linux用户权限管理_访问者_11

普通用户所新建的目录的权限也和root新建的目录权限有所不同。

linux用户权限管理_访问者_12

这是因为有umask的存在:

什么是umask?

umask一般是用在你初始创建一个目录或者文件的时候赋予他们的权限,umask设置了用户创建文件的默认权限,它与chmod的效果刚好相反,umask设置的是权限“补码”,而chmod设置的是文件权限码。一般在/etc/profile、$ [HOME]/.bash_profile或$[HOME]/.profile中设置umask值。

系统管理员可以根据需要来自己设定一个合理的umask值,

root和普通用户的 umask值有所不同

非特权用户umask是002

root的umask是022

linux用户权限管理_reference_13

这四个数字分别代表着什么意思?( 注:一般使用时只使用后三位)

前面提到用户的权限可以使用数字的方式来表达,这里同样是使用数字来表达权限的意思,只是这里的数字代表的是赋值权限的时候所舍弃的值。

这里首先要说明两点:

  1、针对目录来说x权限代表可以进入该目录,所以说对于这个权限初始赋值是没什么问题的;

  2、针对文件的x的权限代表执行,这个风险太高,所以一般权限初始赋值必须去掉x的;

第一个数字表示:suid丢弃的权限

第二个数字表示:文件或目录属主所需要丢弃的值

第三个数字表示:文件或目录属组所需要丢弃的值

第四个数字表示:文件或目录的其他用户所需要丢弃的值,

因为文件一般情况下不给予执行权限,所以:

新建FILE权限: 666-umask

如果所得结果某位存在执行(奇数)权限,则将其权限+1

那么现在就可以解释root用户创建新文件的权限为:

666 - 022 = 644,与上图相对应

因为要进入目录需要执行权限,所以:

新建DIR权限: 777-umask

umask命令:

umask: 查看

umask#: 设定

umask002

umask –S 模式方式显示

linux用户权限管理_reference_14

umask –p 输出可被调用(经常使用于脚本文件)

使用命令设置只在当前shell有效,要永久生效就需要写入配置文件了。

全局设置:/etc/bashrc       用户设置:~/.bashrc

这里可以使用umask命令设置后在使用的-p选项写入文件:

linux用户权限管理_reference_15

例:误删除了用户user1的家目录,请重建并恢复该用户家目录及相应的权限属性

1、[root@localhost ~]# cp -r  /etc/skel/.   /testdir/user1name

2、[root@localhost ~]# chown -R user1:user1 /testdir/user1name/

3、[root@localhost ~]# chmod 700 /testdir/user1name/

linux用户权限管理_访问者_16

linux文件系统上的特殊权限:

linux文件系统中不仅仅只有rwx三种权限,为了满足工作的需要,linux文件系统中还有三种特殊权限,SUID,SGID,Sticky,他们所面对的对象分别是 USER,GROUPS,OTHER.

说着三种特殊权限 ,就要提一下linux中的安全上下文观念了,

什么是安全上下文呢?

linux安全上下文:

用户不同,所拥有的权限也有所不同,不同的用户可以使用同一个命令,但是所达到的效果往往有所不同,这是因为,用户在系统中所发起的进程,能够访问资源的权限取决于进程的运行者身份。

运行中的程序以进程发起者的身份运行:

root: /bin/cat

mage: /bin/cat

linux用户权限管理_reference_17

可以看到,root用户和普通用户执行同一个命令出现了两种不同的现象。

linux用户权限管理_访问者_18

前提:文件有属主和属组;进程也有属主和属组;

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

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

(3) 进程访问文件时的权限,取决于进程的发起者

    (a) 进程的发起者,同文件的属主:则应用文件属主权限

    (b) 进程的发起者,属于文件属组;则应用文件属组权限

    (c) 应用文件“其它”权限

    


可执行文件上SUID权限

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

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

SUID只对二进制可执行程序有效

SUID设置在目录上无意义

权限设定:

chmod  u+s  FILE...

chmod  u-s   FILE...

权限位映射:

SUID: user,占据属主的执行权限位

s: 属主拥有x权限

S:属主没有x权限

文件必须有x权限才能生效,若没有x权限,加上SUID权限后不生效,而且将以“S”的形式展现

例:

linux用户权限管理_访问者_19

平时用户修改密码使用passwd命令,可以看下passwd命令的二进制文件权限和/etc/passwd文件的属性可以发现普通用户可以更改密码的原因:

/etc/passwd文件属组和其他用户是没有写权限的,所以普通用户无法更改密码文件,可以平时普通用户确实可以修改自己的密码,这是因为当普通用户执行passwd命令时,因为/bin/passwd文件具SUID权限,所以当执行passwd命令时,是以进程属主身份也就是root发起的,这样就可以修改密码了。

linux用户权限管理_reference_20



可执行文件上SGID权限

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

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

权限设定:

chmod g+s FILE...

chmod  g-s FILE...

权限位映射:

SGID: group,占据属组的执行权限位

s: group拥有x权限

S:group没有x权限

例:

如cat命令文件原本权限为755其他用户也有执行权限,更改为750,使其他用户没有执行权限;

linux用户权限管理_reference_21

赋予cat文件SGID权限

linux用户权限管理_访问者_22

将user1用户加入root组,再使用cat命令可以正常查看。

linux用户权限管理_linux_23

所以:具有SGID权限的可执行文件,启动为进程之后,其进程的属主为原程序文件的属组




目录上的SGID权限

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

一旦某目录被设定了SGID,则对此目录有写权限的用户在此目录中创建的文件所属的组为此目录的属组

通常用于创建一个协作目录

权限设定:

chmod g+s DIR...

chmod g-s DIR...

linux用户权限管理_reference_24

更改目录权限[root@localhost ~]# chmod g+s /home/user1/ff

再创建文件可以看到属组和目录属组一致:

linux用户权限管理_linux_25

Sticky 位

具有写权限的目录通常用户可以删除该目录中的任何文件,无论该文件的权限或拥有权

在目录设置Sticky 位,只有文件的所有者或root可以删除该文件

sticky 设置在文件上无意义

权限设定:

chmod o+t DIR...

chmod  o-t DIR...

权限位映射:

  Sticky: other,占据other的执行权限位

t: other拥有x权限

T:other没有x权限

如:在/testdir目录下有三个文件属主属组都不同

linux用户权限管理_linux_26

使用任意用户可以删除其他用户的文件

linux用户权限管理_reference_27

给/testidr目录加上Sticky权限后,可以发现只能删除属于自己的文件

linux用户权限管理_reference_28

linux中普通权限可以使用使用数字使用,特殊权限同样可以使用数字表示

计算方法和普通权限的计算方法相同

SUID SGID STICKY

000 0

001 1

010 2

011 3

100 4

101 5

110 6

111 7

如:添加SUID权限

chmod 4777  FILENAME

linux用户权限管理_linux_29

有时为了保护重要文件,可能需要设定一些特定的属性,如:不能更改,删除。这是就需要用到

命令:chattr

禁止删除,改名,更改:

chattr +i

取消:chattr -i

linux用户权限管理_reference_30

只能增加:

    chattr +a

取消:chattr -a

linux用户权限管理_访问者_31

lsattr 显示特定属性

linux用户权限管理_访问者_32

访问控制列表

上述介绍的几种权限只是针对三种用户,属主,属组,其他人。远远不够满足平时的使用,如想让某个用户查看文件,而又不影响属组其他人的权限,这时就需要使用访问控制列表了。它可以实现灵活的管理权限管理。

ACL:Access Control List,实现灵活的权限管理

除了文件的所有者,所属组和其它人,可以对更多的用户设置权限

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

tune2fs –o acl/dev/sdb1

mount –o acl/dev/sdb1 /mnt

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

setfacl设置文件的ACL权限

-m :修改后续的acl参数给文件使用    u:USERNAME:权限   filename

-x: 删除后续的参数    u:USERNAME

-b:删除所有的acl设置参数

-k:删除默认的acl参数

-R:递归设置acl

-d:设置默认的acl参数,只对目录有效。

--set选项会把原有的ACL项都删除,用新的替代,需要注意的是一定要包含UGO的设置,不能象 -m一样只是添加ACL就可以.如:

setfacl --set u::rw,u:wang:rw,g::r,o::-file1

递归创建ACL权限:

setfacl -Rm g:GROUP:rwX directory

对目录下新建的文件继承目录ACL权限:

setfacl -m d:u:USER:rx directory

setfacl-k dir 删除默认ACL权限

setfacl -b file1清除所有ACL权限

getfacl:查看文件的acl权限

参数基本和setfacl相同

getfacl  file1 | setfacl  --set-file=-  file2 复制file1的acl权限给file2

批量修改acl权限:

1、编辑一个文件,

格式: u:USERNAME:权限

    g:GROUPNAME:权限

2、setfacl -M file.acl  file|directory

批量删除acl权限:

1、编辑一个文件

格式:u:username

g :  groupname

2、setfacl -X file.acl  file|directory

ACL文件上的group权限是mask 值(自定义用户,自定义组,拥有组的最大权限),而非传统的组权限

getfacl可看到特殊权限:flags

默认ACL权限给了x,文件也不会继承x权限。

mask权限:

mask权限恶意理解为“有效权限”的意思,它的意思为用户或组所设置的权限必须要存在于mask的权限范围内才会生效。

mask只影响除所有者和other的之外的人和组的最大权限,mask需要与用户的权限进行逻辑与运算后,才能变成有限的权限(Effective Permission)

设置mask值

setfacl-m mask::rx file

前文曾提到umask,那么和这个mask有什么区别呢?

umask:是在设置初始文件时赋予它们默认的权限,是做 “减法”,通过文件的最大权限减去umask的值就是文件初始的权限的值。也可以叫做权限的“补码”。

而acl中的mask值,是针对特定的对象,设置一个硬性的标准,针对的对象所有权限不能超过mask权限。 umask与mask相同点就是都是对权限进行限制。不同点就是umask是文件权限的“补码”,而mask是针对对象的权限最大值。

备份和恢复ACL

有时备份或转移文件时,文件会丢失ACL权限,而主要的文件操作命令cp和mv都支持ACL,只是cp命令需要加上-p 参数。但是tar等常见的备份工具是不会保留目录和文件的ACL信息。这是就需要先将文件的acl属性保存至一个文件,备份文件后,在用保存的属性文件恢复本份文件的acl权限。

#getfacl -R /tmp/dir1 > acl.txt

#setfacl -R -b /tmp/dir1

#setfacl -R --set-file=acl.txt /tmp/dir1

#getfacl -R /tmp/dir1

例:

在/data/testdir里创建的新文件自动属于g1组,组g2的成员如:user2能对这些新文件有读写权限,组g3的成员如:user3只能对新文件有读权限,其它用户(不属于g1,g2,g3)不能访问这个文件夹。

1、将文件的属组更改为g1,

#  chgrp g1 /data/testdir/

2、将文件加上SGID权限,其他人权限为0

#chmod 2770 /data/testdir/

3、设置acl权限

#setfacl -m g:g2:rwx /data/testdir/

#setfacl -m g:g3:rx /data/testdir/

#setfacl -m d:g:g2:rw /data/testdir/

# setfacl -m d:g:g3:r /data/testdir/

目录的acl权限:

linux用户权限管理_linux_33

文件下新建目录的acl权限

linux用户权限管理_reference_34

user2可以读写:

linux用户权限管理_linux_35

user3只有写权限:

linux用户权限管理_访问者_36

其他人不能访问文件夹:

linux用户权限管理_reference_37