访问控制表(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:
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意思是当挂载发生错误时,重新挂载并以只读的方式进入
查看ACL命令
getfacl 文件名
设定ACL权限
setfacl 选项 文件名
选项:
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::---
最大有效权限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权限
递归ACL权限
root@karen-laptop:/# setfacl -m u:用户名:权限 -R 文件名
#对目录下的子目录也进行递归的ACL权限设置,但对于父目录下新建的子文件不具有此效应
root@karen-laptop:/# setfacl -m -d u:用户名:权限 -R 文件名
#对目录下的子目录也进行递归的ACL权限设置,并且父目录下所有的新建子文件也会继承父目录的ACL权限
SetUID的功能
设定SetUID的方法
取消SetUID的方法
危险的SetUID
- 关键目录应严格控制写权限。比如“/”、“/usr”等
- 用户的密码设置要严格遵守密码三原则
- 对系统中默认应该具有SetUID权限的文件作一列表,定时检查有没有这之外的文件被设置了SetUID权限
SetGID针对文件的功能
- 只有可执行的二进制程序才能设置权限
- 命令执行者要对该程序拥有x(执行)权限
- 命令执行在执行程序的时候,组身份升级为该程序文件的属组
- SetGID权限同样只在该程序执行过程中有效,也就是说组身份改变只在程序执行过程中有效
SetGID针对目录的作用
- 普通用户必须对此目录拥有r和x权限,才能进入此目录
- 普通用户在此目录中的有效组会变成此目录的属组
- 若普通用户对此目录拥有w权限时,新建的文件的默认属组是这个目录的属组
设定SetGID
取消SetGID
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 5月 14 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 5月 14 11:08 ./
drwxrwxrwt 14 root root 4096 5月 14 11:07 ../
-rw-rw-r-- 1 karen root 0 5月 14 11:08 abc
SBIT粘着位作用
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 5月 14 16:07 /tmp/
总结:
chattr [+-=] [选项] 文件或目录名
+:增加权限
-:删除权限
=:等于某权限
选项:
lsattr [选项] 文件名
选项:
-a 显示所有文件和目录
-d 日批目标是目录,仅列出目录本身的属性,而不是子文件的
root@karen-ubuntu:/home/karen# touch abc
root@karen-ubuntu:/home/karen# ll
总用量 240
drwxr-xr-x 33 karen karen 4096 5月 15 08:49 ./
drwxr-xr-x 5 root root 4096 5月 14 15:22 ../
-rw-r--r-- 1 root root 0 5月 15 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 #此时的删除命令可生效
当你安装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命令