Linux服务器被黑?99%都是权限设置出了问题!
一、Linux权限系统概述
Linux作为多用户操作系统,其权限系统是保障系统安全和数据完整性的核心机制。权限系统通过控制用户对文件和目录的访问权限,确保只有授权用户才能执行相应操作。
1.1 权限系统的重要性
- • 安全性保障:防止未授权用户访问敏感文件
- • 数据完整性:避免意外删除或修改重要文件
- • 系统稳定性:保护系统关键文件不被普通用户破坏
- • 多用户协作:实现不同用户间的文件共享和隔离
1.2 权限模型基础
Linux权限系统基于三个基本概念:
- • 用户(User):文件所有者
- • 组(Group):用户组
- • 其他(Others):系统中的其他用户
二、文件权限详解
2.1 基本权限类型
Linux文件系统中存在三种基本权限:
读权限(r - Read)
- • 数字表示:4
- • 对文件:可以查看文件内容
- • 对目录:可以列出目录中的文件名
写权限(w - Write)
- • 数字表示:2
- • 对文件:可以修改文件内容
- • 对目录:可以在目录中创建、删除、重命名文件
执行权限(x - Execute)
- • 数字表示:1
- • 对文件:可以运行该文件(如果是可执行文件)
- • 对目录:可以进入该目录
2.2 权限表示方法
符号表示法
-rwxr-xr-x 1 user group 1024 Jan 15 10:30 filename
权限字符串解析:
- • 第1位:文件类型(- 普通文件,d 目录,l 链接等)
- • 第2-4位:所有者权限(rwx)
- • 第5-7位:组权限(r-x)
- • 第8-10位:其他用户权限(r-x)
数字表示法
权限可以用三位八进制数表示:
- • 读权限:4
- • 写权限:2
- • 执行权限:1
常见权限组合:
- • 755:rwxr-xr-x(所有者全权限,组和其他用户读和执行)
- • 644:rw-r–r–(所有者读写,组和其他用户只读)
- • 600:rw——-(只有所有者可读写)
- • 777:rwxrwxrwx(所有人全权限,不安全)
2.3 文件类型标识
- • -:普通文件
- • d:目录
- • l:符号链接
- • b:块设备文件
- • c:字符设备文件
- • p:管道文件
- • s:套接字文件
三、目录权限特殊性
3.1 目录权限含义
目录权限与文件权限有着本质区别:
目录读权限(r)
- • 允许列出目录内容
- • 可以使用 ls 命令查看目录中的文件名
- • 不能访问文件的详细信息
目录写权限(w)
- • 允许在目录中创建、删除、重命名文件
- • 需要配合执行权限才能生效
- • 即使对文件没有写权限,也可以删除文件
目录执行权限(x)
- • 允许进入目录
- • 可以使用 cd 命令切换到该目录
- • 可以访问目录中文件的详细信息
3.2 目录权限组合效果
权限组合 | 效果 |
---|---|
r-x | 可以进入目录并列出文件 |
-wx | 可以进入目录并创建/删除文件,但不能列出现有文件 |
–x | 只能进入目录,不能列出文件 |
r– | 可以列出文件名,但不能进入目录 |
四、权限管理命令
4.1 查看权限
ls命令
# 查看当前目录文件权限
ls -l
# 查看特定文件权限
ls -l filename
# 查看目录权限
ls -ld dirname
# 显示隐藏文件权限
ls -la
stat命令
# 详细查看文件信息
stat filename
# 只显示权限信息
stat -c ‘%A %n’ filename
4.2 修改权限
chmod命令
符号模式:
# 给所有者添加执行权限
chmod u+x filename
# 给组去除写权限
chmod g-w filename
# 给其他用户设置只读权限
chmod o=r filename
# 给所有人添加读权限
chmod a+r filename
# 组合操作
chmod u+x,g-w,o=r filename
数字模式:
# 设置权限为755
chmod 755 filename
# 设置权限为644
chmod 644 filename
# 递归修改目录权限
chmod -R 755 dirname
权限符号说明:
- • u:用户(所有者)
- • g:组
- • o:其他用户
- • a:所有人(all)
- • +:添加权限
- • -:移除权限
- • =:设置权限
4.3 修改所有者和组
chown命令
# 修改文件所有者
chown username filename
# 修改文件所有者和组
chown username:groupname filename
# 只修改组
chown :groupname filename
# 递归修改目录
chown -R username:groupname dirname
chgrp命令
# 修改文件组
chgrp groupname filename
# 递归修改目录组
chgrp -R groupname dirname
五、特殊权限
5.1 SUID(Set User ID)
概念
- • 数字表示:4
- • 符号表示:s(在所有者执行位)
- • 作用:执行文件时以文件所有者身份运行
使用场景
# 设置SUID
chmod u+s filename
chmod 4755 filename
# 查看SUID文件
ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 68208 Jul 15 2021 /usr/bin/passwd
安全考虑
- • SUID文件具有安全风险
- • 只应在必要时使用
- • 定期审查系统中的SUID文件
5.2 SGID(Set Group ID)
对文件的作用
- • 数字表示:2
- • 符号表示:s(在组执行位)
- • 执行文件时以文件所属组身份运行
对目录的作用
- • 在目录中创建的文件自动继承目录的组
- • 便于团队协作
# 设置SGID
chmod g+s dirname
chmod 2755 dirname
# 查看效果
ls -ld dirname
drwxr-sr-x 2 user group 4096 Jan 15 10:30 dirname
5.3 Sticky Bit
概念
- • 数字表示:1
- • 符号表示:t(在其他用户执行位)
- • 作用:只有文件所有者才能删除文件
典型应用
# /tmp目录的权限
ls -ld /tmp
drwxrwxrwt 12 root root 4096 Jan 15 10:30 /tmp
# 设置sticky bit
chmod +t dirname
chmod 1755 dirname
六、默认权限与umask
6.1 umask概念
umask决定了新建文件和目录的默认权限:
- • 文件最大权限:666
- • 目录最大权限:777
- • 实际权限 = 最大权限 - umask
6.2 umask使用
# 查看当前umask
umask
# 以符号形式显示
umask -S
# 设置umask
umask 022
# 临时设置umask
umask 077
6.3 常见umask值
umask | 文件权限 | 目录权限 | 说明 |
---|---|---|---|
022 | 644 | 755 | 默认设置,其他用户可读 |
077 | 600 | 700 | 安全设置,只有所有者可访问 |
002 | 664 | 775 | 组协作,组成员可写 |
七、访问控制列表(ACL)
7.1 ACL概述
ACL提供了比传统权限更精细的控制:
- • 可以为特定用户或组设置权限
- • 不受传统三类用户限制
- • 支持默认权限设置
7.2 ACL命令
getfacl命令
# 查看文件ACL
getfacl filename
# 查看目录ACL
getfacl dirname
setfacl命令
# 给特定用户设置权限
setfacl -m u:username:rwx filename
# 给特定组设置权限
setfacl -m g:groupname:rw filename
# 设置默认ACL(目录)
setfacl -d -m u:username:rwx dirname
# 删除ACL
setfacl -x u:username filename
# 删除所有ACL
setfacl -b filename
7.3 ACL实例
# 创建测试文件
touch test.txt
# 设置ACL
setfacl -m u:alice:rw test.txt
setfacl -m u:bob:r test.txt
# 查看ACL
getfacl test.txt
# file: test.txt
# owner: root
# group: root
user::rw-
user:alice:rw-
user:bob:r–
group::r–
mask::rw-
other::r–
八、权限故障排除
8.1 常见权限问题
无法访问文件
# 检查文件权限
ls -l filename
# 检查目录权限
ls -ld dirname
# 检查完整路径权限
namei -l /path/to/file
无法执行脚本
# 添加执行权限
chmod +x script.sh
# 检查脚本内容
file script.sh
8.2 权限诊断工具
使用find查找权限问题
# 查找具有SUID权限的文件
find /usr -perm -4000 -type f 2>/dev/null
# 查找世界可写的文件
find /home -perm -002 -type f 2>/dev/null
# 查找没有所有者的文件
find / -nouser -o -nogroup 2>/dev/null
权限修复脚本
#!/bin/bash
# 修复常见权限问题
# 修复家目录权限
chmod 755 /home/username
chmod 700 /home/username/.ssh
chmod 600 /home/username/.ssh/authorized_keys
# 修复Web目录权限
find /var/www -type d -exec chmod 755 {} \;
find /var/www -type f -exec chmod 644 {} \;
九、安全最佳实践
9.1 权限设置原则
最小权限原则
- • 只给予完成任务所需的最小权限
- • 定期审查和调整权限
- • 避免使用777权限
权限分离
- • 系统文件与用户文件分离
- • 不同应用的文件权限分离
- • 敏感文件单独设置权限
9.2 权限审计
定期检查
# 检查SUID/SGID文件
find / -perm -4000 -o -perm -2000 -type f 2>/dev/null
# 检查世界可写文件
find / -perm -002 -type f 2>/dev/null
# 检查无主文件
find / -nouser -o -nogroup 2>/dev/null
权限监控
# 使用auditd监控权限变化
auditctl -w /etc/passwd -p wa -k passwd_changes
auditctl -w /etc/shadow -p wa -k shadow_changes
9.3 权限管理策略
用户管理
- • 为每个用户创建独立账户
- • 使用sudo而非root直接操作
- • 定期清理不活跃用户
组管理
- • 合理设计用户组结构
- • 使用组权限简化管理
- • 避免用户属于过多组
十、高级权限管理
10.1 SELinux集成
SELinux提供了强制访问控制(MAC):
# 查看SELinux状态
sestatus
# 查看文件SELinux上下文
ls -Z filename
# 设置SELinux上下文
chcon -t httpd_exec_t /var/www/cgi-bin/script.cgi
10.2 sudo权限管理
sudoers文件配置
# 编辑sudoers文件
visudo
# 示例配置
username ALL=(ALL:ALL) ALL
%wheel ALL=(ALL:ALL) ALL
username ALL=(ALL) NOPASSWD: /usr/bin/systemctl
sudo使用技巧
# 以其他用户身份运行
sudo -u username command
# 保持环境变量
sudo -E command
# 切换到root shell
sudo -i
10.3 文件系统挂载选项
安全挂载选项
# /etc/fstab示例
/dev/sda1 /tmp ext4 defaults,nodev,nosuid,noexec 0 2
/dev/sda2 /home ext4 defaults,nodev,nosuid 0 2
挂载选项说明
- • nodev:不允许设备文件
- • nosuid:忽略SUID和SGID位
- • noexec:不允许执行二进制文件
十一、实战案例
11.1 Web服务器权限配置
Apache/Nginx权限设置
# 创建web用户和组
groupadd webgroup
useradd -g webgroup webuser
# 设置网站目录权限
chown -R webuser:webgroup /var/www/html
chmod -R 755 /var/www/html
# 设置特殊目录权限
chmod 750 /var/www/html/config
chmod 600 /var/www/html/config/database.conf
上传目录权限
# 创建上传目录
mkdir /var/www/uploads
chown webuser:webgroup /var/www/uploads
chmod 755 /var/www/uploads
# 设置文件上传权限
chmod g+w /var/www/uploads
11.2 数据库权限配置
MySQL数据目录
# 设置MySQL数据目录权限
chown -R mysql:mysql /var/lib/mysql
chmod 700 /var/lib/mysql
chmod 600 /var/lib/mysql/*
备份目录权限
# 创建备份目录
mkdir /backup/mysql
chown mysql:mysql /backup/mysql
chmod 700 /backup/mysql
11.3 日志文件权限
系统日志权限
# 设置日志目录权限
chmod 755 /var/log
chmod 644 /var/log/messages
chmod 640 /var/log/secure
应用日志权限
# 创建应用日志目录
mkdir /var/log/myapp
chown appuser:appgroup /var/log/myapp
chmod 750 /var/log/myapp
十二、权限管理脚本
12.1 权限检查脚本
#!/bin/bash
# 权限安全检查脚本
echo “=== 权限安全检查报告 ===”
echo “检查时间: $(date)”
echo
# 检查SUID文件
echo “1. SUID文件检查:”
find / -perm -4000 -type f 2>/dev/null | head -10
# 检查世界可写文件
echo “2. 世界可写文件检查:”
find /home -perm -002 -type f 2>/dev/null | head -10
# 检查无主文件
echo “3. 无主文件检查:”
find / -nouser -o -nogroup 2>/dev/null | head -10
# 检查重要文件权限
echo “4. 重要文件权限检查:”
ls -l /etc/passwd /etc/shadow /etc/sudoers 2>/dev/null
12.2 权限修复脚本
#!/bin/bash
# 权限修复脚本
# 修复系统文件权限
chmod 644 /etc/passwd
chmod 600 /etc/shadow
chmod 440 /etc/sudoers
# 修复用户家目录权限
for user in $(awk -F: ‘$3 >= 1000 {print $1}’ /etc/passwd); do
if [ -d “/home/$user” ]; then
chmod 755 “/home/$user”
chown “$user:$user” “/home/$user”
fi
done
# 修复临时目录权限
chmod 1777 /tmp
chmod 1777 /var/tmp
十三、总结
Linux文件及目录权限系统是系统安全的基础,正确理解和使用权限系统对于运维工程师至关重要。通过本文的详细介绍,您应该能够:
- 1. 掌握基本概念:理解用户、组、权限的基本概念
- 2. 熟练使用命令:掌握chmod、chown、chgrp等权限管理命令
- 3. 理解特殊权限:了解SUID、SGID、Sticky Bit的作用和使用
- 4. 应用安全实践:遵循最小权限原则,定期进行权限审计
- 5. 解决实际问题:能够诊断和解决常见的权限问题
权限管理是一个需要不断学习和实践的领域,随着系统复杂性的增加,还需要结合SELinux、ACL等高级功能来构建更加安全的系统环境。
学习建议
- 1. 动手实践:通过实际操作加深理解
- 2. 定期审查:建立权限审查机制
- 3. 关注安全:及时了解最新的安全威胁
- 4. 文档记录:记录权限设置的原因和过程
- 5. 团队协作:制定团队权限管理规范
掌握Linux权限系统不仅能够提高系统安全性,也是成为优秀运维工程师的必备技能。希望本文能够帮助您在实际工作中更好地管理和维护Linux系统。