引言
在 Linux 系统中,权限控制是保障系统安全的核心机制。通过限制用户对文件和资源的访问,它能有效防止未授权操作,保护数据不被篡改或泄露。合理设置权限不仅有助于实现用户隔离和最小权限原则,还能降低系统被滥用或攻击的风险,是每位系统管理员必须掌握的基础技能。
在 Web 服务管理中,权限控制尤为重要。多数情况下,即便攻击者利用漏洞入侵,所获得的权限也仅限于普通用户级别。正是依靠 Linux 严格的权限机制,才能将 Web 漏洞的影响局限在最小范围内,避免演变为更严重的系统级破坏。关于 Linux 系统中常见的权限提升手法,可以参考这个专栏:点击查看。
用户与用户组在 Linux 中的记录机制,可以参考这篇文章了解更多细节:Linux提权原理
ls -l 命令详解
示例
-rwxr-xr-x 1 root root 25451544 Apr 19 15:22 d-eyes
字段 | 示例值 | 含义说明 |
---|---|---|
文件类型+权限 | -rwxr-xr-x | - 表示普通文件;rwx 为所有者权限,r-x 为组权限,r-x 为其他用户权限 |
硬链接数 | 1 | 指向该文件的硬链接数量,普通文件通常为 1 |
所有者(用户) | root | 文件所有者 |
所属组(用户组) | root | 文件所属的用户组 |
文件大小 | 25451544 | 文件大小(以字节为单位),约 24.3 MB |
修改时间 | Apr 19 15:22 | 文件最后修改时间 |
文件名 | d-eyes | 文件的名称 |
Linux 权限基础
用户、用户组与其他用户的权限
在 Linux 中,每个文件或目录都归属于一个特定的用户(owner)和用户组(group)。系统通过权限位将访问控制划分为三类主体:文件所有者(用户)、所属用户组成员以及其他用户(others),每类主体都可以拥有各自的权限设置。
⚠️ :除去最前面的文件类型符号,后面的每三个字符依次表示所有者、用户组和其他用户的权限。
这种三段式的权限模型,使得 Linux 能够灵活地控制资源的访问,既能保护敏感数据,也能根据需要开放部分资源,确保系统的安全与多用户协作效率。
权限的类型
在 Linux 中,每个文件或目录的权限由三种基本类型组成:
- r(read)读权限
- 对文件:允许查看文件内容
- 对目录:允许列出目录中的文件和子目录
- w(write)写权限
- 对文件:允许修改或覆盖文件内容
- 对目录:允许在目录中创建、删除或重命名文件和子目录
- x(execute)执行权限
- 对文件:允许将文件作为程序运行
- 对目录:允许使用
cd
命令进入该目录
查看与修改文件权限
使用 ls -l 查看权限
在 Linux 中,可以使用 ls -l
命令查看文件或目录的权限信息,输出内容包括权限、所有者、用户组、文件大小和修改时间等。若加上 -a
参数(即 ls -la
),还能查看隐藏文件的权限情况。需要特别注意的是,权限字段的最左侧字符表示文件类型:-
表示普通文件,d
表示目录,l
表示符号链接等。
使用 chmod 修改权限
符号法(适合读写改)
chmod u+x script.sh # 给所有者添加执行权限
chmod go-w file.txt # 移除用户组和其他用户的写权限
chmod a+r config.cfg # 所有人添加读权限
数字法(适合整体设置)
权限通过三位八进制数表示,每位分别对应所有者、用户组和其他用户。
- 读(r)= 4,写(w)= 2,执行(x)= 1,叠加计算
chmod 755 run.sh # 所有者 rwx,用户组和其他用户 rx
chmod 644 index.html # 所有者 rw,用户组和其他用户 r
在实际使用中,我常通过 chmod +x examp
给可执行程序添加执行权限。需要注意的是,不建议直接使用 chmod 777
这样的权限设置,因为它会赋予所有用户读、写、执行权限,等于完全开放,可能导致系统权限控制形同虚设,带来安全隐患。
文件所有者与用户组管理
在 Linux 中,每个文件或目录都有一个所有者(user)和一个所属用户组(group),它们决定了该文件的访问权限归属。合理设置文件的所有权是权限控制的重要组成部分。
文件所有者
文件的所有者通常是创建该文件的用户,拥有对文件最全面的控制权限。所有者可以使用 chmod
修改权限,也可以通过 chown
更改所有权。
在 Linux 中,文件所有者对文件具有最高的权限控制能力。除非主动赋权,其他用户无法查看、修改或执行该文件。这种机制是 Linux 用于保护用户数据安全和隐私的核心方式之一。
只有在所有者显式开放权限后,其他用户才能访问该文件。但如果系统仅区分“文件所有者”和“其他用户”,那么一旦授权,所有非所有者用户都将获得访问权限,这在实际使用中往往过于宽泛。
查看所有者
ls -l filename
第一个root所在的位置为文件所有者。
修改文件所有者
sudo chown newuser filename
用户组
用户组是 Linux 中用于归类管理用户的机制。每个文件或目录都归属于一个用户组,组内用户可以根据设定的权限访问或修改资源。通过用户组,文件所有者可以仅向特定用户开放权限,而非对所有其他用户一视同仁。当文件所有者与部分用户属于同一组时,只需为该组设置权限,这些用户即可访问文件,而其他用户仍被限制。这种方式在团队协作中尤为实用,能够实现团队成员间资源共享,同时对非成员保持私有。
查看用户组
# 查看当前用户所属的所有组
groups
# 查看指定用户的所属组
groups 用户名
# 查看系统中所有用户组
cat /etc/group
# 优化输出
cut -d: -f1 /etc/group
修改文件所属用户组
sudo chown 用户名:用户组 文件名
sudo chgrp newgroup 文件名
特殊权限
除了基本的 r
(读)、w
(写)、x
(执行)权限外,Linux 还支持三种特殊权限,用于增强权限控制,常用于提升系统安全性或实现特定功能。下图可以看到一些隐藏文件或系统文件设置了这些特殊权限,以确保它们在共享、执行或删除时受到更严格的管理。
SUID(Set User ID)
SUID 设定后,用户执行该文件时,将临时以文件所有者的身份运行。常见于需要普通用户执行部分系统操作的程序,如 passwd
。
chmod u+s 文件名
权限标识:所有者的执行位显示为 s
,如 -rwsr-xr-x
SGID(Set Group ID)
SGID 对文件作用类似于 SUID,而对目录则更常见,表示新建的文件将继承目录的所属组。常用于共享目录。
设置命令:chmod g+s 目录名
权限标识:组执行位显示为 s
,如 drwxr-sr-x
Sticky Bit
设置 Sticky Bit 后,目录中的文件只能被其所有者或 root 删除,即使其他用户拥有写权限。常用于 /tmp
目录。
设置命令:chmod +t 目录名
权限标识:其他用户执行位显示为 t
,如 drwxrwxrwt
用户身份管理
身份切换
在 Linux 系统中,出于安全考虑,日常使用一般不建议直接以 root 用户登录。但某些操作需要 root 权限,这时可以通过用户身份切换命令完成。常用命令有两种:su
和 sudo
。
su命令(Switch User)
su [options] [username]
用于切换到指定用户身份,若不指定 username
,则默认切换为 root
用户。
常用参数说明:
-
或-l
:使用 login shell 的方式读取目标用户的环境变量(推荐使用)-m
:保留当前用户的环境设置-c "command"
:仅执行一次命令后返回当前身份
区别说明:
su
:切换用户但不加载目标用户环境(non-login shell),如PATH
变量等不会更新su -
:切换并加载目标用户完整环境(login shell),推荐使用
注意事项: 使用 su
切换到 root 时需要输入 root 用户密码。完成操作后可使用 exit
返回原用户。
sudo 命令(Superuser Do)
sudo
允许普通用户在不知晓 root 密码的情况下,临时以 root 权限执行命令。前提是该用户已被授权使用 sudo
,授权信息存储在 /etc/sudoers
文件中。
执行流程:
- 系统检查当前用户是否在 sudo 白名单中(通过
/etc/sudoers
) - 若有权限,用户输入自己的密码(root 用户免密)
- 验证通过后执行命令
sudoers文件配置
sudoers
文件用于配置哪些用户或用户组可以使用 sudo
以及他们能以何种身份执行哪些命令。
格式说明:
用户名 主机名=(可切换身份:目标组) 可执行命令
示例:
testuser ALL=(ALL:ALL) ALL # 可切换为任意用户身份,执行任意命令
testuser ALL=(root:root) ALL # 仅能以 root 身份执行任意命令
testuser ALL=(root:root) /usr/bin/passwd # 仅能以 root 身份执行 passwd 命令
这种权限分配机制保证了在保障系统安全的同时,也赋予用户必要的操作能力。如果你有团队管理需求,还可以通过用户组与 sudoers 配合实现更细粒度的权限控制。
查询用户信息
Linux 提供了多种命令,用于查询当前或指定用户的相关信息,常见命令如下:
命令 | 功能说明 |
---|---|
id <user> | 显示指定用户的 UID、GID、所属用户组等信息(默认显示当前用户) |
who am i / who -m | 显示当前登录会话用户的信息(来源于登录终端) |
whoami | 显示当前有效用户的用户名(可能与登录用户不同) |
w | 显示当前系统所有登录用户的信息及其活动状态 |
who | 显示当前系统所有登录用户的信息 |
last <user> | 显示指定用户的历史登录记录(默认显示当前用户) |
lastlog -u <user> | 显示指定用户最近一次登录信息(默认显示所有用户) |
注:此处不再展示各命令的执行效果,建议读者自行实验。