1. Linux文件权限基础解析
在Linux系统中,每个文件和目录都有三组权限标记,分别对应三种用户身份:所有者(user)、所属组(group)和其他用户(others)。这三组权限都包含读(r)、写(w)、执行(x)三种基本权限类型。
权限的表示方式有两种:
- 符号表示法:用rwx-字符组合表示,例如rwxr-xr--
- 数字表示法:用三位八进制数表示,例如755
实际工作中推荐掌握数字表示法,因为在脚本编写和批量操作时更加高效。但符号表示法在交互式操作时更直观。
权限数字的计算方法:
- 读(r) = 4
- 写(w) = 2
- 执行(x) = 1
- 无权限(-) = 0
将同一用户身份的三个权限值相加,就得到该用户身份的权限数字。例如:
- rwx = 4+2+1 = 7
- r-x = 4+0+1 = 5
- r-- = 4+0+0 = 4
1.1 特殊权限位解析
除了基本的rwx权限外,Linux还有三个特殊权限位:
-
SUID(Set User ID):用数字4表示
- 作用:当用户执行带有SUID位的文件时,会以文件所有者的身份执行
- 典型应用:/usr/bin/passwd命令
- 设置方法:chmod u+s 文件 或 chmod 4755 文件
-
SGID(Set Group ID):用数字2表示
- 作用:对文件而言,执行时以文件所属组的身份运行;对目录而言,在该目录下新建的文件会继承目录的所属组
- 典型应用:共享目录管理
- 设置方法:chmod g+s 文件 或 chmod 2755 文件
-
Sticky Bit:用数字1表示
- 作用:在目录上设置时,只有文件所有者才能删除/重命名自己的文件
- 典型应用:/tmp目录
- 设置方法:chmod o+t 目录 或 chmod 1777 目录
生产环境中要谨慎使用SUID/SGID权限,不当使用可能导致安全风险。建议定期使用find / -perm /4000命令检查系统中的SUID文件。
1.2 默认权限与umask
新建文件和目录时,系统会根据umask值决定其初始权限。umask是一个掩码,用于"屏蔽"某些权限位。
默认权限计算方法:
- 目录:777 - umask
- 文件:666 - umask
查看当前umask值:
bash复制umask
设置umask值(临时):
bash复制umask 0022
永久设置umask需要修改shell配置文件(如~/.bashrc):
bash复制echo "umask 0022" >> ~/.bashrc
source ~/.bashrc
常见umask值:
- 022:新文件644,新目录755(常规安全设置)
- 002:新文件664,新目录775(开发团队协作场景)
- 077:新文件600,新目录700(高安全要求场景)
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 用户与用户组管理实战
2.1 用户账户管理
- 添加用户:
bash复制useradd -m -s /bin/bash username # -m创建家目录,-s指定shell
passwd username # 设置密码
- 修改用户属性:
bash复制usermod -aG supplementary_group username # 添加附加组
usermod -s /bin/zsh username # 修改shell
usermod -L username # 锁定账户
usermod -U username # 解锁账户
- 删除用户:
bash复制userdel -r username # -r同时删除家目录和邮件池
- 查看用户信息:
bash复制id username # 查看UID/GID信息
finger username # 查看详细信息
chage -l username # 查看密码过期信息
2.2 用户组管理
- 创建组:
bash复制groupadd groupname
- 修改组:
bash复制groupmod -n newname oldname # 重命名组
groupmod -g newGID groupname # 修改GID
- 删除组:
bash复制groupdel groupname
- 组成员管理:
bash复制gpasswd -a user group # 添加用户到组
gpasswd -d user group # 从组移除用户
gpasswd -A user group # 设置组管理员
2.3 密码策略配置
通过/etc/login.defs文件配置默认密码策略:
code复制PASS_MAX_DAYS 90 # 密码最长有效期
PASS_MIN_DAYS 7 # 密码修改间隔
PASS_WARN_AGE 14 # 密码过期前警告天数
PASS_MIN_LEN 8 # 密码最小长度
使用chage命令修改特定用户的密码策略:
bash复制chage -M 90 -m 7 -W 14 username
3. 高级权限管理技巧
3.1 ACL(访问控制列表)
当基本权限不能满足需求时,可以使用ACL进行更精细的权限控制。
- 检查文件系统是否支持ACL:
bash复制mount | grep acl
- 设置ACL权限:
bash复制setfacl -m u:username:rwx file # 为用户设置权限
setfacl -m g:groupname:rx file # 为组设置权限
setfacl -x u:username file # 删除特定ACL条目
- 查看ACL权限:
bash复制getfacl file
- 默认ACL(对目录设置后,新建文件会继承):
bash复制setfacl -d -m u:username:rw dir
3.2 权限继承最佳实践
对于项目目录结构,推荐以下权限设置方案:
- 项目根目录:
bash复制mkdir project
chown root:project_group project
chmod 2775 project # 设置SGID,保证新建文件继承组
setfacl -d -m g:project_group:rwx project # 设置默认ACL
- 子目录示例:
bash复制mkdir -p project/{src,bin,log,tmp}
chmod 2775 project/src # 源代码目录
chmod 2770 project/bin # 可执行文件目录
chmod 1777 project/tmp # 临时文件目录
3.3 权限问题排查技巧
- 权限检查流程:
bash复制ls -l file # 查看基本权限
getfacl file # 查看ACL权限
id username # 确认用户所属组
groups username # 查看用户所有组
- 常见错误场景:
- "Permission denied"但权限看似正确:
bash复制ls -ld /path/to/parent/dir # 检查父目录权限 - 无法删除文件:
bash复制ls -ld /path/to/containing/dir # 检查目录写权限和sticky bit - 脚本无法执行:
bash复制file script.sh # 检查文件类型 ls -l script.sh # 检查执行权限
4. 生产环境权限管理规范
4.1 企业级权限方案
- 角色划分:
- 系统管理员:root权限,UID=0
- 应用管理员:特定应用的维护账户,UID 1000-1999
- 普通用户:日常使用账户,UID 2000+
- 服务账户:守护进程专用账户,UID 500-999,shell设为/sbin/nologin
- 目录权限规范:
| 目录 | 所有者 | 所属组 | 权限 | 特殊权限 |
|------|--------|--------|------|----------|
| / | root | root | 755 | - |
| /etc | root | root | 755 | - |
| /var/log | root | syslog | 775 | SGID |
| /home | root | root | 755 | - |
| /tmp | root | root | 1777 | Sticky |
| /usr/local | root | staff | 775 | - |
4.2 安全加固措施
- 敏感文件保护:
bash复制chmod 600 /etc/shadow
chmod 644 /etc/passwd
chmod 600 ~/.ssh/authorized_keys
- 定期权限审计脚本:
bash复制#!/bin/bash
# 查找所有SUID/SGID文件
find / -perm /4000 -o -perm /2000 -type f -exec ls -ld {} \; > /var/log/suid_sgid_audit.log
# 查找世界可写文件
find / -perm -0002 -type f ! -path "/proc/*" -exec ls -ld {} \; > /var/log/world_writable.log
# 检查root账户的.rhosts文件
find / -name .rhosts -exec ls -la {} \; -exec cat {} \;
- 用户权限最小化原则:
- 使用sudo代替直接使用root
- 配置精细化的sudo规则:
bash复制# /etc/sudoers.d/dev_team %dev_team ALL=(app_user) /usr/bin/systemctl restart app_service %dev_team ALL=(root) /usr/bin/apt update, /usr/bin/apt install *
4.3 自动化权限管理
- 使用Ansible批量管理用户权限:
yaml复制- name: Configure base users
hosts: all
tasks:
- name: Create developer group
group:
name: dev
gid: 5000
state: present
- name: Add developers
user:
name: "{{ item }}"
groups: dev
append: yes
shell: /bin/bash
loop:
- alice
- bob
- charlie
- name: Set directory permissions
file:
path: /opt/app
owner: root
group: dev
mode: '2775'
recurse: yes
- 使用Puppet管理sudo权限:
puppet复制class sudo::dev_team {
sudo::conf { 'dev_team':
content => "%dev_team ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart app_*",
}
}
5. 典型问题解决方案
5.1 无法删除"权限不足"的文件
场景:即使有写权限,也无法删除某些文件
解决方案:
-
检查父目录权限:
bash复制ls -ld /path/to/parent需要对该目录有写权限
-
检查文件属性:
bash复制
lsattr file如果存在i属性(不可修改),需要root执行:
bash复制
chattr -i file -
检查selinux上下文:
bash复制ls -Z file如果需要:
bash复制chcon -t user_home_t file
5.2 共享目录权限配置
场景:多个用户需要协作访问同一目录
最佳实践:
-
创建共享组:
bash复制
groupadd project_team usermod -aG project_team user1 usermod -aG project_team user2 -
设置目录权限:
bash复制mkdir /shared chown root:project_team /shared chmod 2775 /shared setfacl -d -m g:project_team:rwx /shared -
设置默认umask:
在各用户的~/.bashrc中添加:bash复制umask 0002
5.3 修复损坏的权限
系统级权限修复步骤:
-
获取系统默认权限:
bash复制
getfacl -R / > /root/system_permissions_backup.acl -
常见修复命令:
bash复制chmod 755 /usr/bin/* chown root:root /etc/{passwd,shadow,group} chmod 644 /etc/passwd chmod 600 /etc/shadow -
使用软件包管理器修复:
bash复制rpm --setperms package_name # RHEL/CentOS dpkg --configure -a # Debian/Ubuntu
对于关键系统目录,推荐参考:
bash复制# 重要目录权限参考值
chmod 755 /bin /boot /dev /etc /lib /media /mnt /opt /run /sbin /srv /usr /var
chmod 1777 /tmp
chmod 555 /proc /sys
