内容概要
为什么要进行权限管理?
- 在生产服务器上,所有用户都用管理员权限登录吗?显然这是不可以也是不可能的。
- 因此我们如果要让普通用户登录,就需要给他分配合理的权限,在服务器上需要为用户严格定义权限等级。否则如果所有人都是root权限,权限过高容易导致出现误操作、盗取帐号等风险。
- 一台服务器应该只有一个管理员,通常是部门负责人,而其他人员都是普通用户。
一、文件基本权限
输入命令 ll
,可以查看文件的权限,如:-rw-r--r--
第一位: 代表文件类型,后面每3位代表一组权限,分别是:所有者、所属组和其他人
修改权限的方式
chmod [选项] 模式 文件名
#用来变更文件或目录的权限
- 选项:-R表示递归,模式有两种表示方式:
- [ugoa] [+-=] [rwx] 权限字母表示法
- [mode=421] 权限数字表示法(推荐)
- 权限数字:r - 4,w - 2,x - 1,无权限 - 0
- 常用组合: 777最高权限,644普通文件权限,755执行权限
权限修改示例
# 为文件的所有者附加执行权限
chmod u+x abc.txt
# 为文件的所属组和其他人附加写权限,取消文件所有者的执行权限
chmod u-x,g+w,o+w abc.txt
# 为文件所有者赋予所有权限
chmod u=rwx abc.txt
# 为所有人(所有者、所属组、其他人)赋予权限
chmod a=rwx abc.txt
# 为文件赋予执行权限:rwxr-xr-x(所有者全部权限7,所属组读和执行5,其他人读和执行5)
chmod 755 abc.sh
权限的作用
权限对文件的作用
-
r:
读取文件内容(cat、more、head、tail) -
w:
编辑,新建,修改文件内容(vi、echo),但是不包括删除文件 -
x:
可执行,表示文件可直接运行(通常是脚本文件)
关于删除权限的说明
- 对文件拥有写权限实际只能操作文件下一级,即文件内容,而文件是属于某个目录的,所以删除文件是目录的权限。
- 分区中,使用数据块存储数据,文件所拥有的数据块中保存了数据内容,而目录的数据块中保存了目录下文件的信息,所以文件的写权限不能删除文件。
权限对目录作用
-
r:
可以查询目录下文件名 (ls 目录) -
w:
具有修改目录结构的权限。如新建文件和目录,删除此目录下文件和目录,重命名或剪切此目录下文件和目录(touch、rm、mv、cp) -
x:
可以进入目录 (cd)
注意事项
- 对文件来说,最高权限是 x
- 对目录来说,最高权限是 w
- 目录权限只能设置0(没有权限)、5(rx)、7(rwx),而1、4、6是没有意义的
- 单纯的设置rwx权限是无法限制root用户操作的,即无效的
- root目录是禁止其他用户访问的
其他权限命令
修改文件的所有者
chown 用户名 文件名
#修改文件所有者
chown 所有者:所属组 文件名
#同时改变所有者和所属组
选项-R:递归,处理指定目录以及其子目录下的所有文件
#将abc文件的所有者改为user1,对应的user1就拥有了该文件所有者的权限
chown user1 abc
#指定ftpfile目录及所有子文件目录的所有者和所属组都为ftpuser
chown -R ftpuser.ftpuser ./ftpfile/
修改文件的所属组
格式:chgrp 组名 文件名
例如:chgrp user1 abc
二、文件默认权限
- 文件的默认权限即当我们新建文件时所拥有的初始权限。对于windows而言其默认权限是从上级目录继承而来的,而linux则是通过umask权限设定的。
- 对于root用户而言,文件的默认权限是644,目录的默认权限是755
- 对于普通用户而言,文件的默认权限是664,目录的默认权限是775
[root@localhost tmp]# touch abc
[root@localhost tmp]# mkdir test
[root@localhost tmp]# ll
总用量 4
-rw-r--r-- 1 root root 0 6月 8 06:43 abc
drwxr-xr-x 2 root root 4096 6月 8 06:43 test
[root@localhost tmp]# su - silly
[silly@localhost ~]$ touch abc
[silly@localhost ~]$ mkdir test
[silly@localhost ~]$ ll
总用量 4
-rw-rw-r-- 1 silly silly 0 6月 8 06:46 abc
drwxrwxr-x 2 silly silly 4096 6月 8 06:47 test
查看与修改
umask
#查看默认权限
[root@localhost ~]# umask
0022
#第一位0:文件特殊权限,022:文件默认权限
umask val
#临时修改默认权限
vi /etc/profile
#永久修改
# 输入 /umask 查找到以下内容修改
if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
umask 002 #普通用户
else
umask 022 #root用户
fi
文件的默认权限
- 文件默认不能建立为执行文件,必须手工赋予执行权限
- 所以文件默认权限最大为666
- 默认权限需要换算成字母再相减
- 建立文件之后的默认权限,为666减去umask值
换算说明
- 例如文件默认最大权限666,umask值022
-rw-rw-rw- 减去 -----w--w- 等于 -rw-r--r-- - 例如文件默认最大权限666,umask值033
-rw-rw-rw- 减去 -----wx-wx 等于 -rw-r--r--
目录的默认权限
- 目录默认权限最大为777
- 默认权限需要换算成字母再相减
- 建立文件之后的默认权限,为777减去umask值
- 例如:-rwxrwxrwx 减去 -----w--w- 等于 -rwxr-xr-x
三、ACL权限
ACL权限简介与开启
- 对linux的文件而言,用户身份分为: 所有者,所属组,其它人,且文件的所有者,所属组都只能是一个
- Linux主要作为服务器系统使用,用户众多。所以在实际使用场景中,这三种身份并不能很好地实现资源权限分配问题。
- ACL权限就是为了解决linux下三种身份不能满足资源权限分配需求的问题的
举例说明
如图所示有一个mp4的目录,我作为所有者对该目录拥有读写执行权限,同时作为我的开发组成员也拥有同样的权限,而其他人则没有任何权限,某天老王也想访问这个目录,希望拥有读和执行权限,那么此时应该给老王什么身份呢?
如果给所有者,由于所有者只能有一个所以肯定不行,如果给所属组,老王拥有的权限就过高了,而如果给其他人赋予读和执行权限,那么除了老王其他用户也可以访问该目录。类似这种场景在实际工作中还有很多,此时就需要用到ACL权限了
ACL权限简单来说,就是不管用户什么身份,只需要单独用命令即可为该用户赋予ACL权限。
查看分区ACL权限是否开启
dumpe2fs -h /dev/sda5
#查看根分区超级块信息
dumpe2fs命令是查询指定分区详细文件系统信息的命令
-h选项: 仅显示超级块中信息,而不显示磁盘块组的详细信息
开启分区ACL权限
- 临时开启分区ACL权限
mount -o remount,acl /
#重新挂载根分区,并挂载加入acl权限 - 永久开启分区ACL权限
vi /etc/fstab
UUID=c2ca6f57-b15c-43ea-bca0-f239083d8bd2 / ext4 defaults,acl 11 #加入acl
#保存文件后,重新挂载文件系统或重启动系统,使修改生效
mount -o remount /
ACL权限查看与设定
1.查看ACL命令
getfacl 文件名
#查看acl权限
2.设定ACL权限的命令
setfacl 选项 文件名
#设置ACL权限的,ACL权限标识为 +
# 常用选项
-m: 设定ACL权限
-x: 删除指定的ACL权限
-b: 删除所有的ACL权限
-d: 设定默认ACL权限
-k: 删除默认ACL权限
-R: 递归设定ACL权限
3.设定ACL权限
setfacl -m u:用户名:权限 文件名
#为用户设定ACL权限
setfacl -m g:组名:权限 文件名
#为用户组设定ACL权限
[root@localhost tmp]# useradd silly
[root@localhost tmp]# groupadd team
[root@localhost tmp]# mkdir mp4
[root@localhost tmp]# chown silly:team mp4
[root@localhost tmp]# chmod 770 mp4
[root@localhost tmp]# useradd lw
[root@localhost tmp]# setfacl -m u:lw:rx mp4
# 给用户lw赋予r-x权限,老王就能正常查看(ls mp4)和进入目录(cd mp4)
设置ACL权限后,权限会有"+"标识,此时可以使用命令getfacl
查看ACL权限
ACL最大权限与删除
最大有效权限Mask
mask是用来指定最大有效权限的。如果我给用户赋予了ACL权限,是需要和mask的权限“相与”才能得到用户的真正权限,与运算如图所示
mask值由系统默认设定(默认为rwx),所以设定的目录ACL权限与mask相与得到的都是设定的权限本身。一般不需要修改mask值
修改最大有效权限
setfacl -m m:rx 文件名
#设定mask权限为r-x
当改变了mask权限为r-x后,即使给用户设定rwx权限,相与后得到的也是r-x权限
删除ACL权限
setfacl -x u:用户名 文件名
#删除用户对该文件的ACL权限
setfacl -x g:组名 文件名
#删除指定用户组的ACL权限
setfacl -b 文件名
#删除该文件的所有ACL权限
ACL默认权限与递归权限
递归ACL权限
- 递归是父目录在设定ACL权限时,所有的子文件和子目录也会拥有相同的ACL权限(只对目录生效)
- 在递归目录时,一般需要设定rx权限,而对于目录下的文件来说,就会造成权限溢出了(拥有可执行权限)
-
setfacl -m u:用户名:权限 -R 文件名
#通过-R选项指定递归 - 递归后该目录下再创建的新文件是不具有ACL权限的,只对当前已有的文件生效
默认ACL权限
- 默认ACL权限的作用是如果给父目录设定了默认ACL权限,那么父目录中所有新建的子文件都会继承父目录的ACL权限,同样只对目录生效
-
setfacl -m d:u:用户名:权限 文件名
#设置默认ACL权限 - 设置默认权限后是不会影响该目录下原有的文件,只对未来新创建的文件有效
四、sudo权限
在实际工作中有可能出现这样的情况,管理员也就是root用户有可能很忙,没有时间执行一些日常工作,例如重启、备份、添加用户等,而其他普通用户虽然有时间,但是没有root用户权限。
在一些数据敏感的公司如游戏、商城、金融等都会严格限制root权限,一般只给部门负责人。这时候普通用户想要执行这些需要root权限的日常操作,就要用到sudo权限了。
sudo权限简介
- root把本来只能超级用户执行的命令赋予普通用户执行
- sudo的操作对象是系统命令
- 赋予sudo权限一定要谨慎,如vi,passwd这类命令危及到root帐号及服务器帐号密码信息等绝对不允许出现
sudo使用
visudo
#实际修改的是/etc/sudoers文件
root ALL=(ALL) ALL
#用户名 被管理主机的地址=(可使用的身份) 授权命令(绝对路径)
%wheel ALL=(ALL) ALL
#%组名 被管理主机的地址=(可使用的身份) 授权命令(绝对路径)
注:授权命令写的越简单用户得到的权限就越大(各种选项参数),写的越详细用户获取的权限就越小
sudo -l
#查看可用的sudo命令
sudo示例
- 授权普通用户可以重启服务器
[root@localhost~]# visudo
# 添加如下内容
silly ALL=(ALL) /sbin/shutdown -r now
[silly@localhost~]$ sudo -l #查看可用的sudo命令
[silly@localhost~]$ sudo shutdown -r now #普通用户执行sudo赋予的命令
- 授权普通用户可以添加其他用户
[root@localhost~]# visudo
# 添加如下内容
silly ALL=/usr/sbin/useradd #授予用户添加新用户的权限
#silly ALL=/usr/bin/passwd #授予用户设定密码的权限(用户将拥有修改任何人密码权限,包括root)
silly ALL=/usr/bin/passwd [A-Za-z] *, !/usr/bin/passwd"", !/usr/bin/passwd root #不能设定root用户的密码
# 普通用户执行sudo赋予的命令
[silly@localhost~]$ sudo useradd user1
[silly@localhost~]$ sudo passwd user1
五、文件特殊权限
- 在前面已经介绍了文件基本权限和文件默认权限,文件特殊权限其实指的是
SetUID
、SetGID
和Sticky BIT
,为了方便理解,统一将它们称为文件特殊权限。 - 文件特殊权限尤其是前两个权限都是非常不安全的权限,存在的原因是系统需要通过这种权限来完成一些特殊的功能,但是如果用户乱用这些权限,把权限赋在了不该赋的文件或者命令上,它会造成及其严重的后果。
- 之所以介绍这些权限是为了对linux有更加深入的了解,但是通常不允许自己去赋予这些权限。
- 执行命令
chmod 755 abc
可以给文件赋予权限,而umask
定义的权限位是4位,后三位是默认的基本权限,第一位其实就是特殊的权限定义,我们赋予755其实是省略了赋予特殊权限。
SetUID
SetUID的功能
- 只有可以执行的二进制程序才能设定SUID权限(一般是命令文件)
- 命令执行者要对该程序拥有x(执行)权限
- 命令执行者在执行该程序时获得该程序文件属主的身份(在执行程序的过程中灵魂附体为文件的属主)
- SetUID权限只在该程序执行过程中有效,也就是说身份改变只在程序执行过程中有效
举例说明
普通用户可以通过passwd命令修改自己的密码,为什么?
- 我们知道密码保存文件是
/etc/shadow
,而该文件权限是000,只能由root用户操作,普通用户是如何能够执行passwd命令修改该文件的呢,正是因为passwd命令拥有SetUID权限 - passwd是可执行的二进制程序,并且任何用户都对其拥有执行权限,满足SetUID权限的条件
- 执行该命令时普通用户灵魂附体,会暂时获得所有者即root用户身份,修改完密码后就回到用户原身份
- 而cat命令或者vi命令都没有SetUID权限,所以普通用户不能执行该命令查看密码文件内容
设定SetUID的方法
chmod 4755 文件名
#4代表SUID
chmod u+s 文件名
#其实u+s==SUID、g+s==SGID、o+s==SBIT
取消SetUID的方法
chmod 0755 文件名
chmod u-s 文件名
危险的SetUID
- 关键目录应严格控制写权限。比如"/"、"/usr"等
- 用户的密码设置要严格遵守密码三原则(复杂性、易记忆性、时效性)
- 对系统中默认应该具有SetUID权限的文件作一列表,定时检查有没有这之外的文件被设置了SetUID权限
- 原则: 除了系统设定的SUID文件外,其他文件都不要设置
SUID与SGID检测脚本
-
find / -perm -4000 -o -perm -2000 > /root/suid.list
#将现有的SUID与SGID文件保存 - 新建文件checkSUID.sh,保存如下脚本内容
- 新建文件abc,赋予SUID权限(测试使用)
- 执行脚本文件,查看是否有生成suid_log文件,内容:
/root/abc isn’t in listfile!
#!/bin/bash
find / -perm -4000 -o -perm -2000 > /tmp/setuid.check
#搜索系统中所有拥有SUID和SGID的文件,并保存到临时目录中。
for i in $(cat /tmp/setuid.check)
#做循环,每次循环取出临时文件中的文件名
do
grep $i /root/suid.list > /dev/null
#比对这个文件名是否在模板文件中
if [ "$?" != "0" ]
#检测上一个命令的返回值,如果不为0,证明上一个命令报错 []中间都要有空格,包括 !=,if和[也要有空格
then
echo "$i isn’t in listfile!" >> /root/suid_log_$(date +%F)
#如果文件名不再模板文件中,则输出错误信息,并把报错报错到日志中
fi
done
rm -rf /tmp setuid.check
#删除临时文件
SetGID
SetGID针对文件的作用
- 只有可执行的二进制程序才能设置SGID权限
- 命令执行者要对该程序拥有x(执行) 权限
- 命令执行在执行程序的时候,组身份升级为该程序文件的属组
- SetGID权限同样只在该程序执行过程中有效,也就是说组身份改变只在程序执行过程中有效
举例说明
为什么每个用户都能执行locate
命令查询数据库?
- 我们知道locate命令实际搜索的是
/var/lib/mlocate/mlocate.db
文件,而普通用户对该文件是没有权限的 - 但是locate命令拥有SGID权限,用户对locate命令也拥有执行权限
- 执行locate命令时,组身份会升级为slocate组,而slocate组对 mlocate.db 数据库拥有读权限
- 因此普通用户可以使用locate命令查询 mlocate.db 数据库,命令执行结束,用户的组身份会切换回原身份
[root@localhost ~]# ll /usr/bin/locate
-rwx--s--x. 1 root slocate 38464 10月 10 2012 /usr/bin/locate
[root@localhost ~]# ll /var/lib/mlocate/mlocate.db
-rw-r----- 1 root slocate 1924815 3月 28 05:15 /var/lib/mlocate/mlocate.db
SetGID针对目录的作用
- 普通用户必须对此目录拥有r和x权限,才能进入此目录
- 普通用户在此目录中的有效组会变成此目录的属组
- 意思就是: 该目录拥有SGID权限后该目录的所属组将会属于目录下所有创建的新文件的所属组,不管创建人是谁
设定SetGID
chmod 2755 文件名
chmod g+s 文件名
取消SetGID
chmod 0755 文件名
chmod g-s 文件名
Sticky BIT
SBIT黏着位作用
- 粘着位目前只对目录有效
- 普通用户对该目录拥有w和x权限,即普通用户可以在此目录拥有写入权限(others),其实就是7权限
- 如果没有粘着位,因为普通用户拥有w权限,所以可以删除此目录下所有文件,包括其他用户建立的文件。一但赋予了粘着位,除了root可以删除所有文件,普通用户就算拥有w权限,也只能删除自己建立的文件,但是不能刪除其他用户建立的文件
举例说明
系统目录 /tmp
其实就拥有SBIT权限,所有人都可以进入目录,新建文件等,但是不允许删除其他人的文件。
设置粘着位
chmod 1777 目录名
chmod o+t 目录名
取消粘着位
chmod 0777 目录名
chmod o-t 目录名
六、不可改变位权限(chattr权限)
chattr命令格式
chattr [+-=] [选项] 文件或目录名
+:
增加权限,-:
删除权限,=:
等于某权限
选项包括:a(等价于append),i(等价于insert)
选项说明
-
i:
如果对文件设置i属性,那么不允许对文件进行删除、改名,也不能添加和修改数据。如果对目录设置i属性,则只能修改目录下文件的数据,但不允许建立和删除文件 -
a:
如果对文件设置a属性,那么只能在文件中增加数据(用echo),但是不能删除也不能修改数据(vi只能看)。如果对目录设置a属性,那么只允许在目录中建立和修改文件,但是不允许删除
查看文件系统属性
lsattr [选项] 文件名
-a选项:显示所有文件和目录
-d选项:若目标文件是目录,仅列出目录本身的属性,而不是子文件的
演示i选项对文件的作用
至此Linux权限管理的基本内容就全部介绍完成了,其实在Linux还有两块与权限有关的内容:pam
与selinux
,这两个相对都比较复杂,而且作为开发人员也不需要了解它们的用途,掌握以上常规权限内容即可。