继文件操作、Vim 编辑器和用户管理之后,我们深入学习 Linux 的权限体系。本文将详细讲解如何查看文件/目录的权限和归属,使用 chownchmod 修改它们,理解 umask 对默认权限的影响,以及掌握 SUID、SGID、Sticky 三种特殊权限。这些是 Linux 系统安全和权限控制的基石。

前言

在 Linux 系统中,一切皆文件,而文件的权限管理是系统安全的核心。无论是日常的文件操作、多用户环境的权限隔离,还是渗透测试中的权限维持与提权分析,理解 Linux 的权限模型都是必修课。

本文将从最基础的 ls -l 输出解析开始,逐步讲解 chownchmod(符号模式和数字模式)、umask 等基本命令,然后深入介绍 SUID、SGID、Sticky 三种特殊权限的用途与风险,最后带你掌握 ACL(getfacl/setfacl)实现更精细的访问控制。文章配有大量实验命令和截图位置提示。

一、查看权限与归属:ls -lls -ld

命令格式ls -l [文件/目录]ls -ld [目录]

  • ls -l:以长格式显示文件或目录的详细信息(若参数是目录,默认显示目录内的内容)。

  • ls -ld:显示目录本身的信息,而不是目录内的内容。

使用 ls -l 查看文件或目录的详细属性,ls -ld 专门查看目录本身(而非目录内的内容)。

[root@svr223 ~]# ls -ld /home
drwxr-xr-x. 4 root root 4096 Mar 20 10:00 /home

1. 输出格式解析

drwxr-xr-x 为例,共 10 个字符:

位置 含义
第 1 个字符 文件类型:d 目录,- 普通文件,l 符号链接
第 2-4 个字符 属主(user)权限:r 读,w 写,x 执行。无权限为 -
第 5-7 个字符 属组(group)权限:同上
第 8-10 个字符

其他用户(other)权限:同上

使用ls命令加上-ld参数就可以显示出目录的详细信息,前面的十个字符就代表权限,第二个到第十个字符三个一组分别对应属主、数组、其他用户的权限。

2. 目录权限的特殊说明

  • 读权限(r:允许列出目录内容(如 ls)。

  • 写权限(w:允许在目录内创建、删除、重命名文件(需要同时有 x 权限)。

  • 执行权限(x:允许进入目录(cd)以及访问目录内的文件。

权限 对文件的作用 对目录的作用
读(r) 可以查看文件内容(如 catlessvim 只读打开) 可以列出目录内容(如 ls),但无法进入目录
写(w) 可以修改文件内容、追加数据、截断文件 可以在目录内创建、删除、重命名文件(需要同时有执行权限 x
执行(x) 可以执行该文件(如果是脚本或二进制程序) 可以进入目录(cd),以及访问目录内的文件(路径解析需要)

示例:对目录只有 r 没有 x,则只能看到文件名列表,但无法进入或访问文件内容。

二、修改文件归属:chown

命令格式chown [选项] 用户名[:组名] 文件...

  • 用户名:指定新的属主。

  • 组名:可选,前面加冒号表示同时修改属组。

  • 常用选项:-R 递归修改目录及其所有子文件。

chown 用于修改文件或目录的属主和属组。

# 修改属主
chown kunkun /home/zhangsan

# 只修改属组
chown :kunkun /home/kunkun
# 同时修改属主和属组(使用冒号分隔)
chown kunkun:kunkun /home/kunkun

这里我们来尝试将kunkun的家目录进行属主、属组的更改。

从截图中可以看到,我们执行完命令后,使用ls命令查看,发现目录的属主变成了zhangsan,现在kunkun就变成了属组,我们可以看到属组是三条 - ,表示没有任何权限,然后我们跳转到kunkun用户,发现他根本都进不了他的家目录了,他回不了家了,使用cd命令和ls命令,都显示权限不够。

那么是怎么确定修改的是属主还是属组的呢?其实很简单,要修改属组的话在前面加上:就行了。

我们首先执行ls命令看看现在是什么样的,发现属主是zhangsan属组是kunkun,然后我们执行完命令后再次使用ls命令查看,发现属组也变成了zhangsan 。

其实可以同时更改属主和属组的,很简单有冒号的和没有冒号的接着写就行了。下面我们来使用命令将属主和属组重新改回kunkun。

我们执行完命令后使用ls命令查看,发现属主和属组又变成了kunkun,然后我们用su命令切换到kunkun用户,现在能cd进去了使用pwd命令也看到确实可以进去了,现在kunkun用户对他的家目录又有权限了,他可以回家了。

三、修改权限:chmod

命令格式chmod [选项] 模式 文件...

模式有两种形式:

  • 符号模式:[ugoa][+-=][rwx]

  • 数字模式:三位八进制数(如 755)

chmod 用于修改文件或目录的权限,支持符号模式和数字模式。

1. 符号模式

对象 符号 含义
u user 属主
g group 属组
o other 其他用户
a all 所有(u+g+o)
操作 符号 含义
+ 添加权限
- 移除权限
= 覆盖(设置精确权限)
权限 符号
r
w
执行 x

示例

# 移除属主的写权限
chmod g-w file.txt
# 设置其他用户只有读权限
chmod o=r file.txt
# 同时设置多个,每个用逗号隔开就行了
chmod u+rwx,g+rx,o-rwx file.txt

下面我们来尝试给kunkun家目录进行权限的修改,我们给属主减少w权限、给属组增加r和x权限、给其他用户增加r和x权限。

执行完命令后可以看到权限一步到位就变成了我们想要的样子了,直接用=就很方便,可以不用看更改之前的权限分布。

2. 数字模式(八进制)

更改权限还可以通过数字模式进行更改

每个权限位对应一个数字:r=4w=2x=1。三位数字分别表示属主、属组、其他。

chmod 755 file.txt # 属主 rwx,属组 r-x,其他 r-x
chmod 644 file.txt # 属主 rw-,属组 r--,其他 r--
chmod 600 secret.txt # 属主 rw-,属组 ---,其他 ---

  • 权限数值对照表
权限 二进制 数值
r(读) 100 4
w(写) 010 2
x(执行) 001 1
-(无权限) 000 0
  • 权限组合的计算方法

将某个用户类别拥有的权限对应的数值相加,得到该类别的一位数字。

权限组合 计算 数值
rwx 4+2+1 7
rw- 4+2+0 6
r-x 4+0+1 5
r-- 4+0+0 4
-wx 0+2+1 3
-w- 0+2+0 2
--x 0+0+1 1
--- 0+0+0 0
  • 三位数字的含义

chmod 755 file 中的三位数字分别代表:

  • 第一位(7):属主(user)权限 = rwx

  • 第二位(5):属组(group)权限 = r-x

  • 第三位(5):其他用户(other)权限 = r-x

因此 755 等价于 -rwxr-xr-x

下面我们试试通过数字模式来进行权限的修改。我们将/home/kunkun的属主权限改为rwx,属组改为rw-其他用户改为r-x 。

我们通过chmod 765成功更改权限分布像我们想的那样,这个方法还是很方便。

四、特殊权限:SUID

SUID(Set User ID)

设置格式chmod u+s 文件名chmod 4755 文件名

  • 作用:只对可执行文件有效。普通用户执行该文件时,进程获得文件属主的权限。

  • 典型例子/usr/bin/passwd(属主 root,权限 rws),普通用户可修改自己的密码。

  • 查看:属主的 x 位变为 s(若原无执行权限则为 S)。

安全风险:SUID 程序可能被利用提权。

我们可以使用cp命令复制/usr/bin/vim 并命令为.vim linux中万物皆文件,我们使用的命令也不例外,这些命令一般都可以在bin中找到对应的文件,我们就可以复制出一个除了名字不一样外其他功能一样的vim。

由于点开头的文件是隐藏文件,所以查询的时候要加-A参数,执行完查询命令后可以看到我们成功复制出了一个.vim文件,可以将他当作vim来使用,功能是一样的。下面我们来给.vim添加s权限。

可以看到,我们成功添加了s权限,这个权限是占x权限位的。

在/etc/hosts文件中,存放着DNS信息,我们可以来看看这个文件的权限

可以看到这个文件属主只有rw权限,属组和其他用户都只有r权限,也就是说只有属组是有写入权限的,kunkun用户现在是其他用户,他没有写入权限。我们不妨来验证一下kunkun用户能不能写入。

我们在hosts文件中尝试写入192.168.10.223 www.baidu.com 这个意思就是把这个baidu的域名解析成这个ip,写入后我们用wq!来强制保存,发现强制保存也是失败的,说明没有写入权限确实不能成功写入。下面我们来试试使用.vim呢,这个文件是有s权限的。

使用.vim输入后强制保存,并没有报错,我们使用cat命令查看发现成功写入了。我们来分析分析,这个hosts文件只有属主能够写入的,现在我们是用的kunkun用户,我们使用了有s权限的.vim命令后成功写入了,说明这个s权限可以让普通用户拥有属主的权限,如果属主是root的话,这个s权限可以让普通用户暂时拥有root权限。刚才我们更改的是DNS解析的文件,下面我们来试试访问www.baidu.com呢。

我们ping www.baidu.com是能ping通的,但是我们来看这个源ip是192.168.10.223,这肯定不是baidu的ip吧,事实上这是我们在hosts文件中写的ip,这个ip是我本机的ip,试想一下,如果攻击者利用这个权限把这个ip改成钓鱼网站的ip,那么用户访问百度就会跳转到攻击者的钓鱼网站,这就很危险了。所以这个权限就是一个很经典的后门,攻击者只要拿到了一次root,然后建立了一个这样的后门,以后就算拿不到root了也可以通过这个后门来获得root权限。

五、精细权限控制:ACL(Access Control List)

传统的 chmod 只能为属主、属组、其他三类用户设置权限。ACL 可以为任意指定的单个用户或用户组设置独立权限,更灵活。

1. 查看 ACL:getfacl

命令格式getfacl 文件/目录

# 查看文件的 ACL
getfacl /root

执行完这个命令可以看到这个和ls查看的差不多,只不过是竖着显示的。

2. 设置 ACL:setfacl

命令格式setfacl [选项] 规则 文件/目录

  • -m:修改或添加 ACL 条目

  • -x:删除指定 ACL 条目

  • -b:清除所有扩展 ACL

  • -R:递归设置(对目录)

为指定用户添加权限

bash

# 为用户 alice 添加读写权限
setfacl -m u:kunkun:rw file.txt

为指定组添加权限

bash

# 为组 dev 添加读和执行权限
setfacl -m g:dev:r-x /root

删除指定用户的 ACL

bash

setfacl -x u:kunkun /root

递归设置目录的默认 ACL(新文件继承)

清除所有扩展 ACL

bash

setfacl -b /root

再用 getfacl 查看详细信息。

下面我们来进行一些操作示例。

可以看到我们可以成功setfacl加上-m参数给指定用户添加额外权限。还可以使用-x参数对额外权限进行删除。

使用-x参数后可以看到kunkun的额外权限没有了,同时也可以使用-d参数对所有的额外权限进行清除,这里就不一一展示了,如果要对组进行额外权限的操作就把u改成g就行了,有了这个命令后对于权限的操作就更加灵活了。

六、总结

命令/概念 作用 常用格式
ls -l 查看权限 ls -l [文件]ls -ld [目录]
chown 修改属主/属组 chown [用户][:组] 文件
chmod 修改权限 chmod [ugoa][+-=][rwx] 文件chmod 755 文件
SUID 执行时获得属主权限 chmod u+s 文件4755
getfacl 查看 ACL getfacl 文件
setfacl 设置 ACL setfacl -m u:用户:权限 文件

掌握这些权限知识,你就能理解 Linux 多用户环境下的安全模型,并能进行权限维持和提权分析。


原创作者:浅了

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐