权限管理是Linux中一个十分重要的概念,也是系统安全性的重要保障。
一、基本权限
用户对文件拥有所有者,所属组和其他人三个身份,每个身份都有读写执行三个权限。
-rw-r--r--:第一个"-"位置是代表文件类型的。
文件权限前的第一个字母用来标识文件类型:
-:一般文件
d:目录文件
b:块设备文件
c:字符设备文件
l:链接文件
p:人工管道
常见的为-,d,I
rw- r-- r-- :文件权限
u g o
u所有者,g所属组,o其他人
r读 w写 x执行 -不具有权限
8进制数值表示方法
r:4
w:2
x: 1
如:-rw- r-- r--的意思就是这个文件的类型是一般文件,文件本身所在的用户可读可写不可执行,所在的组可读,不可写不可执行,其他用户可读,不可写不可执行。
权限管理命令
chmod 改变文件或目录权限
英语原意:change the permissions mode of a file
语法:1、chmod【ugoa】【+-=】【rwx】【文件或目录】
执行权限:文件所有者和root用户
2、权限的数字表示
chmod 【421】【文件或目录】
r——4
w——2
x——1
chown 更该文件或目录的所有者
英语原意:chamge file ownership
执行权限:root
语法:chown 【用户】【文件或目录】
chgrp 改变文件或目录的所属组
英语原意:change file froup ownnership
执行权限:root
语法:chgrp【用户组】【文件或目录】
二、默认权限
umask 显示、设置文件的缺省权限
英语原意:the user file-creation mask
语法:umask【选项】
执行权限:root
-S 以rwx形式显示新建文件缺省权限
看到目录默认的权限和umask -S的权限一致,touch的权限每位比umask -S显示的权限少一个x权限,在linux会把任何一个新建的文件的可执行权限去掉(基于安全性考虑),所以也是和umask -S的权限是一样的
直接输入umask,得到0022,第一个0是特殊权限,后三位代表正常权限,表示拥有者,所属组,其他用户,但其实真正的权限是777-022=755,所以是rwxr-xr-x
设置默认权限为754,应由777-754=023
umask 023,但不建议更改,默认的权限是比较合理的
三、ACL权限
有时候,所有者,所属组,其他人三个身份的权限是770,假如想要某一个用户的身份为5,那么这些身份权限就满足不了要求了,就要使用到ACL权限了。
ACL权限
需要文件所在的分区支持ACL权限
查看分区ACL权限是否开启
dumpe2fs -h /dev/sda3
dumpe2fs命令是查询指定分区详细文件系统信息额命令
-h 仅显示超级块中信息,而不显示磁盘块组的详细信息
df 查看分区使用状况,查看到/为/dev/sda3
默认挂载选项,支持ACL,默认都开启了ACL。
若没有开启
临时开启分区ACL权限
mount -o remount,acl/ 重新挂载跟分区,并挂载加入acl权限
永久开启分区ACL权限
vim /etc/fstab 是系统开机自动挂载文件
在defaults后加,acl,重启系统或重新挂载文件系统就可以了,当然,在默认的情况下,本身就支持acl的。
查看与设定acl权限
getacle 文件名 查看acl权限
setfacl 【选项】 文件名 设定ACL权限
-m 设定ACL权限
-x 删除指定的ACL权限
-b 删除所有的ACL权限
-d 设定默认ACL权限
-k 删除默认ACL权限
-R 递归设定ACL权限
setfacl -m u:test:rx //root/wt/ u/g
为给用户/组分配acl,test为用户名,rx为写执行权限,/root/wt为文件名)
可以看到,权限后面多了个+号,然后使用getfacl查看acl权限,可以看到user:test:r-x
最大有效ACL权限与删除ACL权限
mask是用来指定最大有效权限的。如果我给用户赋予了ACL权限,是需要和mask的权限“相与”才能得到用户的真正权限。
相与就是逻辑运算两个都为真才为真,如user的读r权限和mask的读r权限相与为读权限,若其中任何一个为-权限,则结果就为-权限。
上面用setfacl -m u来指定用户,用m来指定mask的权限
当然,mask设置成了rwx权限,任何权限与他相与,都是本身,所以默认的mask权限是合理的。
删除ACL权限
setfacl -x u:用户名 文件名 删除指定用户的ACL权限
setfacl -b 文件名 删除文件的所有的ACL权限
默认ACL权限和递归ACL权限
递归ACL权限:递归是父目录在设定ACL权限时,所有的子文件和子目录也会拥有相同的ACL权限。之前所说的命令,也有递归的概念,比如mkdir和rm的时候。
setfacl -m u:用户名:权限 -R文件名
但是新建的文件不是拥有ACL权限。
默认ACL权限
默认ACL权限的作用是如果给父目录设定了默认ACL权限,那么父目录中所有新建的子文件都会继承父目录的ACL权限。
setfacl -m d:u:用户名:权限 文件名
四、文件特殊权限
SetUID
setGID
Sticky BIT
SetUID
只有可执行的二进制程序才能设定SUID权限
命令执行者要对该程序拥有x权限
命令执行者在执行该程序时获得该程序文件属主的身份(在执行程序的过程中成为文件的所有者的身份)
setUID权限只在该程序执行过程中有效,也就是说身份改变只在程序执行过程中有效,一旦程序终止,身份就会消失
passwd命令拥有setUID权限,所以普通用户可以修改自己的密码,setuid是文件的所有者拥有s权限,setgit是文件所属组拥有s权限,Sticky BIT是其他人拥有s权限。
很明显的看到passwd的文件拥有者有s权限,也就是有setUID权限,之前也看过/etc/shadow的文件的权限是000,所以cat无法查看,但是passwd命令拥有s权限,执行此命令的身份变成身份的所有者root用户,所以无法查看却可以往里面写入数据了。
设定setUID的方法
chmod 4755文件名 (命令执行者要对该程序拥有x权限,若没有执行权限,系统会用大写的S进行报错,755是文件本身的权限,开头的4代表SUID,2表示GUID,1表示SBIT。7表示拥有SUID,SGID,SBIT)
chmod u+s 文件名
先切换到普通用户,无法查看/etc/shadow,回到root身份,设定setUID后,再切换到普通用户,可以查看/etc/shadow了。
取消setUID权限
chmod 755 文件名
chmod u-s 文件名
危险的SetUID
关键目录应严格控制写权限,比如/ /usr等。
用户的密码设置要严格遵守密码三原则
对系统中默认应该具有SetUID权限的文件作一列表,定时检查有没有这之外的文件被设置了SetUID权限
系统默认有些拥有SUID的权限,没有特殊情况,不允许设置SUID权限
SetGID
SetGID针对文件的作用
只有可执行的二进制程序才能设置SGID权限
命令执行者要对该程序拥有x权限
命令执行者在执行程序的时候,组身份升级为该程序文件的属组
SetGID权限同样只在该程序执行过程中有效,也就是说组身份改变只在程序执行过程中有效
我们在使用locate查询的时候,实际上在查找mlocate.db库,但是库的权限对于其他人的权限的0,我们怎么有看的权限?再看locate的权限,/usr/bin/locate是可执行二进制程序,可以赋予SGID权限,我们在使用locate的时候,已经变成了所属组了,slocate组对库有r权限。所以普通用户可以使用locate命令查看mlocate.db数据库,命令结束,返回为普通身份。
SetGID除了可以针对文件,还可以针对目录,SUID是没有这个特征的。
SetGID针对目录的作用
普通用户必须对此目录拥有r和x权限,才能进入此目录
普通用户在此目录中的有效组会变成此目录的属组
若普通用户对此目录拥有w权限时,新建的文件的默认属组是这个目录的属组。
设定SetUID
chmod 2755 文件名
chmod g+s 文件名
取消SGID
chmod 755 文件名
chmod g-s 文件名
可以看到user1新建的文件的所属组是user1,但是在tmp/test下新建的所属组就是root组了,这就是SGID针对目录的作用。
Sticky BIT
SBIT粘着位作用
粘着位目前只针对目录有效
普通用户对该目录拥有w和x权限,即普通用户可以在此目录拥有写入权限。
如果没有粘着位,因为普通用户拥有w权限,所以可以删除此目录下所有文件,包括其他用户建立的文件,一旦赋予了粘着位,除了root可以删除所有文件,普通用户就算有w权限,也只能删除自己建立的文件。,但是不能删除其他用户建立的文件。
tmp默认的权限是1777,先将权限改为777,新建文件,切换到其他用户可以删除,改回默认权限1777设置SBIT,没有删除权限了。
设置粘着位
chmod 1755 目录名
chmod o+t 目录名
取消粘着位
chmod 755 目录
chmod o-t 目录名
五、文件系统属性chattr权限
chattr命令格式
chattr【+-=】【选项】文件或目录名
+:增加权限
-:删除权限
=:等于某权限
选项:
i:文件设置看i属性,不允许对文件进行删除、改名,也不能添加和修改数据;目录设置了i属性,那么只能修改目录下文件的数据,但允许建立和删除文件。
a:文件设置a属性,那么只能在文件中增加数据,但是不能删除和修改数据,目录设置a属性,那么只允许在目录中建立和修改文件,但是不允许修改。
查看文件系统属性
lsatter 【选项】 文件名
-a 显示所欲文件和目录
-d 若目标是目录,仅列出目录本身的属性,而不是子文件的
新建文件test,查看属性为644,用chattr +i给test加i属性,需要注意的是ls命令无法查看文件系统属性,使用lsatr 查看文件系统属性,多了i属性,e属性代表这个文件是在ext文件系统创建的。然后再继续写入数据,提示权限不足,也无法删除,细心的同学应该看到了我使用的还是root用户,所以这个权限对root用户也生效,当然使用chattr -r test删除i属性,就可以实现以上操作了。
对目录设置了i属性,可以看到目录有i属性,但是目录下的文件没有i属性,我们可以修改目录下文件的数据,但是没有权限新建和删除文件。
新建文件,添加a属性,我们可以添加文件,但是无法修改和删除数据,需要注意的是“>”无法添加,“>”是覆盖追加,也等于把以前的数据删了。
对目录设置了a权限,只能在目录中建立和修改文件,修改文件指修改文件中的数据,而不是修改文件名,但是不能删除。
chattr不是为了限制文件权限,而是为了防止root在内的误操作的保险措施。
六、系统命令权限sudo权限
sudo 权限
root把本来只能超级用户执行的命令赋予普通用户执行。
sudo 的操作对象是系统命令。
visudo 实际上修改的是/etc/sudoers文件
user1 ALL = (ALL) ALL
用户名 被管理主机的地址 可使用的身份 授权命令(绝对路径)
user1 ALL = (ALL) ALL
%组名 被管理主机的地址 可使用的身份 授权命令(绝对路径)
第一个ALL是被管理额主机地址是linux的地址,不是外部访问的地址命令越简单,第三个ALL是授权的命令,可以写ALL,但是这个太过于危险,就相当于root身份了,权限太大,如果具体到某个参数,则限制的权限非常的小。建议写绝对路径并具体到某一个参数。
切换到user1用户我们可以用sudo -l查看已被root授权的用户,可以看到我们在上面授权的/usr/bin/vim命令。
在使用被授权的命令之前,需加sudo + 命令的绝对路径
可以看到普通用户可以修改etc/passwd文件了,这个危害有多大就不用多说了。
linux的权限基本都说完了,由于水平有限,文中若有错误,多多包涵,同时欢迎一起交流。
本文出自 “罹殇” 博客,请务必保留此出处http://wt7315.blog.51cto.com/10319657/1850860
原文地址:http://wt7315.blog.51cto.com/10319657/1850860