目录
一、权限查看及读取
1、权限查看
ls -l file #查看文件权限
ls -ld dir #查看目录权限
2、权限的读取
文件的属性被称为文件的元数据(meta data),一种元数据用1个byte来记录内容。
ls -l a
>> -rw-rw-r--. 1 westos westos 0 Oct 5 11:03 a
ls -ld zzh/
>> drwxrwxr-x. 2 westos westos 6 Oct 5 11:04 zzh/
(1)文件权限信息:
- | rw-rw-r-- | . | 1 | westos | westos | 0 | Oct 5 11:03 | a
[1] [2] [3] [4] [5] [6] [7] [8] [9]
(2)目录权限信息:
d | rwxrwxr-x | . | 2 | westos | westos | 6 | Oct 5 11:04 | zzh/
[1] [2] [3] [4] [5] [6] [7] [8] [9]
(3)每一位代表含义:
[1]:文件类型
< - >普通文件 <d>目录 <l>软连接 <b>块设备
<c>字符设备 <s>socket套接字 <p>管道 |
[2]:用户权限 rw- | r-- | r-- 分别代表u(user)、g(group)、o(others)用户的权限。
[3]:系统的selinux开启
[4]:对于文件:文件内容被系统记录的次数(硬连接个数)
对于目录:目录中子目录的个数
[5]:文件所有者
[6]:文件所有组
[7]:对于文件:文件内容大小
对于目录:目录中子文件的元数据大小
[8]:文件内容被修改的时间
[9]:文件(或目录)名称
二、普通权限的类型及作用
1、用户对文件的身份
u:user,文件的所有者(也称拥有者)
g:group,文件的所有组(也称拥有组)
o:others,既不是拥有者也不是拥有组的其他用户的通称
2、权限位
rxw | r-- | r--
u g o
3、用户身份匹配
user > group > other
4、权限类型
< - >:权限未开启
< r >:可读(read)
对于文件:可以读取文件内容;对于目录,可以<ls>列出目录中的文件
< w >:可写(write)
对于文件:可以更改文件内容;对于目录,可以在目录中新建或删除文件
< x >:可执行(execute)
对于文件:可以用文件名称调用文件内记录的程序;对于目录:可以进入目录中
三、设定普通权限的方法
chmod:设定文件权限
(1)<chmod>复制权限
chmod --reference=/tmp /mnt/westosdir
#复制/tmp目录的权限到/mnt/westosdir上
chmod -R --reference=/tmp /mnt/westosdir
#复制/tmp目录的权限到/mnt/westosdir及目录的子文件上,<-R>代表递归操作
chmod --reference=/tmp ./zzh #复制/tmp目录的权限到./zzh上
这里可以看出,</tmp>目录的权限是<drwxrwxrwt>,新建的<zzh>文件夹的权限是<drwxr-xr-x>,使用此命令复制权限后,目录<zzh>的权限也变成了<drwxrwxrwt>,但是对目录下的文件的权限并没有改变。
chmod -R --reference=/tmp ./zzh1 #复制/tmp目录的权限到./zzh1及目录的子文件上,<-R>代表递归操作
这里可以看出,此命令加上了参数<-R>,复制权限时也会让目录下的文件获得相同的权限
(2)<chmod>字符方式设定权限
chmod < a | u | g | o >< + | - | = >< r | w | x > file #用字符方式设定权限
chmod < a | u | g | o >< + | - | = >< r | w | x > file #用字符方式设定权限
例如:
chmod u-rw ./test/test1 #对文件<text1>的<u>位权限减去<rw>
chmod g+x ./test/test2 #对文件<text2>的<g>位权限增加<x>
chmod o=wx ./test/test3 #对文件<text3>的<o>位权限更改为<wx>
chmod a=rwx ./test/test4 #对文件<text4>的所有位(即<u,g,o>位)权限更改为<rwx>
chmod u=rwx,g=---,o=rx ./test/test5 #对文件<text5>的<u>位权限更改为<rwx>、<g>位权限更改为<--->、<o>位权限更改为<rx>
chmod -R a=rx ./test #对目录<test>及目录下所有文件的所有位(即<u,g,o>位)权限更改为<rx>
这里可以看出,经过此操作后,目录<test>和目录下的文件权限都更改为<r-xr-xr-x>
chmod a=w ./test #对目录<test>的所有位(即<u,g,o>位)权限更改为<w>
这里因为没有设置参数<-R>,所以此操作仅对目录本身有效。
(3)<chmod>数字方式设定权限
权限布尔数(bool)指表示方式,即三位二进制数可以表示的范围,权限有则代表1,没有则代表0
rwx = 111 = 7
rw- = 110 = 6
r-x = 101 = 5
r-- = 100 = 4 = r
-wx = 011 = 3
-w- = 010 = 2 = w
--x = 001 = 1 =x
--- = 000 = 0
这样就可以把权限转化成相应的数字,可以更方便地进行权限管理。
这里先用<ls>命令查看<test>目录的属性,可以看出它的权限是<-w--w--w->,然后使用<chmod>命令把权限参数设置成<777>,意味着<u,g,o>都设置成了<rwx>,命令执行完后可以看到目录<test>的权限已经改为了<rwxrwxrwx>。
四、系统默认权限设定
1、为什么要设置默认权限?
答:系统本身存在的意义是共享资源,从安全角度讲系统共享的资源越少、开放的权力越小,系统的安全性就越高;因此既要保证系统安全,又要系统创造价值,就要把应该开放的权力默认开放,把不安全的权力默认保留。所以如何保留权力就需要系统管理人员设定。
2、umask:表示系统保留权力
(1)临时设定系统预留权力
umask #查看保留权力
umask 保留值 #临时设定系统预留权力
注意:
目录默认权限 = 777 - <umask>
文件默认权限 = 777 - <umask> - 111(这里的111是内核设定值,记住就行)
这里先用<umask>查看系统预留权限是<0022>,第一位是特殊位,稍后会细讲,后三位“022”就是<u,g,o>分别预留的权限,所以预留的权限是<-,w,w>,使用<ls>命令查看新建的目录<testdir1> 的权限是<rwxr-xr-x>;接下来使用<umask 000>把系统保留权限设置为<000>,也就是说系统不再保留权限了,新建的目录<testdir2>的权限是<rwxrwxrwx>。
由于文件的默认权限要比目录的默认权限少<111>也就是三个位都缺少<xxx>,所以创建的文件<testfile1>的权限是<rw-r--r-->,修改保留权限为<000>后,创建的文件<testfile2>的权限是<rw-rw-rw->
(2)永久更改系统预留权力
永久更改系统预留权力分为三步,涉及到对系统配置文件的更改,而且预留权力越大(也就是<umask>值越大,系统安全性越高),所以一般不轻易改变。这里简单介绍一下修改步骤。
第一步:更改shell系统配置文件
vim /etc/bashrc #shell系统配置文件
使用<vim>命令更改配置文件</etc/bashrc>,定位到第74行左右,把if语句中else的值修改
74 if [ $UID -gt 199 ] && [ "`id -gn`" = "`id -un`" ]; then
75 umask 002 #普通用户的umask
76 else
77 umask 022 #root用户的umask
78 fi
这里改的是第77行:“<77 umask 022 #root用户的umask>”,把这一行的umask值从022改为其他值,修改后的值就是系统预留权力值。
第二步:更改系统环境配置文件
vim /etc/profile #系统环境配置文件
使用<vim>命令更改配置文件</etc/profile>,定位到第60行左右,把if语句中else的值修改
59 if [ $UID -gt 199 ] && [ "`id -gn`" = "`id -un`" ]; then
60 umask 002 #普通用户的umask
61 else
62 umask 022 #root用户的umask
63 fi
这里改的是第62行:“<62 umask 022 #root用户的umask>”,把这一行的umask值从022改为其他值,修改后的值就是系统预留权力值。
第三步:重新加载以上两个文件
修改完成后,这里需要重新加载这两个文件才能生效。
source /etc/bashrc
source /etc/profile
这里通过<vim>把以上两个配置文件的系统保留权力值改为<777>,也就是说系统保留了所有权力,然后重新加载这两个文件后使用<umask>查看“0777”,表示已经修改成功。新建一个目录<testdir2>,使用<ls>查看其权限可以看出,由于系统保留了所有权限,所以新建的这个目录显示没有任何权限<--- --- --->。
五、文件用户和用户组的管理
chown username file #更改文件拥有者
chgrp groupname file #更改文件拥有组
chown username:groupname file #同时更改文件的拥有者和拥有组
chown | chgrp -R username | groupname dir
#更改目录本身及目录中内容的拥有者或者拥有组
状态监视窗口显示目前系统中存在的用户及用户组,这里我在桌面上新建了三个文件和一个目录,可以看出新建的这些文件默认的用户是<root>默认的用户组也是<root>。
chown lee test1 #改变文件<test1>的用户为"lee"
chgrp linux test2 #改变文件<test2>的用户为“linux”
chown westoslee.westoslee test3 #改变文件<test3>的用户和用户组为“westoslee”
chown -R lee testdir #更改目录<testdir >及其目录下所有文件的用户为“lee”
chgrp -R linux testdir #更改目录<testdir>及其目录下所有文件的用户组为“linux”
这里分别执行了上述命令,从监控窗口可以看出,目录<testdir>及其目录下所有文件的用户已经改为“lee”,用户组改为“linux”。
六、特殊权限
1、什么是特殊权限?
答:特殊权限是直接控制<u,g,o>三位是否开启或关闭的符号位,与之前的“数字方式设置权限”类似,<u,g,o>三个位置的权限开启则表示1,关闭则表示0,所以<u,g,o>分别由<4,2,1>表示;特殊位是在普通位之前的那一位。
2、stickyid:粘制位
针对目录:如果一个目录的“stickyid”开启后,那么这个目录中的文件只能被所有人删除。
(1)添加“stickyid”权限的方法:
chmod 1原始权限 dir
chmod o+t dir
(2)小实验:
第一步:先建立一个</pub>目录,然后使用<chmod>赋予<777>权限。接下来使用用户<lee>和用户<westos>分别在</pub>目录下创建文件<./leefile>和文件<./westosfile>。
第二步:
切换到用户<westos>下对文件执行删除操作,发现原本属于其他用户的文件<leefile>也可以被删除。
第三步:
为了让每个用户只能删除自己的文件,我们对目录</pub>设置“stickyid”权限后(这里可以看到此目录的权限的“o”位已经由<rwx>变成了<rwt>),再次执行上述删除操作,可以看到汇报错显示“操作不被允许”,但是删除自己的文件还是可以的。
3、sgid:强制位
针对目录:目录中新建的文件自动归属到目录的所属组中。
针对可执行文件:只针对二进制的可执行文件(c程序),当运行二进制可执行文件时都是用文件所有组身份运行,和执行用户无关。
(1)对目录来说:
添加“sgid”权限的方法:
chmod 2原始权限 dir
chmod g+s dir
小实验:
第一步:这里先用<id>命令查看了用户<lee>的基本信息,可以看出此用户的所有组是<westoslee>,然后新建一个目录</pub>,并通过<chmod>命令查到其权限改为<rwxrwxrwx>,且此目录的所有人和所有组都是<root>。
第二步:先切换到用户<lee>下,在此目录中创建文件<leefile1>,可以看到这个文件所有人和所有组分别为<lee>和<westoslee>。也就是说,目录没有开启“sigid”的时候,哪个用户创建的文件就属于哪个用户所在的用户组。
第三步:切换到root下,对目录</pub>执行<chmod 2777 /pub>,可以看到此目录的权限已经改为<rwxrwsrwx>,<g>位的权限发生了变化,即目录的“sigid”权限已经开启,然后再切换到用户<lee>下,创建文件<leefile2>,可以看到新建的文件所有人和所有组分别为<lee>和<root>,和<leefile1>相比文件的所有组发生了改变。
第四步:再次切换到root下,使用<chgrp>命令将用户<lee>的所有组改为<westoslee>,然后切换到用户<lee>下,创建文件<testfile3>,可以看到新建的文件的所有人和所有组分别为<lee>和<westoslee>,和<leefile2>相比文件的所有组发生了变化。
注意:这里虽然文件<leefile1>和文件<leefile3>的所有组都属于<westoslee>,但两者有本质不同;文件<leefile1>是因为所在目录</pub>没有开启“sigid”权限,所以在这个目录中创建的文件的所有组与用户<lee>的所有组一致;文件<leefile3>是因为所在目录</pub>开启了“sigid”权限,所所以任何用户创建的文件都和目录的所有组保持一致。
(2)对可执行文件来说:
添加“sgid”权限的方法:
chmod 2原始权限 可执行文件
chmod g+s 可执行文件
chmod g+s /bin/cat #修改此程序的<g>位,使得此文件以文件拥有组身份运行
小实验:以<cat>程序为例
这里需要使用监测程序的命令:(这个命令是监测程序运行时的用户、用户组以及程序名称)
watch -n 1 "ps ax -o user,group,comm | grep cat"
这里第一步:先用<ls>命令查看程序</bin/cat>的属性,可以看到此程序的所有人和所有组都为<root>,后台开了一个<cat>的进程,通过监控窗口可以看到,此程序运行时的所有组为<root>。
第二步:用<chmod>命令将程序</bin/cat>的所有人和所有组都改为用户<lee>,再次运行发现程序的所有组还是<root>;这是由于我们并没有打开此程序的“sgid”权限。
第三步:使用<chmod>命令打开此程序的“sigid”权限,然后可以看到<cat>程序的权限由<rwxr-xr-x>变为了<rwxr-sr-x>,再次运行cat程序,可以看到新运行的cat所有组变为了<lee>。
4、suid:冒险位
对可执行文件:只针对二进制可执行文件(c程序),当运行二进制可执行文件是都是以文件拥有者身份运行,和执行用户无关。
(1)添加“suid”权限的方法:
chmod 4原属性 可执行文件
chmod u+s 可执行文件
chmod u+s /bin/cat #修改此程序的<u>位,使得此文件以文件拥有者身份运行
小实验:以<cat>程序为例
在上个实验的基础上,通过<chmod>使得程序</bin/cat>的<u>位增加<s>权限,即开启了此文件的“suid”权限,这就可以使这个程序运行时以文件的拥有者身份运行,通过<ls>命令可以看到,程序<cat>的文件拥有者是<lee>,所以再次运行此程序时,监测窗口可以看到此程序的是以用户<lee>身份运行的。
七、acl权限列表
1、什么是acl权限列表?
答:acl(Aiccess Control Lists,访问控制列表),功能是在列表中可以设定特殊用户对于特殊文件的特殊权限。
2、acl列表开启标识
-rw-rw-r--. 1 westos westos 0 Oct 7 08:58 testfile
^
这里是< . >表示acl列表没有开启
-rw-rw-r--+ 1 westos westos 0 Oct 7 08:58 testfile
^
这里是< + >表示acl列表已开启
测试:这里先创建了一个文件<testfile>,通过<getfacl>命令可以看出目前还都是默认用户及用户组的权限;接下来通过<setfacl>命令加入用户<lee>的“rw”权限,在监测窗口可以看到特殊用户那一栏已经新增了用户<lee>及“rw”权限,<umask>值也变成了<rw->,表示赋予特殊用户和特殊用户组的最大权限。
注意:从< . >到< + >的转变过程,是因为先通过<setfacl>命令设置了此文件的acl列表,设置了以后就意味着打开了acl列表,如果要关闭的话,再次执行<setfacl -b testfile>,就关闭了此文件的acl列表,< + >会变成< . >。
3、acl列表权限读取
getfacl testfile #读取acl权限列表
显示内容分析:
#file: testfile #文件名称
#owner: root #文件拥有者
#group: root #文件拥有组
user : : rw- #文件拥有者权限
user : lee : rw- #特殊指定用户权限
group : : r-- #文件拥有组权限
group : westos : -- #特殊指定的用户组的权限
mask : : rw- #能够赋予特殊用户和特殊用户组的最大权限阈值
other : : r-- #其他人的权限
注意:当acl权限列表没有开启时,<getfacl>命令将不会显示上表中阴影部分的内容,使用<setfacl>命令设置了哪个权限上表中就会显示出哪个权限。
4、acl列表的控制
注意:当文件权限列表开启后,不要用<ls -l>的方式读取文件的权限,因为读不完整,这里要用专门的<getfacl>命令来读。
setfacl -m u:lee:rw testfile #设定特殊用户<lee>的权限
setfacl -m g:westos:rw testfile #设定特殊用户组<westos>的权限
setfacl -m u: :rwx testfile #设定文件所有人的权限
setfacl -m g: :0 testfile #设定文件所有组的权限
setfacl -x u:lee testfile #删除列表中的用户<lee>
setfacl -b testfile #关闭acl列表
这里分为以下几步:
第一步:先创建一个文件<testfile>,通过<setfacl>命令使用户<lee>拥有对此文件的<rw>权限,从监测窗口可以看到acl权限列表新增了<user:lee:rw->一栏。
第二步:通过<setfacl>命令使用户组<westosadmin>拥有对此文件的<x>权限,从监测窗口可以看到acl权限列表新增了<group:westosadmin:--x>一栏。
第三步:通过<setfacl>命令使文件所有人拥有对此文件的< --- >权限,从监测窗口可以看到acl权限列表的<user>那栏从之前的<rw->变成了< --- >。
第四步:通过<setfacl>命令使文件所有组拥有对此文件的<r-x>权限,从监测窗口可以看到acl权限列表的<group>那栏从之前的<r-->变成了<r-x>。
第五步:通过<setfacl>命令执行删除用户<lee>的操作,在监窗口可以看到上一步中新增的用户<lee>已经消失了。
第六步:通过<setfacl>命令执行恢复文件默认权限的操作,在监窗口可以看到此文件的特殊用户权限都没有了,acl权限列表也恢复到了默认状态。
5、acl权限优先级
拥有者 > 特殊指定用户 > 权限多的组 > 权限少的组 > 其他
6、acl列表的mask控制
mask是能够赋予指定用户权限的最大阈值
注意:
(1)当设定完毕文件的acl列表后用<chmod>命令缩小了文件拥有组的权力,mask值会发生变化。
(2)恢复之前的权限:setfacl -m m:权限 文件 。(这里的权限是指mask值。也就是说重置mask值。要改变文件的权限还是得通过<chmod>命令来设置)
这里先用以上命令恢复了此文件的文件拥有组的权限,当出入参数为0时,文件的mask值为< --- >,然后重新通过<setfacl>命令设置用户<lee>的权限为<rx>,mask值也随之变为<r-x>,再次使用上述命令设置mask值为0,通过监测窗口可以看到mask值已经变为< --- >,相应的特殊用户<lee>以及文件所属用户组的权限都失效了。
7、acl列表的默认权限
setfacl -m u:lee:rwx /mnt/leedir #只对于/mnt/leedir目录本身生效
setfacl -Rm u:lee:rwx /mnt/leedir #对于/mnt/leedir目录及目录下所有已存在文件生效
setfacl -m d:u:lee:rwx /mnt/leedir #对于/mnt/leedir目录中新建的文件生效
这里先创建目录</mnt/testdir>,然后对目录赋予<777>权限,切换到用户“lee”下创建文件<testfile1>,可以看到此文件的权限为<rw-rw-r-->;接着通过命令<setfacl>的<-m> 参数改变此用户对目录的权限,从监视窗口可以看到新增一行<user:lee:rwx>,证明此用户对此目录拥有<rwx>权限,但是对新建的文件<testfile2>的权限并没有任何影响;然后通过命令<setfacl>的<-Rm> 参数设置权限“对目录和目录中已存在的内容生效”,可以看到文件<testfile1>和<testfile2>的权限都以变为<rw-rwxr-->,接着创建文件<testfile3>,文件权限和最初的一样,可见<-Rm>参数并不会对新建的内容生效。
这里更改<setfacl>的设置,新加上了符号“d”,这将使指定用户权限对此目录中新建的内容生效;执行此命令后,从监控窗口可以看到此目录新增5行“默认权限”,接着创建文件<testfile4>,可以看到此文件的权限为<rw-rw-rw->,理论上来讲,权限应该和文件<testfile1>一致,但是这里并不一样,具体原因还在思考中。
八、attr权限
1、什么是attr权限?
答:attr权限可以限制所有用户,包括超级用户root。这是为了防止拥有超级用户的权限后,对很重要的文件或文件夹误操作,导致数据丢失等等不可逆问题。
2、attr权限的参数及使用
#参数
i #不能作任何更改
a #能添加不能删除
lsattr dir | file #查看attr权限
chattr +i | -i | +a | -a dir|file #设定文件/目录的attr权限
lsattr file #查看文件的attr权限
lsattr -d dir #查看目录的attr权限
chattr +i | -i | +a | -a dir|file #设定文件/目录的attr权限
这里以一个文件为例,创建完成后输入字符,可以编辑,然后通过<chattr>命令的参数<+i>改变此文件的权限,再次编辑显示此文件“只读“,编辑失败。
接着对文件<testfile>的attr权限设置参数为<+a>,由于无法更改文件内容,所以不管添加或是删除都不被允许。(这个参数对文件夹的效果应该会更明显)
这里测试attr权限对文件夹的影响。先在文件夹中创建一个文件<testfile1>,测试参数<+i>,可以看到,在执行此命令后,目录的本身的<lsattr>属性新增了“i”,这意味着此文件夹被“保护起来”了,接下来执行删除或新建命令都无法执行。
接下来测试参数<a>,可以看到,在执行此命令后,目录的本身的<lsattr>属性新增了“a”,尝试删除文件或文件夹都显示不可执行。
九、总结
1、mask值的理解:在没有设置mask值时,mask值随着操作者赋予此文件(或目录)的特殊用户的特殊权限的变化而变化,当权限设定完成后,再次去设置mask值,这时候就可以看到,之前设置的那些权限会在这次设置的mask值范围内生效,超过mask值的范围,那些权限也就失效了。
2、对“acl权限列表”可以简单理解为“设定特殊用户对特殊文件的特殊权限”,可以有效防止<chmod>或<visudo>等权限操作命令对用户或用户组下放的权限过多。
3、如果想保护系统或用户的重要文件,可以通过设置<attr>权限限制所有用户对此文件/目录的操作。