LInux笔记——权限管理

时间:2021-03-04 16:21:11

1 ACL权限

1.1 ACL权限简介

访问控制表(Access Control List,ACL),又称存取控制串列,是使用以访问控制矩阵为基础的访问控制表,每一个(文件系统内的)对象对应一个串列主体[1]。访问控制表描述用户或系统进程对每个对象的访问控制权限。

ACL权限控制主要目的是提供传统的owner,group,other的read,wirte,execute权限之外的具体权限设置,可以针对单一用户或组来设置特定的权限。
比如对/project目录,root和group有rwx权限,others无权限,ACL可单独为用户st分配r-x权限,不再考虑用户的身份是什么。
查看分区ACL权限是否开启

root@karen-ubuntu:~# df -h #查看分区使用状况,用此命令查询/在哪个文件系统
文件系统        容量  已用  可用 已用% 挂载点
udev            3.9G     0  3.9G    0% /dev
tmpfs           791M  9.6M  781M    2% /run
/dev/sdb7        55G   11G   42G   21% /
…………
/dev/sda5       459G   12G  424G    3% /home
tmpfs           791M  108K  791M    1% /run/user/1000

root@karen-ubuntu:~# dumpe2fs -h /dev/sdb7 #查询制定分区详细文件系统信息的命令
dumpe2fs 1.42.13 (17-May-2015)
Filesystem volume name:   <none>
Last mounted on:          /
Default mount options:    user_xattr acl
…………

此时的默认挂载选项支持acl,则分区ACL权限默认开启

临时开启分区ACL权限

root@karen-ubuntu:~# mount -o remount,acl / #重新挂载根分区,并挂载加入acl权限,关机后失效

永久开启分区ACL权限

root@karen-ubuntu:~# vim /etc/fstab
UUID=5b3b038c-b0e3-43e6-b961-362e03d58032 /               ext4    errors=remount-ro,acl 0       1
#将分区自动挂载选项中添加acl
#errors=remount-ro意思是当挂载发生错误时,重新挂载并以只读的方式进入

1.2 查看与设定ACL权限

查看ACL命令

getfacl 文件名  

设定ACL权限

setfacl 选项 文件名

选项:

  • -m:设定ACL权限
  • -x:删除指定的ACL权限
  • -b:删除所有的ACL权限
  • -d:设定默认ACL权限
  • -k:删除默认ACL权限
  • -R:递归设定ACL权限

范例:给用户st设定ACL权限
LInux笔记——权限管理

root@karen-laptop:/# groupadd tgroup #添加用户组tgroup
root@karen-laptop:/# useradd sunny #添加用户sunny
root@karen-laptop:/# useradd lori #添加用户lori
root@karen-laptop:/# gpasswd -a sunny tgroup #将sunny添加到tgroup
root@karen-laptop:/# gpasswd -a lori tgroup #将lori添加到tgroup
root@karen-laptop:/# cat /etc/group #显示group信息,可看到sunny和lori已加入tgroup
…………
lori:x:1001:
sunny:x:1002:
tgroup:x:1003:lori,sunny
root@karen-laptop:/# mkdir /project #新建project目录
root@karen-laptop:/# chown root:tgroup /project #将project所有者改为root
root@karen-laptop:/# chmod 770 /projrct #将project权限设为770
root@karen-laptop:/# useradd st #添加用户st
root@karen-laptop:/# setfacl -m u:st:rx /project 将st用户对project的权限设为r-x
root@karen-laptop:/# getfacl project #查看project的acl权限
# file: project
# owner: root
# group: tgroup
user::rwx
user:st:r-x    #可看出单独的st用户有着r-x权限
group::rwx
mask::rwx  #最大有效权限mask
other::---

1.3 最大有效权限与删除ACL权限

最大有效权限mask

  • mask是用来制定最大有效权限的。如果我给用户赋予了ACL权限,是需要和mask的权限“相与”才能得到用户的真正权限
root@karen-laptop:/# setfacl -m m:rx /project 
#修改最大有效权限mask为r-x,使用“m:权限”格式 

删除ACL权限

root@karen-laptop:/# setfacl -x u:用户名 文件名 
#删除指定用户的ACL权限
root@karen-laptop:/# setfacl -x g:组名 文件名 
#删除指定用户组的ACL权限
root@karen-laptop:/# setfacl -b 文件名 
#删除文件的所有的ACL权限

1.4 默认ACL权限和递归ACL权限

递归ACL权限

  • 递归是父目录在设定ACL权限是,所有的子文件和子目录也会拥有相同的ACL权限
root@karen-laptop:/# setfacl -m u:用户名:权限 -R 文件名 
#对目录下的子目录也进行递归的ACL权限设置,但对于父目录下新建的子文件不具有此效应
root@karen-laptop:/# setfacl -m -d u:用户名:权限 -R 文件名
#对目录下的子目录也进行递归的ACL权限设置,并且父目录下所有的新建子文件也会继承父目录的ACL权限

2 文件特殊权限

2.1 SetUID

SetUID的功能

  • 只有可以执行的二进制程序才能设定SUID权限
  • 命令执行者要对该程序拥有x(执行)权限
  • 命令执行者在执行该程序时获得该程序文件属主的身份(在执行程序的过程中灵魂附体为文件的属主)
  • SetUID权限只在该程序执行过程中有效,也就是说身份改变只在程序执行过程中有效

设定SetUID的方法

  • 4代表SUID
    • chmod 4755 文件名
    • chmod u+s 文件名

取消SetUID的方法

  • chmod 755 文件名
  • chmod u-s 文件名

危险的SetUID
- 关键目录应严格控制写权限。比如“/”、“/usr”等
- 用户的密码设置要严格遵守密码三原则
- 对系统中默认应该具有SetUID权限的文件作一列表,定时检查有没有这之外的文件被设置了SetUID权限

2.2 SetGID

SetGID针对文件的功能
- 只有可执行的二进制程序才能设置权限
- 命令执行者要对该程序拥有x(执行)权限
- 命令执行在执行程序的时候,组身份升级为该程序文件的属组
- SetGID权限同样只在该程序执行过程中有效,也就是说组身份改变只在程序执行过程中有效

SetGID针对目录的作用
- 普通用户必须对此目录拥有r和x权限,才能进入此目录
- 普通用户在此目录中的有效组会变成此目录的属组
- 若普通用户对此目录拥有w权限时,新建的文件的默认属组是这个目录的属组

设定SetGID

  • 2代表SGID
    • chmod 2755 文件名
    • chmod g+s 文件名

取消SetGID

  • chmod 755 文件名
  • chmod g-s 文件名
root@karen-ubuntu:/home/karen# cd /tmp
root@karen-ubuntu:/tmp# mkdir dtest
root@karen-ubuntu:/tmp# chmod g+s dtest #为目录dtest设定SGID
root@karen-ubuntu:/tmp# ll -d dtest
drwxr-sr-x 2 root root 4096 514 11:07 dtest/      
root@karen-ubuntu:/tmp# chmod 777 dtest
root@karen-ubuntu:/tmp# su - karen
karen@karen-ubuntu:~$ cd /tmp/dtest
karen@karen-ubuntu:/tmp/dtest$ touch abc
karen@karen-ubuntu:/tmp/dtest$ ll   #因为设置了SGID,abc文件的所有者为karen,所属组还是为root组
总用量 8
drwxrwsrwx  2 root  root 4096 514 11:08 ./
drwxrwxrwt 14 root  root 4096 514 11:07 ../
-rw-rw-r--  1 karen root    0 514 11:08 abc

2.3 Sticky BIT

SBIT粘着位作用

  • 粘着位目前只对目录有效
  • 普通用户对该目录拥有w和x权限,即普通用户可以在此目录拥有写入权限
  • 如果没有粘着位,因为普通用户拥有w权限,所以可以删除此目录下所有文件,包括其他用户建立的文件。一旦赋予了粘着位,除了root可以删除所有文件,普通用户就算拥有w权限,也只能删除自己建立的文件,但是不能删除其他用户建立的文件
karen@karen-ubuntu:/tmp$ touch test   #用karen用户创建test文件
karen@karen-ubuntu:/tmp$ su - sunny   #切换成用户sunny
密码: 
sunny@karen-ubuntu:~$ whoami
sunny
sunny@karen-ubuntu:~$ cd /tmp
sunny@karen-ubuntu:/tmp$ ls
karen-test  sogou_sync_fifo  test  uud_added.zip
sunny@karen-ubuntu:/tmp$ rm -rf test  #用sunny用户删除test文件时报错
rm: 无法删除'test': 不允许的操作
sunny@karen-ubuntu:/tmp$ ll -d /tmp  #因为有粘着位,所以即使其他用户有写权限但并不能随意删除不是该用户创建的文件
drwxrwxrwt 4 root root 4096 514 16:07 /tmp/

总结:

  • SUID只针对文件
  • SGID针对目录和文件
  • SBIT只针对目录

3 文件系统属性chattr权限

3.1 chattr命令格式

chattr [+-=] [选项] 文件或目录名
  +:增加权限
  -:删除权限
  =:等于某权限

选项:

  • i:如果对文件设置i属性,那么不允许对文件进行删除、改名,也不能添加和修改数据;如果对目录设置i属性,那么只能修改目录下文件的数据,但不允许建立和删除文件(包括root用户)
  • a:如果对文件设置a属性,那么只能在文件中增加数据,但是不能删除也不能修改数据;如果对目录设置a属性,那么只允许在目录这种建立和修改文件,但是不允许删除

3.2 查看文件系统属性

lsattr [选项] 文件名

选项:
-a 显示所有文件和目录
-d 日批目标是目录,仅列出目录本身的属性,而不是子文件的

root@karen-ubuntu:/home/karen# touch abc
root@karen-ubuntu:/home/karen# ll
总用量 240
drwxr-xr-x 33 karen karen  4096 515 08:49 ./
drwxr-xr-x  5 root  root   4096 514 15:22 ../
-rw-r--r--  1 root  root      0 515 08:49 abc
…………
root@karen-ubuntu:/home/karen# echo 111 >> abc #对abc写入数据111
root@karen-ubuntu:/home/karen# cat abc #查看abc文件内容
111
root@karen-ubuntu:/home/karen# chattr +i abc #对abc文件添加chattr权限
root@karen-ubuntu:/home/karen# lsattr -a abc #查看文件系统属性
----i--------e-- abc
root@karen-ubuntu:/home/karen# echo 1111 >> abc #尝试对abc文件写入数据,由于添加了chattr权限,操作不被允许
bash: abc: 不允许的操作
root@karen-ubuntu:/home/karen# rm abc 
rm: 无法删除'abc': 不允许的操作
root@karen-ubuntu:/home/karen# chattr -i abc #取消abc文件的chattr权限
root@karen-ubuntu:/home/karen# rm abc #此时的删除命令可生效

4 系统命令sudo权限

4.1 sudo权限

  • root把本来只能超级用户执行的命令赋予普通用户执行
  • sudo的操作对象是系统命令

4.2 sudo使用

当你安装Ubuntu的时候,它会自动添加第一个用户到sudo组,允许这个用户通过键入其自身帐户密码来获得超级用户(root)身份。然而,系统不会再自动添加其他的用户到sudo组当中去。如果你想在你的共享系统上授予某人某些超级用户特权,你必须给予他们sudo权利。

root@karen-ubuntu:/home/karen# visudo #打开/etc/sudoers文件
…………
# Cmnd alias specification

# User privilege specification
root    ALL=(ALL:ALL) ALL                    #可在这之后添加sudo用户,如添加sunny用户的sudo权限
sunny   ALL=/sbin/shutdown -r now            #root授权sunny用户实现重启权限
# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL                                       #admin前加%意思为admin用户组的权限

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL                                  #sudo前加%意思为sudo用户组的权限

# See sudoers(5) for more information on "#include" directives:
…………
root@karen-ubuntu:~# su-sunny #切换为sunny用户
sunny@karen-ubuntu:~$ sudo -l    #列出目前用户可执行与无法执行的指令
[sudo] sunny 的密码: 
匹配 %2$s 上 %1$s 的默认条目:
    env_reset, mail_badpass,
    secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin

用户 sunny 可以在 karen-ubuntu 上运行以下命令:
    (root) /sbin/shutdown -r now        #可知sunny用户可用sudo执行重启命令
sunny@karen-ubuntu:~$ sudo /sbin/shutdown -r now    #注意必须用绝对路径实现sudo命令