服务器内有了不同的账号,那么怎么界定哪些文件属于哪些用户?有时我们还想共享我们的给特定的人?有时我们还想共享文件给所有的人?既然有了这么多需求,我们linux中是怎么管理文件的,是怎么满足我们需求的。身为管理员我们需要做什么?它的功能我们怎么合理运用才可以最大限度的保护系统的安全。第一节第二部分很重要。

1文件的权限

庖丁解牛前是绕牛三周。牛分为两种,一种是文件,一种是目录。不同的牛要用不同的刀。

1)       文件的权限,简单看文件权限,使用ll命令查看

-rwxr--r--  1 rootroot     25 Oct 25 02:58 test

第一位文件类型

2-4位是文件的属主的权限,r代表root具有读权限,w代表有写权限,x代表root具有执行权限。

5-7位是文件的属组的权限,-代表没有该位的权限。

8-10位是文件的其它权限

1这里是文件的硬链接数

root是文件的属主名

root是文件的属组名

25是文件的大小

Oct 25 02:58是文件的修改时间

最后test是文件名

2)       目录权限

目录的权限结构和文件一样,但是目录的权限位和文件权限位代表的意义是完全不同的。目录的存储的结构,大家是否记得,这个很重要,只有熟记目录的目录结构才能更好的理解目录权限位的作用。我们回忆一下目录的存储结构,目录的名字和权限信息都存在inode中,目录对应的block中存放的是子目录的名字和inode号,有趣的事情就发生在这里。当我们更改文件名的时候,我们更改的是什么?对,更改的是文件父目录的block,这时我们需要什么权限呢!嗯,父目录的写权限。这里我们我们可以说目录的权限位了,r代表可以读目录下的子目录,w代表我们可以我们可以给目录下添加删除文件或目录,x其实它就是多余,为了文件系统结构统一留着它吧,x你当个药引子吧,rw要想使用必须有x

不要停,linux的这种目录结构产生了一个比较有趣的东西,用户的家目录下有一个文件,当前用户对这个文件什么权限都没有或者读或者执行权限,我们可以删除这个文件吗?嗯,可以。

2文件权限操作

1)       属主和属组管理

文件的属主和属组不是一层不变的,怎么把属主和属组更改为其它的用户。

chown username file

      Username填哪个用户的用户名,该文件就会的属属主就会更改为该用户。这里有一个前提,更改文件属主的账号必须是管理员,为什么呢?有些时候我们想把东西送给别人,比尔还不一定要呢!比如比如送你你应该tnt

chown username:groupnamefile

这里我们增加了一个:groupname,嗯这里我们可以直接指定属组。也可以只写一个:,代表把:前属主的主组指定为文件的属组。:前面可以不填内,代表只更改属组。

chown –r username:groupnamefile

假如某个文件夹下有很多文件和很多子目录我们怎么改权限,难道我们要一个一个的更改。当然不要啦,-r递归更改目录下文件目录的权限。

chgrp更改文件的属组。简直多余。

2)       更改权限位

chmod这个命令就足够了。这个命令有两种赋权的方式,一种是使用rwx的方式,这种方式更加适合更改权限时使用,另一种是直接使用数字的模式,这种方法一步到位的指定文件的权限。

rwx模式

u+r代表属主增加一个读权限

g-w代表属组减少写权限

o+x代表其它增加执行权限

a-x-x)代表属主属组其它都减去执行权限

例如chmod –r a-w filename,这里的-r代表递归

数字模式

          

chmod 755 filename

              653是怎么来的rwx对应算出来的,这个不好解释,容我列个表

              rw-r-x-wx

              110101011

              按照二进制每三位(三位组合起来代表属主属组其中一个的权限)为一个数字,这个很重要,这是接下来的内容的基本。

              当我们创建一个目录它的权限时多少?嗯,755。创建文件呢?644。这是因为什么,因为linux中定义了umask。新建目录的权限时怎么来的,这里以root为例子解释。Rootumask022,然后用777的二进制111111111按位减去022的二进制000010010,得出的结果就是目录的权限。那文件的权限时644,因为文件有执行权限是很危险的,系统创建文件时默认把所有执行权限拿去了。

3特殊权限

上面理解了吧。哦好,我出一道题。不,我不出题了,直接说一个需求:在/testdir/中,要求每个人都能创建文件也可以查看其他人的文件的内容,但是不能删除其他人的文件。

传统的权限不能满足我们的需求,这时linux引入了特殊的权限。

SUID:在文件属主u上增加特殊权限chmod u+s command。这个命令在运行的时候,进程的属主将变成进程的属主,而不是进程的发起者(进程的属主一般是进程的发起者)。

SGID目录属组g上增加特殊权限chmod g+s command。这时在对应的目录下创建文件或目录时,新创建的属组不再是创建者的属组,而是父目录的属组。

SBIT:目录的其它权限o上增加特殊权限chmod o+s command。这时在该目录下,每个人只能删除属主是自己的文件,不可以删除其他用户的文件。

4root权限限制

root的权限实在是太大了,很多时候我们会敲错命令改错文件,有一个办法让root也无法改文件,当然不是root永远不能更改该文件,只是我们给那个文件一个缓冲机制,就像大陆股票市场推出的熔断机制。

chfattr +ifilename

filename增加锁,要想更改filename需先执行

chfattr –i filename

也可以先使用lsattr filename查看文件是否有锁。

5ACL权限

人类总很复杂,假如有/testdir/,我们想让/testdir/目录创建的文件属组是t1;同时需要t2组对/testdir/目录具有读写权限;也要t3/testdir/目录只有读的权限;其它组对文件没有任何权限。

原本的权限就满足不了我们了,这时linux引入了acl权限。这个引入需要在文件系统的配合,ext4xfs支持这个特性,在挂载的时候需要开启这个特性。CentOS7的文件系统默认开启aclCentOS6没开启。


setfacl optionarg filename
-m        新添权限,或更改权限
-k         清除默认权限
-x         从文件或目录删除一个扩展的ACL设置信息
-b         移除所有权限
-R         递归


Arg的格式是这样的

[d]:(m|u|g):name:rwx

第一个冒号后面是属主、属组或者是mask,选择一个填写,这里的maskumask类似,我们额外添加的权限的二进制格式必须先与mask按位相与后才是它的真实权限。

第二冒号后面是属主或者属组的名字

最后是我们想给的权限格式rwx模式

第一个冒号前面可以不写。还记得之前SGID和文件的权限继承吗?嗯acl权限也可以继承,这个d的意思是default,我们想让子文件目录有什么acl权限,只要加个d就可以啦!

一些例子

setfacl –m u:tom:rwx/home/jim
setfacl –m g:g1:r-x/home/jim
setfacl –md:g:g1:rwx /home/jim/
setfacl –m m:r-x/home/jim

使用getfacl filename查看命令的acl权限。

那么有一个问题,acl权限的执行顺序是什么?不用记,其实就是按getfacl filename得到的权限顺序来的。

接下来的这一组命令是一次备份acl权限的步奏。

#getfacl -R/tmp/dir1 > acl.txt
#setfacl -R -b/tmp/dir1
#setfacl -R --set-file=acl.txt/tmp/dir1
#setfacl--restore acl.txt
#getfacl -R/tmp/dir1

总结

权限看似很多,只有了解linux的存储结构和基本的权限,其它权限的基本就是基本权限的补充,一个原理不停的拓展而已。