一.linux基本权限分类

linux权限分为三类:所有者,所属组,其他人

  • 所有者user(u):谁创建了这个文件,谁就是所有者,所有者只能有一个
  • 所属组group(g):定义一组用户设置统一的权限,所属组也只能有一个
    简单的分组代码为groupadd 选项 用户组,具体的如何分组在后面用户管理章节详细介绍
  • 其他人other(o):除了所有者和所属组,都是其他人

二.用数字表示基本权限

1.三种权限对应的数字

权限r、w、x对应的数字分别为4、2、1

2.数字组合来设置权限

chmod以及umask等权限管理命令经常要用数字代替字母来设置权限

而设置权限方法不是用4、2、1,而是用要设置的权限的对应数字加起来的数

比如:要设置权限为rw(可读可写不可执行),则对应的数字为6(4+2)。 常用的权限组合数字:

  • wx 3
  • r 4
  • rx 5
  • rw 6
  • rwx 7

三.基本权限的管理命令

1.修改文件或目录权限 chmod

命令名称:chmod (change the permissions mode of a file)

命令所在路径:/bin/chmod (所有者或root)

语法

  • chmod [{ugoa}{+-=}{rwx}] [文件或目录] :ugoa分别表示所有者,所属组,其他人,所有用户,+-=表示增加、减少、强制设置权限。rwx分别表示 读、写、执行
  • chmod [421组合] [文件或目录]

后缀:-R 递归修改(直接修改该目录以及该目录下的子目录所有文件的权限)

:只有文件和目录所有者和root能修改文件和目录的权限

对一个文件同时设置多个权限用逗号隔开即可。

比如

  • 用字母设置权限
    • 给一个名为dir文件夹的所属组加上一个写的权限,其他人去除执行的权限:chmod g+w,o-x dir
      file
    • 不管dir文件夹之前是什么权限,其他人都设置成只能执行的权限:chmod o=x dir
      file
  • 用数字设置权限
    • 设置dir的权限为所有人rwx(7),所属组rw(6),其他人r(4):chmod 764 dir
      file
  • 用-R递归修改权限
    • 修改dir目录下的全部子目录new1、new2、new3的权限为777:chmod -R 777 dir
      file

2.修改文件或目录的所有者 chown

命令名称:chown (change owner)

命令所在路径:/bin/chown (所有用户)

语法:chown [用户名] [文件或目录]

比如将dir目录的所有者由root改为hyk:chown hyk dir
file

3.修改文件或目录的所属组 chgrp

命令名称:chgrp (change group)

命令所在路径:/bin/chgrp (所有用户)

语法:chgrp [用户名] [文件或目录]

注:文件设置的所属组只能有一个

比如将dir目录的所属组由root改为hyk:chgrp hyk dir
file

4. 修改新建文件夹时的默认缺省权限 umask

命令名称:umask (user file-creation mask)

命令所在路径:Shell内置命令 (所有用户)

语法

  • umask : 显示默认缺省权限(数字格式)
  • umask -S : 显示默认缺省权限(字母格式)
  • umask -S [数字组合]: 修改默认缺省权限

缺省权限:ugoa用户缺少的权限

  • umask设置的是新建文件夹时的默认缺省权限,而非新建文件的权限
  • 设置的时新建时的默认缺省权限,而非针对某个文件夹,所以不能指定文件夹。
  • -S的“S”是大写,linux严格区分大小写。
  • 因为设置的是缺省权限,所以要用777-想设置权限的数字。如:要设置默认权限为所有人rwx(7),所属组rw(6),其他人r(4)。则应设置的缺省权限为:777-764=013。

比如

  • 查看新建文件时uroa的默认缺省权限 : umask

file

  • 以字母格式显示默认全省权限:umask -S

file

  • 设置默认权限为所有人rwx(7),所属组rw(6),其他人r(4),应设置的缺省权限为:777-764=013: umask -S 013

file

5、添加已有用户到已有用户组 usermod/gpasswd

  • usermod -G (组名) (用户名)
  • gpasswd -a (用户名) (组名)

四、ACL权限

1、ACL权限简介

在普通权限中,用户对文件只有三种身份ugo。但是在实际工作中,有时不能满足需求,需要给个别用户(非所有者,非所属组)赋予权限,因此使用acl权限。

比如:对一个文件,所有者"老师"和所属组"学生"有rwx权限,其他人无任何权限,这时加了一个旁听者,想给他赋予rx权限,怎么做?因为每个文件只能有一个所属组,所以普通权限管理时没有办法实现的。需要用ACL权限。

ACL权限如何做:忽略所有者、所属组、其他人的身份,单独对单一用户或用户组分配权限。

2、查看ACL权限 getfacl

语法:getfacl [文件名]

3、设定ACL权限 setfacl

语法:setfacl [后缀] [文件名]

后缀:

  • -m u:[用户名]:[r/w/x] [文件名] : 设定用户ACL权限
  • -m g:[组名]:[r/w/x] [文件名] : 设定用户组ACL权限
  • -x : 删除指定的ACL权限
  • -b : 删除整个文件夹所有的ACL权限
  • -d : 设定默认ACL权限
  • -k : 删除默认ACL权限
  • -R : 递归设定ACL权限

例如:

对一个目录dir,所有者teacher和所属组Student有rwx权限,其他人没有权限,(770),这是来了个旁听者audience有rx(5)权限。

# mkdir dir
# useradd teacher,
# useradd audience
# useradd student1
# useradd student2
# groupadd Student
# gpasswd -a student1 Student  #把student1和student2加入用户组Student
# gpasswd -a student2 Student
# chown teacher dir  #把dir所有者改为teacher
# chgrp Student dir  #把dir所属组改为Student
# chmod 770 dir  #设置目录的权限为770
# setfacl -m u:audience:rx  #赋予audience用户rx权限
# getfacl   #设置完成后查看权限

4、删除有效权限 setfacl

语法:

  • setfacl -x u:[用户名] [文件名] : 删除指定用户的ACL权限
  • setfacl -x g:[组名] [文件名] : 删除指定组的ACL权限
  • setfacl -b [文件名] : 删除该文件的所有ACL权限

5、最大有效权限

在使用getfacl命令时,我们会看到有一条”mask“的权限。

mask是用来指定ACL用户或用户组最大有效权限的,只有ACL用户或用户组受限于mask权限

设定最大有效权限 setfacl

语法:setfacl -m m:[r/w/x] [文件名]

如:设置dir目录的mask权限为rx ——

6、递归ACL权限 (针对现有的子文件) setfacl

递归:父目录设定ACL权限时,当前所有的子文件和子目录(不包括新建的)也会有相同的ACL权限。

语法: setfacl -m u:用户:权限 -R [目录名]

注:递归修改后,只是当前目录下的所有文件有ACL权限,但是在该目录新建的文件还是没有ACL权限。要让新建的文件有ACL权限,只能用下面的方法:设置默认ACL权限.

7、默认ACL权限(针对新建的子文件) setfacl

给父目录设置默认ACL权限,则所有新建的文件或目录(不包括已存在的)都会继承父目录的ACL权限。

语法:set -m d:u:[用户名]:[r/w/x] [目录名]

五、文件特殊权限(SUID、SGID、SBIT)

文件有三种特殊权限:SetUID、SetGID、Sticky BIT

1、SetUID

条件:

  • 只有可以执行二进制程序才能设定SUID权限
  • 命令执行者必须有该程序的x权限

作用:任何一个普通命令执行者在执行该程序时临时获得文件所有者的身份,身份改变只在该程序执行过程中起作用

有什么实际意义?

最常见的像passwd命令,我们查看passwd命令的权限,会发现它所有者的权限为rws而不是rwx

用户想更改自己的密码,而密码是在/etc/shadow文件(权限为000)里,普通用户连看都不了,之所以普通用户修改密码时能写入这个文件,是因为它有SUID权限,在执行时被当作root

扩展:不管怎么设置,root用户对所有文件都有rwx权限,虽然/etc/shadow文件的所有者root的权限是0,但root依然能对他rwx。

注意:设了SUID很危险,一般用户不要自己设定SUID权限

2、SetGID

SGID和SUID非常类似,只是一个针对用户,一个针对用户组。但也有一些区别

  • SGID既可以对目录,也可以对文件,只是两种情况含义不太一样。
    • 对文件:和SUID一样,执行过程中用户暂时分到所属组里。
    • 对目录:若普通用户对此目录有w权限时,新建的文件默认属组是这个目录的属组

实例:SGID一般很少用到,locate命令就是用SGID

3、Sticky BIT

条件:普通用户对该目录有w和x权限

作用:若没有SBIT,普通用户有w权限时,可以删除该目录下的文件,包括所有者为其他人的文件。一旦有了SBIT,只有root用户能删除别人创的文件,普通用户w权限也只能删除自己创建的文件

注:SBIT只对目录有效

4、设定SUID、SGID、SBIT权限

  • SUID:字母s 或 数字4
  • SGID:字母s 或 数字2
  • SBIT:字母t 或 数字1

如:

  • 设定SUID权限
    • chmod 4755 [文件名]
    • chmod u+s [文件名]

注:若原权限为 644 ,设定SUID权限命令后,为S(大写),而不是s(小写),说明设置错误,因为原权限除了所有者外都ig

  • 设置SGID权限
    • chmod 2755 [文件名]
    • chmod g+s [文件名]
  • 设置SBIT权限
    • chmod 1777 [文件名]
    • chmod o+t [文件名]

5、取消SUID、SGID、SBIT权限

  • 取消SUID权限
    • chmod 755 [文件名]
    • chmod u-s [文件名]
  • SGID和SBIT权限的取消类似。

六、文件属性权限(chattr权限)

语法:chattr [+-=] [选项] [文件或目录名]

选项:

  • i : 对文件设置i属性,就不允许对文件进行删除、改名、添加修改数据;对目录设置i属性,则只能修改目录下的文件数据,不能删除和建立文件。(i属性是为数不多的对root用户也生效
  • a : 对文件设置a属性,只能在文件添加数据不能删除和修改数据;对目录设置a属性,则只能在目录建立和修改文件,但不允许删除

i属性相当于把文件锁起来,可以防止误操作;a属性相当于保护现有数据,但允许添加新数据。

注:设置a属性后,虽然仍能添加数据,但不允许使用vim等编辑器添加,只能用echo xxx >> [文件名]的方式追加。

七、sudo权限

作用:root把本来只有超级用户能执行的命令赋予普通用户

注:sudo操作对象是系统命令(/sbin文件下的命令),比如:关机、重启、添加新用户等命令

实际用途:有时候root用户可以把一些命令放权给其他用户去执行。最常见的比如服务器的重启等。让别人可以执行一些root命令,又不用知道root账号密码

1、授权操作步骤:

1.命令:visudo ,实际上是用vi打开/etc/sudoers 文件,里面可以修改授权命令

2.可以用:set nu行号第100行,或者用/进行搜索,找到”root ALL=(ALL) ALL“这句话。

语法”[用户名] [ALL=(可使用的身份)] [授权命令的绝对路径] “

只要按它的规则,在它的下面自己写上想授权的命令即可,比如:赋予hyk用户halt命令

也可以指定可以使用的后缀,如:hyk ALL=(root) /sbin/shutdown -r now,这样被授权用户就无法使用其他后缀的命令

2、普通用户执行授权命令

普通用户有了该命令的执行权限后,也不能直接执行,而是有一定的语法:

执行方法:

su - hyk   #切换到普通用户hyk,直接登陆普通用户账号也行
sudo -l    #查看当前用户被授权的所有命令
sudo /sbin/shutdown -r now    #语法:sudo [命令绝对路径]