1. 基本权限
文件权限
只有管理员和文件所有者可以更改文件权限
$ chmod [u,g,o,a][+,-,=] r/w/x file
# 给 file 的 User(所有者)/Group(用户组)/Others(其他用户)/All(所有人)
# 增加(+)/减少(-)/赋值为(=) 读(r)/写(w)/执行(x)的权限
$ chmod [+,-,=] [nnn] file
# 三个数字表示对应的用户对象
# 每个数字由三个二进制比特位组成: 方便逻辑"与"运算
# [4]表示读取, [2]表示写入, [1]表示可执行
# nnn=751: 7=4+2+1(所有者可读,写,执行)
# 5=0+4+1(所属组可读,执行)
# 1=0+0+1(其他人可执行)
# nnn=635: 6=4+2+0(U), 3=0+2+1(G), 5=4+0+1(O)
$ chmod -R file # 递归修改
$ chmod u+x,g+r,o-w file
$ chmod 755 file
权 限 | 对 于 目 录 | 对 于 文 件 |
---|---|---|
[r]/[4] 读取 | 可以列出文件夹中的内容 | 可以查看内容, 如cat/tac/more/less/head/tail |
[w]/[2] 修改 | 可以创建/删除子文件或子目录 | 可以编辑内容, 如使用vim编辑器 |
[x]/[1] 可执行 | 可以cd进入该文件夹 | 可以执行文件, 如脚本文件,二进制程序 |
修改文件所有者(管理员)
$ chown [用户名][:用户组(可选, 非必须的)] [文件/目录]
修改文件所属组(管理员)
$ chgrp [组名] [文件/目录]
注:默认情况下文件的所有者为文件的创建者, 文件的所属组为文件创建者的默认组
显示, 设置新建文件的默认权限 (权限屏蔽字)
$ umask -S # 查看新建文件时的默认限制 (默认屏蔽字)
$ umask
# 0022 # 第一个0表示特殊权限
# 后面的022实际表示755
# 它们是互补的关系 (实际上022表示的是"屏蔽位")
# 计算过程
# 文件最终的默认权限: 666 - mask
# 目录最终的默认权限: 777 - mask
$ umask 00127 # 新建文件: 640, 新建目录: 650
# 这里文件的权限不应该是540吗? 其实并没有计算错误
新建的目录的权限会与 umask 一致, 但由于安全问题, 任何新建的文件都会被去除可执行权限
2. ACL权限
解决身份 (User,Group,Others) 权限分配不足问题
开启ACL
ACL 有时不会默认开启, 需要先查看当前挂载的磁盘是否支持ACL
# 查看挂载点
$ df -h
$ lsblk
# 查看分区详细信息 (是否支持ACL)
$ dumpe2fs -h /dev/sda1
# ......
# Default mount options: user_xattr acl
# ......
临时开启ACL权限 (比如重启一次修改就会丢失)
# 重新挂载"/"并加入ACL权限
$ mount -o remount,acl /
永久开启ACL权限
# (开机自动挂载磁盘的配置文件) 在 "default" 后加上 ",acl" 然后重启或者重新挂载
$ vim /etc/fstab
# 重读一次 /etc/fstab 配置文件排查错误 (错误的配置会导致开机无法进入系统)
$ mount -a
查看ACL
# 需要安装 acl 工具包, ACL信息保存在文件系统里, 重启不会丢失
$ getfacl [选项] [文件(夹)]
# 查看对象的ACL权限
-a # 仅显示文件访问控制列表
-d # 仅显示默认访问控制列表
-c # 不显示注释标题
-e # 打印所有有效权限
-E # 打印无有效权限
-s # 跳过仅具有基本项的文件
-R # 递归到子目录
-L # 逻辑查找, 遵循符号链接
-P # 物理查找, 不要遵循符号链接
-t # 使用表格输出格式
-n # 打印数字用户/组标识符
设定ACL权限
$ setfacl [选项] [文件名]
-m # 修改文件的当前ACL
-M # 从文件中读取要修改的ACL条目
-x # 从文件的ACL中删除条目
-X # 读取要从文件中删除的ACL条目
-b # 删除所有扩展的ACL条目
-k # 删除默认ACL
-n # 不要重新计算有效的权限掩码
-d # 操作应用于默认ACL
-R # 递归到子目录
-L # 逻辑查找, 遵循符号链接
-P # 物理查找, 不要遵循符号链接
# 赋予shuaige用户访问查看testb目录的权限
$ setfacl -m u:shuaige:rx /tmp/testb/
# 赋予class组访问查看testb目录的权限
$ setfacl -m g:class:rx /tmp/testb/
# 赋予shuaige用户访问查看testb目录下所有内容的权限
$ setfacl -m u:shuaige:rx -R /tmp/testb/
# 赋予class组访问查看testb目录下所有内容的权限
$ setfacl -m g:class:rx -R /tmp/testb/
# 以后在testb文件夹中新建文件时就会使用默认ACL权限
$ setfacl -m d:u:shuaige:rx -R /tmp/testb/
$ setfacl -m d:g:class:rx -R /tmp/testb/
# 修改testb文件夹最大ACL权限
$ setfacl -m m:rx /tmp/testb
# 删除shuaige用户访问查看testb目录的权限
$ setfacl -x u:shuaige:rx /tmp/testb/
# 删除class组访问查看testb目录的权限
$ setfacl -x g:class:rx /tmp/testb/
# 删除testb文件夹所有ACL权限
$ setfacl -b /tmp/testb/
用户真正得到的ACL权限是设定的权限和mask最大权限做"相与"逻辑运算的结果
自定义设定 | mask最大权限 | 最终结果("与","合取"运算) |
---|---|---|
r | r | r |
w | - | - |
- | x | - |
3. 文件特殊权限--SetUID
暂时以属主身份执行二进制程序文件
例如:普通用户本不可以读写/etc/shadow文件, 但普通用户之所以能改自己密码是因为在执行 /usr/bin/passwd 时临时获得了 passwd 的属主(root)权限
对shadow(权限000)文件进行的操作 | 命令的权限 | 操作说明 |
---|---|---|
/usr/bin/passwd | -rwsr-xr-x. | passwd有SUID权限,可以修改shadow |
/usr/bin/cat | -rwxr-xr-x. | cat无SUID权限,不能查看shadow |
注意事项
- 只能对可执行的二进制程序文件设定SUID权限
- 命令执行者必须对程序文件有执行(x)权限
- 获得的身份是临时的, 只在程序执行期间有效
权限设定
#设定SUID
$ chmod 4755 [文件名]
$ chmod u+s [文件名]
#取消SUID
$ chmod 755 [文件名]
$ chmod u-s [文件名]
警告!务必严格控制SUID!权限分配异常将会引起灾难性后果!!!
比如给 /usr/bin/vim 设置了SUID, 则任何普通用户都可以使用vim对任何文件进行修改!
4. 文件特殊权限--SetGID
暂时获得属组权限来执行程序文件, 与SUID非常类似
例如,由于SGID普通用户可以通过 /usr/bin/locate 来查找 /var/lib/mlocate/mlocate.db 数据库, 详情如下
文件 | 权限信息 | 说明 |
---|---|---|
/usr/bin/locate | -rwx**--s**--x. 1 root slocate | 有SGID权限 |
/var/lib/mlocate/mlocate.db | -rw-r-----. 1 root slocate | 属组有读取权限 |
注意事项
- (若对文件设定SGID) 则只能对可执行的二进制程序文件设定SGID权限
- 命令执行者必须对程序文件有执行(x)权限
- 获得的组身份是临时的, 只在程序执行期间有效
- (若对目录设定SGID) 普通用户必要有对目录的读取(r)执行(x)权限才可以进入目录
- 普通用户处于此目录时组身份会变成目录属组
- 若普通用户对该目录有写(w)权限那么新建的文件的属组会成为目录属组
权限设定
#设定SGID
$ chmod 2755 [文件名]
$ chmod g+s [文件名]
#取消SGID
$ chmod 755 [文件名]
$ chmod g-s [文件名]
5. 文件特殊权限--StickyBIT
注意事项
- 只能对目录设定SBIT权限(黏着位)
- 普通用户必须该目录有写(w)和执行(x)权限
- 普通用户就算对目录有写(w)权限,也只能删除自己创建的文件
例如/tmp目录
权限设定
#设定SBIT
$ chmod 1755 [文件名]
$ chmod o+t [文件名]
#取消SBIT
$ chmod 755 [文件名]
$ chmod o-t [文件名]
6. 文件系统属性CHATTR权限
用途
改变文件的特殊属性
命令格式
$ chattr [-RVf] [+,-,=] [选项] [文件(夹)]
$ lsattr [-RVadv] [文件]
# -R 表示递归
# -V 显示过程
选项 | 对文件的作用 | 对文件夹的作用 |
---|---|---|
a | 不能重命名和删除,只能追加内容,适合日志文件 | 只能创建文件 |
A | 不可修改访问时间 | |
c | 压缩后储存 | |
i | 锁定! 不能修改内容,重名名,删除 | 不能再文件夹下创建删除文件 |
s | 删除文件时直接从磁盘上抹除,不可恢复文件 | |
S | 修改后会立即写入磁盘(sync) | |
u | 删除文件会保留磁盘数据区,可以恢复 |
操作案例
# 锁定testb目录下所有文件
$ chattr -R +i /tmp/testb
# 解除只添加权限
$ chattr -a /tmp/testb
# 查看所有文件权限
$ lsattr -a /tmp/testb
# 只查看testb目录权限
$ lsattr -d /tmp/testb
7. SUDO权限
概念
把部分原本只能由管理员执行的命令赋予普通用户执行
修改权限
使用visudo
命令修改 /etc/sudoers 文件
作用目标 | 适用条件 | 使用操作 (命令) |
---|---|---|
用户 | 被管理主机的地址 = (可使用的身份) | 绝对路径的授权命令 |
root | ALL = (ALL) | ALL |
组 | 被管理主机的地址 = (可使用的身份) | 绝对路径的授权命令 |
#%wheel | ALL = (ALL) | ALL |
提醒:权限分配的越小、越精确越好! |
#添加
$ visudo
$ vim /etc/sudoers
# 允许shuaige用户在所有站点使用 sudo shutdown -r now
shuaige ALL=/usr/sbin/shutdown -r now
# 允许shuaige用户在特定站点使用 sudo vim
shuaige 192.168.0.15=/usr/bin/vim
# 允许wheel组内用户在任意站点无密码使用任意命令 (非常方便, 也比较危险)
%wheel ALL=(ALL) NOPASSWD: ALL
使用权限
# 查看所有被赋予的sudo权限
$ sudo -l
# 使用权限必须前面加上sudo
$ sudo shutdown -r now