文章目录
- 1. 用户角色与提权机制(root / 普通用户 / sudo)
- 1.1 root 用户(超级管理员 / God Mode)
- 1.2 普通用户(Standard User)
- 1.3 sudo 命令(SuperUser Do)
- 2. 用户与用户组(User & Group)
- 2.1 关键系统文件
- 2.2 用户与组管理命令实操
- 3. 深入理解 Linux 文件权限
- 3.1 权限位(r, w, x)的含义
- 4. 修改权限与所有者
- 4.1 修改文件权限:`chmod`
- 1. 数字表示法(最常用)
- 2. 符号表示法
- 4.2 修改文件所有者与所属组:`chown`
- 5. 生产环境常见安全实战
- 场景:部署一个部署脚本 `deploy.sh`
- 6. 总结
在 Linux 系统中,权限与用户管理是保证系统安全与稳定运行的基石。
Linux 是一个天然的多用户、多任务操作系统。不同的用户拥有不同的身份,而系统通过一套严密的文件权限机制,精确控制每个用户能够对文件或目录执行哪些操作(读取、修改还是执行)。
本文将带你理清用户/用户组模型,并掌握文件权限的查看、修改与实战运用。
1. 用户角色与提权机制(root / 普通用户 / sudo)
在深入具体的权限位之前,我们需要先搞清楚 Linux 中三种核心的用户身份与协作关系。这三者构成了 Linux 权限体系的基础框架,理解它们之间的区别与联系,是掌握整个权限管理的前提。
┌─────────────────────────────────────────┐ │ root 用户 (超级管理员) │ │ UID = 0, 拥有绝对掌控权 │ └────────────────────┬────────────────────┘ │ (通过 sudo 授权高危命令) │ ┌────────────────────▼────────────────────┐ │ 普通用户 (受限环境) │ │ UID >= 1000, 仅能修改自己的家目录与文件 │ └─────────────────────────────────────────┘1.1 root 用户(超级管理员 / God Mode)
- 标识:用户 ID(UID)固定为
0,命令行提示符通常是#。这是系统中最特殊的用户,UID 为 0 意味着它拥有对所有文件和进程的完全控制权。 - 权限:无限权限。可以读取、修改、删除系统中的任何文件,可以强行终止任何进程,甚至可以一条命令抹掉整个系统。无论是系统配置文件、其他用户的私有数据,还是内核级别的操作,root 都可以执行。
- 风险:没有"撤销"按钮。敲错一个空格(如
rm -rf / tmp/)就可能导致生产环境彻底崩溃。更严重的是,如果 root 账号被黑客攻破,攻击者将获得整个系统的完全控制权,可以植入后门、窃取数据、破坏服务,后果不堪设想。 - 使用建议:在日常操作中应尽量避免直接使用 root 登录。即使是系统管理员,也建议通过普通用户身份配合
sudo来执行需要特权的命令,这样既能完成任务,又能保留操作审计记录。
1.2 普通用户(Standard User)
- 标识:UID 通常
>= 1000,命令行提示符通常是$。系统安装时创建的第一个用户通常就是普通用户,后续添加的用户也默认属于此类。 - 权限:受限权限。默认只能在其家目录(如
/home/alex)和/tmp目录下自由创建/修改文件。无法修改系统核心配置(如/etc)、无法安装全局软件、无法重启系统服务。这些操作都需要通过sudo提权才能完成。 - 目的:实现环境隔离,防止单个用户的误操作或恶意行为破坏整个操作系统。在多用户服务器上,每个用户都拥有独立的家目录和私有文件,彼此之间互不干扰,这大大提升了系统的稳定性和安全性。
- 实际场景:在开发环境中,普通用户可以在自己的家目录下自由安装开发工具、创建项目文件、运行测试程序,而不会影响系统其他部分。即使某个用户的操作导致其家目录损坏,也不会影响其他用户和系统核心功能。
1.3 sudo 命令(SuperUser Do)
- 定位:一种安全提权机制。它架起了普通用户与 root 权限之间的桥梁,让系统管理变得更加灵活和安全。
- 作用:允许被授权的普通用户,以
root(或其他特权用户)的身份来执行某一条特定的命令,而无需知道 root 的真实密码。这意味着你可以精确控制哪些用户能执行哪些特权命令,而不是把所有 root 密码告诉所有人。 - 安全机制:执行
sudo时,系统提示输入的是普通用户自己的密码,且密码在一定时间内(默认 15 分钟)会被缓存,无需频繁重复输入。这个超时时间可以通过修改/etc/sudoers文件中的timestamp_timeout参数来调整。 - 权限控制:通过编辑
/etc/sudoers文件(建议使用visudo命令),管理员可以精细控制每个用户的 sudo 权限。例如,可以只允许某个用户执行特定的命令,而不授予其完整的 root 权限。 - 审计追踪:所有
sudo执行的操作都会被记录在系统日志中(如/var/log/auth.log),管理员可以随时查看谁在什么时候执行了什么特权操作,这为安全审计提供了重要依据。
最佳实践:在生产环境中,“平时用普通用户,敏感操作用 sudo,禁用 root 直接远程登录”是最核心的安全准则。具体来说:日常开发、文件操作使用普通用户;需要安装软件、修改系统配置时使用
sudo;同时修改 SSH 配置(/etc/ssh/sshd_config)中的PermitRootLogin no,彻底禁止 root 远程登录,从源头上降低安全风险。
2. 用户与用户组(User & Group)
Linux 将访问系统的个体划分为三种主体角色:
- 用户(User / Owner):文件的拥有者,通常是创建该文件的用户。
- 用户组(Group):具有相同权限需求的多个用户的集合。将权限赋予用户组,可以方便地进行批量权限管理。
- 其他人(Others):既不是文件拥有者,也不属于该文件所属用户组的系统其他所有用户。
除此之外,系统中还有一个最高特权身份:root(超级管理员)。root拥有系统的绝对控制权,可以跨越绝大多数普通权限限制。
2.1 关键系统文件
Linux 将用户和组的信息存储在以下配置文件中:
/etc/passwd:存储用户账号的基本信息(用户名、UID、默认 Shell 等)。/etc/group:存储用户组的信息(组名、GID、组成员等)。/etc/shadow:存储加密后的用户密码(仅root可读)。
2.2 用户与组管理命令实操
实操案例 1:创建用户并将其加入开发组
# 1. 创建一个新的用户组:devteamsudogroupadddevteam# 2. 创建新用户 alex,并将其加入 devteam 组,同时为其创建家目录sudouseradd-m-gdevteam alex# 3. 为 alex 设置密码sudopasswdalex# 4. 查看 alex 的身份信息(UID、GID 及所属组)idalex# 输出示例: uid=1001(alex) gid=1001(devteam) groups=1001(devteam)# 5. 将 alex 赋予 sudo 权限(将其加入 sudo 组)sudousermod-aGsudoalex3. 深入理解 Linux 文件权限
使用ls -l命令查看文件或目录时,输出的第一列就是权限字符串。
ls-l/var/www/html/index.html# 输出: -rwxr-xr-- 1 alex devteam 2048 Aug 27 10:00 /var/www/html/index.html将权限字符串-rwxr-xr--拆解如下:
- rwx r-x r-- │ │ │ └── [第 7-9 位] 其他人 (Others) 的权限: 可读 (r) │ │ └─────── [第 4-6 位] 所属组 (Group) 的权限: 可读 (r)、可执行 (x) │ └───────────── [第 1-3 位] 所有者 (User/Owner) 的权限: 可读 (r)、可写 (w)、可执行 (x) └────────────────── [第 0 位] 文件类型: - 表示普通文件, d 表示目录, l 表示软链接3.1 权限位(r, w, x)的含义
读(r)、写(w)、执行(x)在普通文件与目录上的含义完全不同,这是初学者最容易混淆的地方:
| 权限符号 | 对应数值 | 对普通文件的含义 | 对目录的含义 |
|---|---|---|---|
r(Read) | 4 | 可以查看文件内容(如cat、less) | 可以列出目录内的文件列表(如ls) |
w(Write) | 2 | 可以修改文件内容(如vim) | 可以在目录内创建、删除、重命名文件 |
x(Execute) | 1 | 可以作为程序/脚本执行(如./script.sh) | 可以进入该目录(如cd),以及访问其内部文件的属性 |
⚠️重要细节:如果对一个目录只有r权限而没有x权限,你能看到目录下的文件名,但无法进入该目录,也无法查看文件的具体属性或内容。
4. 修改权限与所有者
4.1 修改文件权限:chmod
修改权限有两种常用方式:数字法和字母法。
1. 数字表示法(最常用)
将r=4, w=2, x=1相加,算出每一组的权值(范围 0~7):
rwx= 4 + 2 + 1 =7(全权限)rw-= 4 + 2 + 0 =6(读写)r-x= 4 + 1 + 0 =5(读与执行)r--= 4 + 0 + 0 =4(只读)
# 将 index.html 设置为:所有者可读写执行(7),所属组可读执行(5),其他人只读(4)chmod754index.html# 常用:将脚本设置为所有者可读写执行,其他人可读执行chmod755deploy.sh# 常用:将私钥文件设置为仅所有者可读写,其他人无任何权限(SSH 私钥硬性要求)chmod600id_rsa2. 符号表示法
- 角色:
u(user),g(group),o(others),a(all) - 操作:
+(增加),-(减少),=(赋予)
# 为文件所有者增加执行权限chmodu+x build.sh# 移除其他人对该文件的写权限chmodo-w config.json# 递归(-R)将整个项目目录的所有者权限设为读写,其他人无权限chmod-Ru=rwX,go=project/4.2 修改文件所有者与所属组:chown
只有文件所有者或root用户才能修改文件的属主或属组。
实操案例 2: Web 服务器目录权限重置
# 1. 将 /var/www/html 目录及其内部所有文件的所有者改为 www-data,所属组改为 devteamsudochown-Rwww-data:devteam /var/www/html# 2. 仅修改所属组为 devteamsudochown:devteam /var/www/html/index.html5. 生产环境常见安全实战
场景:部署一个部署脚本deploy.sh
当你新建一个 Shell 脚本时,默认通常是没有执行权限的:
touchdeploy.shls-ldeploy.sh# 输出: -rw-r--r-- 1 alex devteam 0 Aug 27 10:15 deploy.sh# 此时直接运行会报错: Permission denied (权限被拒绝)./deploy.sh# 赋予执行权限并再次运行chmod+x deploy.sh ./deploy.sh# 运行成功6. 总结
| 需求场景 | 推荐命令 / 权限值 | 说明 |
|---|---|---|
| 赋予脚本执行权限 | chmod +x script.sh或chmod 755 | 保证当前用户或所有人能够直接./script.sh运行 |
| 保护敏感配置文件/密钥 | chmod 600 id_rsa/chmod 640 config.env | 防止敏感数据被其他人或组外成员读取 |
| 修改网站静态资源归属 | sudo chown -R www-data:www-data /var/www | 让 Nginx/Apache 进程拥有对网页目录的访问权限 |
| 解决 Permission denied | 排查ls -l查看当前身份对应的r/w/x权限 | 优先通过chmod或chown精确赋权,**切忌盲目chmod 777** |
💡安全提示:不要给生产环境的文件随意使用
chmod 777(这会让所有用户都具备读、写、执行权限)。按需赋权、最小权限原则才是保障 Linux 安全的核心。
🚀 感谢阅读!想了解更多?
📖 我的博客网站 | 记录思考,分享干货
🏡 我的个人主页 | 关于我、开源项目