Linux权限管理

内容概要

为什么要进行权限管理?
  • 在生产服务器上,所有用户都用管理员权限登录吗?显然这是不可以也是不可能的。
  • 因此我们如果要让普通用户登录,就需要给他分配合理的权限,在服务器上需要为用户严格定义权限等级。否则如果所有人都是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权限
  1. 临时开启分区ACL权限
    mount -o remount,acl / #重新挂载根分区,并挂载加入acl权限
  2. 永久开启分区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示例
  1. 授权普通用户可以重启服务器
[root@localhost~]# visudo
# 添加如下内容
silly ALL=(ALL) /sbin/shutdown -r now
[silly@localhost~]$ sudo -l  #查看可用的sudo命令
[silly@localhost~]$ sudo shutdown -r now  #普通用户执行sudo赋予的命令
  1. 授权普通用户可以添加其他用户
[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

五、文件特殊权限

  • 在前面已经介绍了文件基本权限和文件默认权限,文件特殊权限其实指的是SetUIDSetGIDSticky BIT,为了方便理解,统一将它们称为文件特殊权限。
  • 文件特殊权限尤其是前两个权限都是非常不安全的权限,存在的原因是系统需要通过这种权限来完成一些特殊的功能,但是如果用户乱用这些权限,把权限赋在了不该赋的文件或者命令上,它会造成及其严重的后果。
  • 之所以介绍这些权限是为了对linux有更加深入的了解,但是通常不允许自己去赋予这些权限。
  • 执行命令chmod 755 abc可以给文件赋予权限,而umask定义的权限位是4位,后三位是默认的基本权限,第一位其实就是特殊的权限定义,我们赋予755其实是省略了赋予特殊权限。
SetUID
SetUID的功能
  1. 只有可以执行的二进制程序才能设定SUID权限(一般是命令文件)
  2. 命令执行者要对该程序拥有x(执行)权限
  3. 命令执行者在执行该程序时获得该程序文件属主的身份(在执行程序的过程中灵魂附体为文件的属主)
  4. 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
  1. 关键目录应严格控制写权限。比如"/"、"/usr"等
  2. 用户的密码设置要严格遵守密码三原则(复杂性、易记忆性、时效性)
  3. 对系统中默认应该具有SetUID权限的文件作一列表,定时检查有没有这之外的文件被设置了SetUID权限
  4. 原则: 除了系统设定的SUID文件外,其他文件都不要设置
SUID与SGID检测脚本
  1. find / -perm -4000 -o -perm -2000 > /root/suid.list #将现有的SUID与SGID文件保存
  2. 新建文件checkSUID.sh,保存如下脚本内容
  3. 新建文件abc,赋予SUID权限(测试使用)
  4. 执行脚本文件,查看是否有生成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针对文件的作用
  1. 只有可执行的二进制程序才能设置SGID权限
  2. 命令执行者要对该程序拥有x(执行) 权限
  3. 命令执行在执行程序的时候,组身份升级为该程序文件的属组
  4. 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黏着位作用
  1. 粘着位目前只对目录有效
  2. 普通用户对该目录拥有w和x权限,即普通用户可以在此目录拥有写入权限(others),其实就是7权限
  3. 如果没有粘着位,因为普通用户拥有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还有两块与权限有关的内容:pamselinux,这两个相对都比较复杂,而且作为开发人员也不需要了解它们的用途,掌握以上常规权限内容即可。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容