权限管理
ACL权限
对于一个文件,有所有者,所属组,其他人三个身份 . 不同身份的人对这个文件有不同的权限
ACL权限简介与开启
- 任何文件都只能有一个所属组
- ACL权限专门解决身份不够用的情况
- 解决方法 : 不关注三个身份 , 直接给用户赋予权限
- ACL 是 Access Control List 的缩写,称为访问控制列表,包含了对一个对象或一条记录可进行何种操作的权限定义。
- 例如一个文件对象的 ACL 为
Alice: read,write; Bob: read
,这代表 Alice 对该文件既能读又能写,而 Bob 只能读取。- ACL允许你给任何的用户或用户组设置任何文件/目录的访问权限。
查看分区ACL权限是否开启
1 | dumpe2fs -h /dev/sda |
- dumpe2fs命令是查询指定分区详细文件系统信息的命令
- -h : 仅显示超级块中信息,而不显示磁盘块组的详细信息
临时开启分区ACL权限
1 | # 重新挂载根分区,并挂载加入acl权限 |
永久开启分区ACL权限
1 | # 修改UUID , 添加acl |
查看与设定ACL权限 setfacl和getfacle
查看ACl命令
- get file Access Control List
1 | # 查看acl权限 |
设定ACL权限的命令
- set file Access Control List
1 | setfacl 选项 文件名 |
选项 :
- -m : 设定ACL权限
- -x : 删除指定的ACL权限
- -b : 删除所有的ACL权限
- -d : 设定默认ACL权限。
- -k : 删除默认ACL权限
- -R : 递归设定ACL权限。
准备工作 :
1 | # 创建文件夹 |
1 | # 首先添加一个用户A , A等待被赋予权限 |
user:testing_user:r-x
: 既不是所有者,也不是所属组 , 但他确实对文件/目录具有权限r-x
给用户组设置ACL权限
1 | # 给文件设置ACL权限 |
给组赋予权限,使用 g:组名:权限
格式
group:group1:rwx
: 既不是所有者,也不是所属组 , 但他确实对文件/目录具有权限r-x
最大有效权限与删除ACL权限
最大有效权限mask
mask是用来指定最大有效权限的。
赋予的ACL权限并不是真正的权限,是需要和mask的权限
相与
才能得到用户的真正权限简单来说就是mask和ACL都有的权限才是真正的权限
所以,我们可以通过调整最大权限mask来控制ACL的权限
所以 ,mask就是给一个天花板 , 我们主要是通过mask来防止我们在设置ACL权限时设置得过高.
使用
setfacl -m m:rx 文件名
修改最大有效权限
(设定mask权限为-x。使用m:权限
格式)
1 | getfacl project_dir |
#effective:r-x
: 说明了真正的有效权限为r-x
删除ACL权限
1 | # 删除指定用户的ACL权限 |
默认ACL权限和递归ACL权限
递归权限 :
递归权限
是父目录在设定ACL权限时,所有的子文件和子目录也会拥有相同的ACL权限。
1 | setfacl -m u:用户名:权限 -R 文件名 |
示例:
1 | setfacl -m u:user1:rx -R project_dir |
默认ACL权限 :默认ACL权限
的作用是如果给父目录设定了默认ACL权限,那么父目录中所有新建的子文件**都会继承父目录的ACL权限
1 | setfacl -m d:u:用户名:权限 文件名 |
示例:
1 | setfacl -m d:u:user1:rx -R project_dir |
默认ACL权限
和递归权限
只能用于目录
文件特殊权限
SetUID
SetUID的功能
只有可以执行的二进制程序才能设定SUID权限
命令执行者要对该程序拥有x(执行)权限
命令执行者在执行该程序时获得该程序文件所有者的身份
- 在执行程序的过程中灵魂附体为文件的所有者
- 简单来说 : 当前用户U,想要执行某个可执行文件F,文件F拥有SUID权限,并且所有者是root.当用户U执行文件F的时候,用户U就会暂时性获得root身份
SetUID权限只在该程序执行过程中有效,也就是说身份改变只在程序执行过程中有效
SUID权限的意义:
- 普通用户可以修改自己的密码,而密码是放在了
/etc/passwd
文件里面 , - 但是这个文件的权限是020,只有root才有权限能修改.
- 这时候就需要借用root权限来修改了
1
2ll /etc/shadow
# --w------- 1 root root 992 Aug 25 13:09 /etc/shadowpasswd命令拥有 SetUID 权限,所以普通可以修改自己的密码
1
2ll /usr/bin/passwd
# -rwsr-xr-x. 1 root root 30768 Nov 23 2015 /usr/bin/passwdcat命令没有 SetUID 权限,所以普通用户不能查看/etc/shadow文件内容
1
2ll /bin/cat
# -rwxr-xr-x 1 root root 45224 Jun 19 2018 /bin/cat
- 普通用户可以修改自己的密码,而密码是放在了
设定SetUID的方法
1 | ll /usr/bin/passwd |
这里的s出现在哪里,就表示是拥有什么权限:
- -rw
s
r-xr-x : SUID权限- -rwr-x
s
r-x : SGID权限- -rwr-xr-x
s
: SBID 权限
4代表SUID
1
2chmod 4755 文件名
chmod u+s 文件名2代表SGID
1
chmod 2755 文件名
1代表SBID
1
chmod 1755 文件名
示例 :
1 | touch file1 |
取消SetUID的方法
1 | chmod 755 文件名 |
示例:
1 | chmod 644 file1 |
chmod 755 文件名 和chmod u-s 文件名 的区别
1 | touch file1 |
我们发现
chmod 4755 file1
和chmod u+s file1
的结果不一样:
- -rw
s
r-xr-x- -rw
S
r–r–大写的
S
其实是报错的 , 因为一开始file1并没有执行权限
危险的SetUID
- 关键目录应严格控制写权限。比如
/
,/usr/
,/bin/
等 - 用户的密码设置要严格遵守密码三原则
- 对系统中默认应该具有 SetUID 权限的文件作一个列表,定时检查有没有这之外的文件被设置了 SetUID 权限
SetGID
SetGID针对文件的作用
- 只有可执行的二进制程序才能设置SGID权限
- 命令执行者要对该程序拥有ⅹ(执行)权限
- 命令执行在执行程序的时候,组身份升级为该程序文件的属组
- SetGID权限同样只在该程序执行过程中有效,也就是说组身份改变只在程序执行过程中有效
1 | ll /usr/bin/locate |
- /usr/bin/locate是可执行二进制程序,可以赋予SGID
- 执行用户lamp对/usr/bin/locate命令拥有执行权限执行/usr/bin/ocate命令时,组身份会升级为 slocate组,而
slocate组对/var/ib/locate/locate db数据库拥有r权限,所以普通用户可以使用 locate命令查询 locate
db数据库 - 命令结束,lamp用户的组身份返回为lamp组
1 | chmod 2755 文件名 |
SetGID针对目录的作用
- 普通用户必须对此目录拥有r和x权限,才能进入此目录
- 普通用户在此目录中的有效组会变成此目录的属组
- 若普通用户对此目录拥有w权限时,新建的文件的默认所属组是这个目录的所属组
示例:
1 | whoami |
SetUID 和 SetGID 的区别
- SetUID是变成可执行文件的所有者 , SetGID是变成可执行文件的所属组
- SetGID能针对文件和目录 , SetUID只能针对文件
取消 SetGID
1 | chmod 755 文件名 |
Sticky BIT
SBIT粘着位作用
- 粘着位目前只对目录有效
- 普通用户对该目录拥有w和x权限,即普通用户可以在此目录拥有写入权限
- 作用:
- 如果没有粘着位,因为普通用户拥有w权限,所以可以删除此目录下所有文件,包括其他用户建立的文件。
- 一但赋予了粘着位,除了root可以删除所有文件,普通用户就算拥有w权限,也只能删除自己建立的文件,但是不能删除其他用户建立的文件
1 | ll -d /tmp |
设置与取消粘着位
1 | # 设置粘着位 |
SUID, SGID, SBIT 的区别
权限作用对象不同
- SUID 只针对可执行文件 , 权限号为4
- SGID 针对可执行文件和目录 , 权限号为2
- SBIT 只针对目录 , 权限号为1
所以,特殊权限号为
7
是没有意义的(但可以设置),因为不管是文件还是目录 , 肯定有部分权限不能生效
1 chmod 7555 文件名
文件系统属性chattr权限
change file attributes on a linux file system(改变文件属性)
用于防止文件误删除
```bash
char [+-=] [选项] 文件或目录名1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
- +:增加权限
-:删除权限
=:等于某权限
- **chattr对root用户也生效**
- 选项:
- `i `:
- 如果对文件设置i属性,那么不允许对文件进行删除、改名,也不能添加和修改数据;(**只能看**)
- 如果对目录设置i属性,那么只能修改目录下文件的数据,但不允许建立和删除文件。(**只能修改现有文件**)
- `a`:add
- 如果对文件设置a属性,那么只能在文件中增加数据,但是不能删除也不能修改数据;(**不能删除现有数据,但是能加**)
- 如果对目录设置a属性,那么只允许在目录中建立和修改文件,但是不允许删除(**只能新建和修改文件**)
> i属性比a属性更为严格
>
> - 对于文件来说 , a可以追加数据
> - 对于目录来说 , a可以新建文件
#### 查看文件系统属性
```bash
lsattr 选项 文件名-a : 显示所有文件和目录
-d : 若目标是目录 , 仅列出目录本身的属性 , 而不是子文件的
示例:
对文件操作 : 只能看
1 | chattr +i file1 |
对目录操作 : 只能修改现有文件
1 | mkdir dir2 |
系统命令sudo权限
- root把本来只能超级用户执行的命令赋予普通用户执行。
- sudo的操作对象是系统命令
1 | visudo |
root ALL =(ALL) ALL
: 给某个用户赋予权限%wheel ALL=(ALL) ALL
: 给某一组赋予权限
1 | root ALL =(ALL) ALL |
root ALL =(ALL) ALL
:
允许 某个用户 在某台计算机上 执行某条命令
- 这里的
在某台计算机上
似乎很难理解- 如果一个网站是分布式服务器,每个服务器有IP地址
- 那么就要将这些服务器的IP地址全都加进去 , 保证命令能在这些服务器上执行.
说人话:
1 user1 192.168.0.156=/sbin/shutdown -r now给user1用户在输入的IP指定的机器(192.168.0.156)里运行shutdown -r now命令的权限
示例 :
授权user1用户可以重启服务器
1
user1 ALL=/sbin/shutdown -r now
user1 ALL=/sbin/shutdown
表示user1能执行shutdown的所有选项user1 ALL=/sbin/shutdown -r now
表示user1只能执行shutdown的-r选项
user1的使用方法:
不能直接写:
1
shutdown -r now
必须使用sudo:
1
sudo /sbin/shutdown -r now
查看user1可用的sudo命令:
1
sudo -l