Linux 温习(八): 文件权限

2023-02-17 17:15:07 浏览数 (2)

权限的意义在于允许某一个用户或某个用户组以规定的方式去访问某个文件。例如,Apache 服务进程默认由 Apache 用户访问,除了 root 用户以外,其他用户均不能访问相关进程,这样就能通过在文件上设置用户或用户组的访问方式达到限制目的。

文件相关参数说明

在 Linux 中第一个字符代表这个文件是目录、文件或链接文件等等。

  • 当为 d 则是目录
  • 当为 - 则是文件;
  • 若是 l 则表示为链接文档(link file)
  • 若是 b 则表示为装置文件里面的可供储存的接口设备(可随机存取装置)
  • 若是 c 则表示为装置文件里面的串行端口设备,例如键盘、鼠标(一次性读取装置)

每个文件的属性由左边第一部分的 10 个字符来确定(如下图)。

基本权限UGO

  • U:owner,属主
  • G:group,属组
  • O:other,其他用户

chown

修改文件属主、属组。

代码语言:javascript复制
chown 用户.[组] 文件
代码语言:javascript复制
chown www file2
chown www.linux file2

chgrp

修改文件组。

代码语言:javascript复制
chgrp 组 文件
代码语言:javascript复制
chgrp root file2

chmod

修改文件权限。

代码语言:javascript复制
chmod 对象[u、g、o、a] 赋值[ 、-、=] 权限类型[r、w、x] 文件
chmod 1 2 4 1 2 4 1 2 4 文件
代码语言:javascript复制
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 令查看到的内容相差无几。

代码语言:javascript复制
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-”.

代码语言:javascript复制
> 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 命令查看。

代码语言:javascript复制
> 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” 权限。

代码语言:javascript复制
> 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 将属于其他用户,因此便具有了读取权限。

代码语言:javascript复制
> 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 的基本权限。

代码语言:javascript复制
> 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 用户下为什么不能查看?

代码语言:javascript复制
> 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 的权限。

代码语言:javascript复制
$ which cat
/bin/cat
$ ll -d
drwx------ 2 dasheng dasheng 62 1月  16 10:46 .

普通用户可以修改密码, dasheng 用户运行的是 /bin/passwd 文件,最终修改的是 /etc/shadow 文件,然而 /etc/shadow 文件只有 root 用户可以修改。

代码语言:javascript复制
$ passwd
更改用户 dasheng 的密码 。
为 dasheng 更改 STRESS 密码。
(当前)UNIX 密码:
新的 密码:
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
$ which passwd
/bin/passwd

当 dasheng 用户执行 passwd 命令时,使用“ps aux”命令查看当前进程发现,真正运行 passwd 的却是 root 用户

代码语言:javascript复制
# 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 。

代码语言:javascript复制
> ll /bin/passwd
-rwsr-xr-x. 1 root root 27856 4月   1 2020 /bin/passwd

任何用户在执行该文件时,其身份是该文件的属主,在进程文件(二进制,可执行)上增加 SUID 权限,让本来没有相应权限的用户也可以访问没有权限访问的资源。

普通用户可通过 SUID 提权,使用 chmod 命令给 user 增加 SUID 权限,切换到 dahseng 用户下,即可查看 /root/test.sh。

代码语言:javascript复制
# 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 组。

代码语言:javascript复制
> 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,该目录下新创建的文件会继承其属组。

代码语言:javascript复制
> 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权限,具体如下所示。

总结

当然权限这块还有比较多的知识值得学习,大家可以自行进行学习。

参考 & 引用

Linux 文件基本属性 | 菜鸟教程

0 人点赞