作为Linux系统管理员,权限管理是最基础也最关键的技能之一。很多人虽然会用sudo命令,但对整个权限体系的理解往往停留在表面。今天我就结合自己多年运维经验,带大家深入理解Linux权限体系的运作机制。
初学者经常混淆sudo和su命令,其实它们的底层机制完全不同:
su(switch user)是直接切换用户身份,需要知道目标用户的密码。执行su后,整个会话环境都会切换到目标用户,包括HOME目录、shell环境等都会改变。这种切换是"全有或全无"的。
sudo(superuser do)则是临时借用root权限执行特定命令。它有以下特点:
生产环境最佳实践:永远不要共享root密码,而是通过sudo精细控制权限。这样既能完成管理任务,又能保留完整的操作审计记录。
配置sudo权限有三种标准方式,各有适用场景:
sudoedit /etc/sudoers
vim /etc/sudoers
:w!强制保存(因为sudoers默认只读)visudo
visudo -c手动检查现有配置假设我们要给用户qjh添加sudo权限,具体步骤如下:
visudo命令(不要直接vim编辑!)qjh ALL=(ALL:ALL) ALL
更安全的做法是限制可执行的命令,例如:
code复制qjh ALL=(ALL:ALL) /usr/bin/apt,/usr/bin/systemctl
这样qjh就只能执行apt和systemctl命令,不能执行其他root命令。
chmod用于修改文件权限,支持两种表示法:
数字表示法(推荐)
code复制chmod 755 filename
符号表示法
code复制chmod u=rwx,g=rx,o=rx filename
目录权限特殊之处:必须有x(执行)权限才能进入目录。常见目录权限为755,文件权限为644。
chown用于修改文件所有者和所属组:
code复制chown qjh:qjh filename
chown qjh filename(只改所有者)chown :qjh filename(只改组)递归修改选项:
code复制chown -R qjh:qjh directory/
这个-R参数会递归修改目录下所有文件和子目录的归属。
Linux中一切皆文件,通过ls -l的第一个字符可以识别文件类型:
| 字符 | 类型 | 示例 |
|---|---|---|
| - | 普通文件 | 文本文件、二进制文件 |
| d | 目录 | 文件夹 |
| l | 符号链接 | 快捷方式 |
| b | 块设备 | 硬盘/dev/sda |
| c | 字符设备 | 终端/dev/tty |
| p | 管道文件 | 进程间通信 |
| s | 套接字文件 | 网络通信 |
除了基本的rwx权限,Linux还有三个特殊权限位:
SUID(Set User ID)
chmod u+s fileSGID(Set Group ID)
chmod g+s dirSticky Bit(粘滞位)
chmod +t dir问题1:执行脚本报"Permission denied"
chmod +x script.sh问题2:无法进入目录
chmod +x directory问题3:无法编辑文件
chmod +w filechattr -i file最小权限原则:只给必要的权限,不要随意给777
使用组管理:把需要相同权限的用户加入同一个组,然后设置组权限
定期审计:检查系统中SUID/SGID文件:
code复制find / -perm /4000 -type f 2>/dev/null # SUID
find / -perm /2000 -type f 2>/dev/null # SGID
特殊目录权限:
备份重要权限:
code复制getfacl -R /path > permissions_backup.acl
setfacl --restore=permissions_backup.acl
当基本权限不够时,可以使用ACL(Access Control List):
查看ACL:
code复制getfacl filename
设置用户权限:
code复制setfacl -m u:username:rwx filename
设置组权限:
code复制setfacl -m g:groupname:rx filename
删除ACL条目:
code复制setfacl -x u:username filename
递归设置目录ACL:
code复制setfacl -R -m u:username:rwx directory/
ACL特别适合需要给多个用户不同权限的共享目录场景。
创建多级目录:
code复制mkdir -p /path/to/new/directory
设置目录权限:
code复制mkdir -m 750 secure_dir
私有目录:700
团队共享目录:2770
公共上传目录:1777
批量创建项目目录结构:
code复制mkdir -p project/{src,doc,bin,log,test/{unit,integration}}
这会创建如下结构:
code复制project/
├── bin
├── doc
├── log
├── src
└── test
├── integration
└── unit
批量设置权限:
code复制find /path -type d -exec chmod 755 {} \;
find /path -type f -exec chmod 644 {} \;
umask决定新建文件的默认权限:
查看当前umask:
code复制umask
设置umask(临时):
code复制umask 027
这样新建目录权限为750,文件权限为640。
永久设置umask:
常规继承:
SGID继承:
ACL默认权限:
code复制setfacl -d -m u:username:rwx directory
-d参数设置默认ACL,后续新建文件都会继承
当用户访问文件时,Linux按以下顺序检查权限:
理解这个顺序对权限问题排查很有帮助。
关键系统文件推荐权限:
检查命令:
code复制ls -l /etc/passwd /etc/shadow /etc/sudoers
查找全局可写文件:
code复制find / -xdev -type f -perm -0002 -exec ls -l {} \;
查找无主文件:
code复制find / -xdev -nouser -o -nogroup
安全配置建议:
code复制Defaults timestamp_timeout=5
code复制Defaults logfile="/var/log/sudo.log"
Defaults log_input, log_output
现象:网站首页被篡改,但文件所有者是www-data
排查:
ls -l index.html → 发现权限是777ls -ld /var/www/html → 发现权限是777grep www-data /var/log/auth.log → 发现可疑sudo操作解决:
code复制chmod -R 750 /var/www/html
chmod 640 /var/www/html/*.php
需求:开发团队需要共享访问/src目录
错误做法:
code复制chmod 777 /src
正确方案:
code复制groupadd devteam
usermod -aG devteam user1
usermod -aG devteam user2
code复制chown root:devteam /src
chmod 2770 /src
code复制echo "umask 007" >> /etc/profile
这样:
批量设置文件权限:
yaml复制- name: Set directory permissions
file:
path: "/opt/app"
state: directory
mode: "0750"
owner: "appuser"
group: "appgroup"
recurse: yes
集中管理sudo权限:
yaml复制sudoers:
file.managed:
- name: /etc/sudoers
- source: salt://files/sudoers
- template: jinja
- user: root
- group: root
- mode: 440
定期检查权限变更:
bash复制#!/bin/bash
# 记录当前权限快照
find /etc -printf "%m %u %g %p\n" > /var/log/etc_permissions.log
# 比较差异
diff /var/log/etc_permissions.log /var/log/etc_permissions.baseline
设置cron定期执行:
code复制0 3 * * * /usr/local/bin/check_permissions.sh
过多ACL影响性能:
深层目录树权限检查:
大量小文件权限设置:
使用find+xargs比-exec更快:
code复制find /data -type d -print0 | xargs -0 chmod 755
find /data -type f -print0 | xargs -0 chmod 644
使用tar保留权限:
code复制# 备份
tar --xattrs --acls -cvzf backup.tar.gz /path
# 恢复
tar --xattrs --acls -xvzf backup.tar.gz -C /
深入理解Linux安全模型:
学习企业级权限管理:
掌握审计工具:
容器环境权限管理:
云环境最佳实践:
在实际工作中,我发现很多权限问题都是由于对基础概念理解不深导致的。建议新手从理解rwx权限和umask开始,逐步掌握更高级的ACL和SELinux技术。记住:好的权限管理应该是既安全又实用的平衡艺术。