继文件操作、Vim 编辑器和用户管理之后,我们深入学习 Linux 的权限体系。本文将详细讲解如何查看文件/目录的权限和归属,使用
chown和chmod修改它们,理解umask对默认权限的影响,以及掌握 SUID、SGID、Sticky 三种特殊权限。这些是 Linux 系统安全和权限控制的基石。
前言
在 Linux 系统中,一切皆文件,而文件的权限管理是系统安全的核心。无论是日常的文件操作、多用户环境的权限隔离,还是渗透测试中的权限维持与提权分析,理解 Linux 的权限模型都是必修课。
本文将从最基础的ls -l输出解析开始,逐步讲解chown、chmod(符号模式和数字模式)、umask等基本命令,然后深入介绍 SUID、SGID、Sticky 三种特殊权限的用途与风险,最后带你掌握 ACL(getfacl/setfacl)实现更精细的访问控制。文章配有大量实验命令和截图位置提示。
一、查看权限与归属:ls -l和ls -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) | 可以查看文件内容(如cat、less、vim只读打开) | 可以列出目录内容(如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=4,w=2,x=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 多用户环境下的安全模型,并能进行权限维持和提权分析。
原创作者:浅了