本文共 3478 字,大约阅读时间需要 11 分钟。
服务器内有了不同的账号,那么怎么界定哪些文件属于哪些用户?有时我们还想共享我们的给特定的人?有时我们还想共享文件给所有的人?既然有了这么多需求,我们linux中是怎么管理文件的,是怎么满足我们需求的。身为管理员我们需要做什么?它的功能我们怎么合理运用才可以最大限度的保护系统的安全。第一节第二部分很重要。
庖丁解牛前是绕牛三周。牛分为两种,一种是文件,一种是目录。不同的牛要用不同的刀。
1) 文件的权限,简单看文件权限,使用ll命令查看
1 | -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的这种目录结构产生了一个比较有趣的东西,用户的家目录下有一个文件,当前用户对这个文件什么权限都没有或者读或者执行权限,我们可以删除这个文件吗?嗯,可以。
1) 属主和属组管理
文件的属主和属组不是一层不变的,怎么把属主和属组更改为其它的用户。
1 | chown username file |
Username填哪个用户的用户名,该文件就会的属属主就会更改为该用户。这里有一个前提,更改文件属主的账号必须是管理员,为什么呢?有些时候我们想把东西送给别人,比尔还不一定要呢!比如比如送你你应该tnt。
1 | chown username:groupnamefile |
这里我们增加了一个:和groupname,嗯这里我们可以直接指定属组。也可以只写一个:,代表把:前属主的主组指定为文件的属组。:前面可以不填内,代表只更改属组。
1 | 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代表递归
数字模式
1 | chmod 755 filename |
653是怎么来的rwx对应算出来的,这个不好解释,容我列个表
rw-r-x-wx
110101011
按照二进制每三位(三位组合起来代表属主属组其中一个的权限)为一个数字,这个很重要,这是接下来的内容的基本。
当我们创建一个目录它的权限时多少?嗯,755。创建文件呢?644。这是因为什么,因为linux中定义了umask。新建目录的权限时怎么来的,这里以root为例子解释。Root的umask是022,然后用777的二进制111111111按位减去022的二进制000010010,得出的结果就是目录的权限。那文件的权限时644,因为文件有执行权限是很危险的,系统创建文件时默认把所有执行权限拿去了。
上面理解了吧。哦好,我出一道题。不,我不出题了,直接说一个需求:在/testdir/中,要求每个人都能创建文件也可以查看其他人的文件的内容,但是不能删除其他人的文件。
传统的权限不能满足我们的需求,这时linux引入了特殊的权限。
SUID:在文件属主u上增加特殊权限chmod u+s command。这个命令在运行的时候,进程的属主将变成进程的属主,而不是进程的发起者(进程的属主一般是进程的发起者)。
SGID:目录属组g上增加特殊权限chmod g+s command。这时在对应的目录下创建文件或目录时,新创建的属组不再是创建者的属组,而是父目录的属组。
SBIT:目录的其它权限o上增加特殊权限chmod o+s command。这时在该目录下,每个人只能删除属主是自己的文件,不可以删除其他用户的文件。
root的权限实在是太大了,很多时候我们会敲错命令改错文件,有一个办法让root也无法改文件,当然不是root永远不能更改该文件,只是我们给那个文件一个缓冲机制,就像大陆股票市场推出的熔断机制。
1 | chfattr +ifilename |
给filename增加锁,要想更改filename需先执行
1 | chfattr –i filename |
也可以先使用lsattr filename查看文件是否有锁。
人类总很复杂,假如有/testdir/,我们想让/testdir/目录创建的文件属组是t1;同时需要t2组对/testdir/目录具有读写权限;也要t3对/testdir/目录只有读的权限;其它组对文件没有任何权限。
原本的权限就满足不了我们了,这时linux引入了acl权限。这个引入需要在文件系统的配合,ext4和xfs支持这个特性,在挂载的时候需要开启这个特性。CentOS7的文件系统默认开启acl,CentOS6没开启。
1 2 3 4 5 6 | setfacl optionarg filename -m 新添权限,或更改权限 -k 清除默认权限 -x 从文件或目录删除一个扩展的ACL设置信息 -b 移除所有权限 -R 递归 |
Arg的格式是这样的
[d]:(m|u|g):name:rwx
第一个冒号后面是属主、属组或者是mask,选择一个填写,这里的mask和umask类似,我们额外添加的权限的二进制格式必须先与mask按位相与后才是它的真实权限。
第二冒号后面是属主或者属组的名字
最后是我们想给的权限格式rwx模式
第一个冒号前面可以不写。还记得之前SGID和文件的权限继承吗?嗯acl权限也可以继承,这个d的意思是default,我们想让子文件目录有什么acl权限,只要加个d就可以啦!
一些例子
1 2 3 4 | 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权限的步奏。
1 2 3 4 5 | #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的存储结构和基本的权限,其它权限的基本就是基本权限的补充,一个原理不停的拓展而已。
本文转自Ailu0li 51CTO博客,原文链接:http://blog.51cto.com/oldking/1875994,如需转载请自行联系原作者