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最大权限最终结果("与","合取"运算)
rrr
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 文件

作用目标适用条件使用操作 (命令)
用户被管理主机的地址 = (可使用的身份)绝对路径的授权命令
rootALL = (ALL)ALL
被管理主机的地址 = (可使用的身份)绝对路径的授权命令
#%wheelALL = (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