Linux系统中,权限管理是保障系统安全与稳定运行的核心机制,合理分配普通用户权限既能满足日常操作需求,又能避免越权操作带来的风险,本文将从基础权限概念、sudo权限配置、特殊权限设置、ACL(访问控制列表)扩展四个维度,详细说明如何为普通用户分配权限。
Linux基础权限管理:用户、组与文件权限
Linux权限基于“用户-组-其他人”的三级模型,每个文件/目录都关联所有者、所属组及其他用户三类身份,每类身份拥有读(r)、写(w)、执行(x)三项基本权限。
用户与组管理
普通用户权限分配的前提是明确用户与组的归属,Linux通过useradd
创建用户(如useradd -m -s /bin/bash username
,-m
自动创建家目录,-s
指定默认 shell),groupadd
创建组(如groupadd developers
),用户加入组可通过usermod -G developers username
(附加组)或usermod -g developers username
(主组)。
文件/目录权限设置
文件权限通过chmod
命令修改,支持符号法(如chmod u+x file
,给所有者添加执行权限)和数字法(r=4、w=2、x=1,如chmod 755 file
,所有者rwx、组rx、其他人rx),目录权限需注意:r
允许列出目录内容,w
允许创建/删除目录内文件,x
允许进入目录(无x权限时,即使有r也无法访问目录内文件)。
文件/目录所有者通过chown
修改(如chown username:group file
),所属组通过chgrp
修改(如chgrp developers file
)。
基础权限数字含义对照表:
| 权限组合 | 数字表示 | 含义 |
|———-|———-|————————–|
| rwx | 7 | 读+写+执行(完全控制) |
| rw- | 6 | 读+写(无执行) |
| r-x | 5 | 读+执行(无写) |
| r– | 4 | 只读 |
| -wx | 3 | 写+执行(无读) |
| -w- | 2 | 只写 |
| –x | 1 | 只执行 |
| — | 0 | 无权限 |
sudo权限:让普通用户执行特定管理命令
普通用户默认无法执行需要root权限的命令(如systemctl
、apt
等),sudo
机制允许通过配置/etc/sudoers
文件,为指定用户分配执行特定命令或以root身份操作的能力。
sudoers文件配置
sudoers
文件是sudo权限的核心配置文件,直接编辑可能引发语法错误,需通过visudo
命令(默认调用nano
或vim
)修改。
常见授权规则
-
允许用户执行所有命令(不推荐,安全风险高):
username ALL=(ALL:ALL) ALL
含义:用户username
可在所有主机(ALL
)以任意用户(ALL
)或组(ALL
)身份执行所有命令(ALL
)。 -
允许用户执行特定命令(推荐):
username ALL=(ALL:ALL) /usr/bin/apt, /usr/bin/systemctl restart nginx
含义:仅允许执行apt
和systemctl restart nginx
命令,其他root命令需密码验证。 -
免密码执行命令(适用于脚本或自动化场景):
username ALL=(ALL:ALL) NOPASSWD: /usr/bin/docker
添加NOPASSWD:
前缀可跳过密码验证,但需谨慎使用。 -
基于命令别名的授权(批量管理命令):
在sudoers
文件中定义命令别名(如Cmnd_Alias NETWORKING = /sbin/ifconfig, /sbin/route
),再通过username ALL=(ALL:ALL) NETWORKING
授权。
sudo权限验证与生效
用户执行sudo命令时需输入自身密码(未配置NOPASSWD
时),默认5分钟内可重复使用密码验证,权限修改后立即生效,无需重启。
特殊权限:SUID、SGID与Sticky Bit
除基础权限外,Linux支持三种特殊权限,用于解决特定场景下的权限控制问题。
SUID(Set User ID,4xxx)
- 作用:用户执行具有SUID权限的程序时,程序以文件所有者身份运行(而非执行者身份)。
- 场景:需临时提升权限的程序,如
/usr/bin/passwd
(所有者为root,普通用户修改密码时需root权限写入/etc/shadow
)。 - 设置方法:
chmod u+s file
或chmod 4755 file
(数字法中首位为4)。
SGID(Set Group ID,2xxx)
- 作用:用户在具有SGID权限的目录中创建文件时,文件自动继承目录所属组(而非用户主组)。
- 场景:团队共享目录(如项目代码库),确保新文件统一属于项目组。
- 设置方法:
chmod g+s dir
或chmod 2775 dir
(数字法中首位为2)。
Sticky Bit(1xxx)
- 作用:仅对目录有效,限制用户只能删除自己的文件(即使对目录有w权限,也无法删除其他用户的文件)。
- 场景:公共目录(如
/tmp
),防止恶意删除他人文件。 - 设置方法:
chmod +t dir
或chmod 1777 dir
(数字法中首位为1)。
特殊权限对比表:
| 权限类型 | 作用对象 | 数字表示 | 典型示例 |
|———-|———-|———-|————————|
| SUID | 可执行文件 | 4xxx | /usr/bin/passwd
|
| SGID | 目录/文件 | 2xxx | 项目共享目录 |
| Sticky Bit | 目录 | 1xxx | /tmp
|
ACL(访问控制列表):精细化权限管理
传统权限仅支持“用户-组-其他人”三级模型,ACL可针对特定用户/组设置独立权限,实现更精细的控制(如允许某个用户对目录有写权限,但其他用户无)。
ACL核心命令
-
查看ACL权限:
getfacl file/dir
示例输出:# file: test.txt # owner: username # group: developers user::rw- group::r-- other::r--
-
设置ACL权限:
setfacl [选项] 权限 文件/目录
常用选项:-m
:修改ACL权限(核心选项)-x
:删除指定ACL规则-b
:删除所有ACL规则(仅保留基础权限)-d
:设置默认ACL(仅对目录有效,新建文件自动继承)
ACL权限设置示例
-
给特定用户添加写权限:
setfacl -m u:user2:rw test.txt
含义:用户user2
对test.txt
拥有读写权限(不影响其他用户权限)。 -
给特定组添加执行权限:
setfacl -m g:developers:x /project
含义:组developers
对/project
目录拥有执行权限(可进入目录)。 -
设置默认ACL(继承权限):
setfacl -d -m o::r /shared_dir
含义:在/shared_dir
中新建的文件/目录自动赋予“其他人”只读权限(需目录本身有ACL权限)。
ACL与传统权限的优先级
ACL权限会“覆盖”传统权限,但实际是“叠加”效果:
- 传统权限:
chmod 644 file
(所有者rw,组r,其他r) - ACL规则:
setfacl -m u:user2:rw file
- 最终权限:
user2
(ACL)拥有rw,其他用户仍遵循传统权限(所有者rw,组r,其他r)。
权限管理注意事项
- 最小权限原则:仅分配用户完成任务必需的权限,避免过度授权(如普通用户无需sudo执行所有命令)。
- 定期审计权限:通过
getfacl
、sudo -l
(查看用户sudo权限)定期检查权限配置,清理冗余规则。 - 备份重要配置:修改
/etc/sudoers
前建议备份(cp /etc/sudoers /etc/sudoers.bak
),避免语法错误导致无法sudo。 - 特殊权限谨慎使用:SUID/SGID可能被利用提权(如SUID程序漏洞),非必要不开启;Sticky Bit仅在公共目录使用。
相关问答FAQs
Q1:普通用户忘记sudo密码怎么办?
A:普通用户执行sudo命令时默认输入的是当前用户自己的密码(非root密码),若密码错误,可尝试:
- 确认密码是否正确(注意大小写、键盘布局);
- 检查用户是否在
sudo
组(groups username
,若未加入,执行usermod -aG sudo username
); - 若密码被锁定(如输错次数过多),可使用root账户解锁(
sudo passwd -u username
)。
Q2:如何撤销用户的sudo权限?
A:撤销sudo权限需修改/etc/sudoers
文件(通过visudo
),方法如下:
- 完全撤销sudo权限:删除该用户的授权规则(如删除
username ALL=(ALL:ALL) ALL
); - 仅撤销部分命令权限:修改规则,保留必要命令(如改为
username ALL=(ALL:ALL) /usr/bin/apt
); - 从sudo组移除用户:
gpasswd -d username sudo
(适用于默认通过sudo组授权的场景)。
修改后保存文件,权限立即生效,无需重启。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/34357.html