权限的意义在于允许某一个用户或某个用户组以规定的方式去访问某个文件。例如,Apache 服务进程默认由 Apache 用户访问,除了 root 用户以外,其他用户均不能访问相关进程,这样就能通过在文件上设置用户或用户组的访问方式达到限制目的。
文件相关参数说明
在 Linux 中第一个字符代表这个文件是目录、文件或链接文件等等。
- 当为 d 则是目录
- 当为 - 则是文件;
- 若是 l 则表示为链接文档(link file)
- 若是 b 则表示为装置文件里面的可供储存的接口设备(可随机存取装置)
- 若是 c 则表示为装置文件里面的串行端口设备,例如键盘、鼠标(一次性读取装置)
每个文件的属性由左边第一部分的 10 个字符来确定(如下图)。
基本权限UGO
- U:owner,属主
- G:group,属组
- O:other,其他用户
chown
修改文件属主、属组。
chown 用户.[组] 文件
chown www file2 chown www.linux file2
chgrp
修改文件组。
chgrp 组 文件
chgrp root file2
chmod
修改文件权限。
chmod 对象[u、g、o、a] 赋值[+、-、=] 权限类型[r、w、x] 文件 chmod 1+2+4 1+2+4 1+2+4 文件
chmod u-x file1 chmod o+x file1 chomd 766 file1
基本权限 ACL
UGO 权限只针对一个用户、一个组与其他用户,使用上有局限性,ACL (Access Control List )主要提供传统的 UGO 的 r、w、x 权限之外的具体权限设置,可以对单一用户、单一文件或目录进行权限设置。
ACL 基本用法
创建一个文件,使用 getfacl
命令查看 ACL 权限,此时显示的内容与先前使用 ll
令查看到的内容相差无几。
touch test.sh > ll test.sh -rw-r--r-- 1 root root 0 1月 16 10:19 test.sh > getfacl test.sh # file: test.sh # owner: root # group: root user::rw- group::r-- other::r--
setfacl
命令可以设置 ACL 权限,对每一个文件或目录进行更精确的权限设置,添加 -m
参数可以修改当前文件 ACL 权限。修改用户 www 下的 text.sh 文件的读、写权限,当用 ll 查看文件时,权限字符位最后出现 +
,说明该文件含有 ACL 权限。这时使用 getfacl
命令查看,用户 www 的权限已修改为 “rw-”.
> setfacl -m u:www:rw test.sh > ll test.sh -rw-rw-r--+ 1 root root 0 1月 16 10:19 test.sh > getfacl test.sh # file: test.sh # owner: root # group: root user::rw- user:www:rw- group::r-- mask::rw- other::r--
新创建用户 dasheng,为其增加 “rwx” 权限,使用 getfacl 命令查看。
> setfacl -m u:dasheng:rwx test.sh > getfacl test.sh # file: test.sh # owner: root # group: root user::rw- user:www:rw- user:dasheng:rwx group::r-- mask::rwx other::r--
为组 www 增加 “rw” 权限。
> setfacl -m g:www:rx test.sh > getfacl test.sh # file: test.sh # owner: root # group: root user::rw- user:www:rw- user:dasheng:rwx group::r-- group:www:r-x mask::rwx other::r--
添加 -x
参数可以删除用户对文件的所有权限,例如,对 www 用户执行该操作后,www 将属于其他用户,因此便具有了读取权限。
> setfacl -x u:www test.sh > getfacl test.sh # file: test.sh # owner: root # group: root user::rw- user:dasheng:rwx group::r-- group:www:r-x mask::rwx other::r--
添加 -b
参数可以删除所有扩展 ACL 权限,回到 UGO 的基本权限。
> setfacl -b test.sh > getfacl test.sh # file: test.sh # owner: root # group: root user::rw- group::r-- other::r-- > ll test.sh -rw-r--r-- 1 root root 0 1月 16 10:19 test.sh
高级权限
思考一个问题:在/root下创建文件 file01.txt,在 dasheng 用户下为什么不能查看?
> ll test.sh -rw-r--r-- 1 root root 0 1月 16 10:19 test.sh # dasheng 用户 > cat /root/test.sh cat: /root/test.sh: 权限不够
分析:以 dasheng 用户身份访问/usr/bin/cat进程产生的属主是 dasheng,dasheng 用户没有访问/root目录的权限,所以也没有读取 root/test.sh 的权限。
$ which cat /bin/cat $ ll -d drwx------ 2 dasheng dasheng 62 1月 16 10:46 .
普通用户可以修改密码, dasheng 用户运行的是 /bin/passwd 文件,最终修改的是 /etc/shadow 文件,然而 /etc/shadow 文件只有 root 用户可以修改。
$ passwd 更改用户 dasheng 的密码 。 为 dasheng 更改 STRESS 密码。 (当前)UNIX 密码: 新的 密码: 重新输入新的 密码: passwd:所有的身份验证令牌已经成功更新。 $ which passwd /bin/passwd
当 dasheng 用户执行 passwd 命令时,使用“ps aux”命令查看当前进程发现,真正运行 passwd 的却是 root 用户
# dasheng 用户 $ passwd 更改用户 dasheng 的密码 。 为 dasheng 更改 STRESS 密码。 (当前)UNIX 密码: # root 用户 > ps -aux | grep passwd |grep -v grep root 3019 0.0 0.0 170868 2060 pts/0 S+ 11:18 0:00 passwd
SUID
使用 ll
命令查看 /bin/passwd 文件,第 1 行的第 4 个字符为“s”。“s”表示特殊权限 SUID 。
> ll /bin/passwd -rwsr-xr-x. 1 root root 27856 4月 1 2020 /bin/passwd
任何用户在执行该文件时,其身份是该文件的属主,在进程文件(二进制,可执行)上增加 SUID 权限,让本来没有相应权限的用户也可以访问没有权限访问的资源。
普通用户可通过 SUID 提权,使用 chmod 命令给 user 增加 SUID 权限,切换到 dahseng 用户下,即可查看 /root/test.sh。
# root 用户 > chmod u+s /bin/cat > ll /bin/cat -rwsr-xr-x 1 root root 54080 11月 17 2020 /bin/cat # dasheng 用户 $ cat /root/test.sh #!/bin/bash
SGID
在一个程序上添加 SGID,用户在执行过程中会获得该程序用户组的权限(相当于临时加入了程序的用户组)。
在目录 /home 下创建一个目录 work ,将 work 组添加到该目录下,查看目录属组已修改为 work。在 /home/work 目录下创建一个文件 test2.sh,该文件属组为 root,并没有继承上级目录的 work 组。
> mkdir /home/work > groupadd work > chgrp work /home/work/ > ll -d /home/work/ drwxr-xr-x 2 root work 6 1月 16 11:35 /home/work/ > touch /home/work/test2.sh > ll /home/work/test2.sh -rw-r--r-- 1 root root 0 1月 16 11:36 /home/work/test2.sh
在一个目录上添加 SGID,该目录下新创建的文件会继承其属组。
> chmod g+s /home/work/ > ll -d /home/work/ drwxr-sr-x 2 root work 22 1月 16 11:36 /home/work/ > touch /home/work/test3.sh > ll /home/work/ 总用量 0 -rw-r--r-- 1 root root 0 1月 16 11:36 test2.sh -rw-r--r-- 1 root work 0 1月 16 11:41 test3.sh
Sticky
添加 Sticky 后,当用户对目录具有w、x权限,在该目录下建立的文件或目录,仅有自己与root才有权删除。
在目录/home下创建目录dir01,并赋予其777权限,具体如下所示。
总结
当然权限这块还有比较多的知识值得学习,大家可以自行进行学习。