第30集:权限管理基础
教学目标
- 理解Linux系统中权限管理的基本概念和重要性
- 掌握文件权限的详细含义和作用
- 掌握目录权限的特殊考虑和应用
- 掌握权限的数字表示法和符号表示法
- 掌握权限管理的常用命令和操作
- 了解权限管理的最佳实践
- 掌握权限问题的排查和解决方法
- 了解高级权限管理概念的引入
核心知识点讲解
1. 权限管理概述
权限管理是Linux系统安全的核心组成部分,它控制着用户对文件和目录的访问能力。
2. 文件权限详解
文件权限包括三种基本类型:
- 读取权限(r):允许查看文件内容
- 写入权限(w):允许修改文件内容
- 执行权限(x):允许执行文件(对于脚本和程序)
3. 目录权限详解
目录权限有特殊的含义:
- 读取权限(r):允许列出目录中的文件和子目录
- 写入权限(w):允许在目录中创建、删除、重命名文件和子目录
- 执行权限(x):允许进入目录(使用cd命令),是其他权限的基础
4. 权限的表示方法
符号表示法
权限位:rwxrwxrwx
位置含义:所有者 所属组 其他用户例如:
rwxr-xr--:所有者有读写执行权限,所属组有读执行权限,其他用户只有读权限
数字表示法
使用八进制数字表示权限:
| 权限 | 二进制 | 八进制 |
|---|---|---|
| --- | 000 | 0 |
| --x | 001 | 1 |
| -w- | 010 | 2 |
| -wx | 011 | 3 |
| r-- | 100 | 4 |
| r-x | 101 | 5 |
| rw- | 110 | 6 |
| rwx | 111 | 7 |
例如:
rwxr-xr--对应数字表示为754
5. 权限管理命令
chmod命令
chmod命令用于修改文件和目录的权限。
基本语法:
chmod [选项] 权限 文件或目录使用方法:
- 符号表示法:
chmod u=rwx,g=rx,o=r file.txt - 数字表示法:
chmod 754 file.txt
chown命令
chown命令用于修改文件和目录的所有者。
基本语法:
chown [选项] 所有者:所属组 文件或目录chgrp命令
chgrp命令用于修改文件和目录的所属组。
基本语法:
chgrp [选项] 所属组 文件或目录6. 权限管理的最佳实践
- 最小权限原则:只授予用户完成任务所需的最小权限
- 定期权限审计:定期检查文件和目录的权限设置
- 使用用户组管理权限:通过用户组统一管理权限
- 注意目录权限:特别是写入权限,避免安全风险
- 合理设置默认权限:使用umask命令设置默认权限
- 保护敏感文件:对敏感文件设置严格的权限
- 使用访问控制列表(ACL):对于复杂的权限需求
7. 权限问题的排查和解决
常见权限问题
- Permission denied:权限被拒绝
- 无法进入目录:缺少执行权限
- 无法列出目录内容:缺少读取权限
- 无法创建或删除文件:缺少写入权限
- 脚本无法执行:缺少执行权限
排查方法
- 检查文件权限:
ls -l 文件 - 检查目录权限:
ls -ld 目录 - 检查所有者和所属组:
ls -l 文件 - 检查当前用户:
whoami - 检查用户所属组:
groups或id - 检查权限继承:特别是目录权限对文件的影响
8. 高级权限管理概念
SUID(Set User ID)
- 作用:执行文件时,以文件所有者的身份运行
- 表示:权限位显示为
s或S(大写表示原执行权限未设置) - 示例:
/usr/bin/passwd命令
SGID(Set Group ID)
- 作用:执行文件时,以文件所属组的身份运行;对于目录,新创建的文件继承目录的所属组
- 表示:权限位显示为
s或S(大写表示原执行权限未设置) - 示例:某些需要组权限的命令或共享目录
Sticky Bit
- 作用:对于目录,只有文件所有者或root可以删除文件
- 表示:权限位显示为
t或T(大写表示原执行权限未设置) - 示例:
/tmp目录
9. 默认权限管理
umask命令
umask命令用于设置新创建文件和目录的默认权限。
基本语法:
umask [模式]默认权限计算:
- 文件默认权限:666 - umask
- 目录默认权限:777 - umask
10. 权限管理的安全考虑
- 避免使用777权限:完全开放的权限,存在严重安全风险
- 限制SUID/SGID的使用:只在必要时使用
- 保护系统文件:确保系统文件权限正确
- 定期权限检查:使用工具如
find检查异常权限 - 使用SELinux或AppArmor:提供更细粒度的访问控制
操作示例
示例1:权限的查看和理解
# 查看文件权限
ls -l file.txt
# 查看目录权限
ls -ld directory/
# 查看详细的权限信息,包括ACL(如果有)
ls -le file.txt
# 查看当前用户
whoami
# 查看当前用户所属组
groups
id示例2:使用符号表示法修改权限
# 给文件所有者添加执行权限
chmod u+x file.txt
# 给文件所属组添加写入权限
chmod g+w file.txt
# 给其他用户移除读取权限
chmod o-r file.txt
# 设置文件权限为所有者有读写执行权限,所属组有读执行权限,其他用户只有读权限
chmod u=rwx,g=rx,o=r file.txt
# 同时修改多个权限
chmod u+wx,g+r,o-r file.txt
# 递归修改目录及其内容的权限
chmod -R u+rwx directory/示例3:使用数字表示法修改权限
# 设置文件权限为755(所有者rwx,所属组rx,其他用户rx)
chmod 755 file.txt
# 设置文件权限为644(所有者rw,所属组r,其他用户r)
chmod 644 file.txt
# 设置文件权限为700(所有者rwx,其他无权限)
chmod 700 file.txt
# 设置目录权限为755
chmod 755 directory/
# 递归设置目录及其内容的权限
chmod -R 755 directory/示例4:修改文件所有者和所属组
# 修改文件所有者
chown user1 file.txt
# 修改文件所属组
chown :group1 file.txt
# 同时修改文件所有者和所属组
chown user1:group1 file.txt
# 递归修改目录及其内容的所有者和所属组
chown -R user1:group1 directory/
# 使用chgrp修改所属组
chgrp group1 file.txt
chgrp -R group1 directory/示例5:目录权限的特殊应用
# 创建一个只有特定用户可以进入和查看的目录
mkdir secure_dir
chmod 700 secure_dir
# 创建一个共享目录,所有用户可以读取和执行,但只有所有者可以写入
mkdir shared_dir
chmod 755 shared_dir
# 创建一个共享目录,所有用户可以读取、写入和执行(谨慎使用)
mkdir public_dir
chmod 777 public_dir
# 创建一个目录,用户可以进入和创建文件,但不能删除其他用户的文件(使用sticky bit)
mkdir temp_dir
chmod 1777 temp_dir
# 查看sticky bit效果
ls -ld temp_dir/示例6:权限问题的排查和解决
# 排查Permission denied错误
# 1. 检查当前用户
whoami
# 2. 检查文件权限
ls -l 问题文件
# 3. 检查目录权限(对于无法进入的目录)
ls -ld 问题目录
# 4. 检查用户所属组
groups
# 5. 解决方法示例:
# 示例1:无法执行脚本
chmod +x script.sh
# 示例2:无法进入目录
chmod +x directory/
# 示例3:无法列出目录内容
chmod +r directory/
# 示例4:无法创建文件
chmod +w directory/示例7:默认权限管理
# 查看当前umask设置
umask
# 设置umask为022(默认权限:文件644,目录755)
umask 022
# 设置umask为002(默认权限:文件664,目录775)
umask 002
# 设置umask为077(默认权限:文件600,目录700)
umask 077
# 测试默认权限
umask 022
touch test_file1
mkdir test_dir1
ls -l test_file1
ls -ld test_dir1
umask 002
touch test_file2
mkdir test_dir2
ls -l test_file2
ls -ld test_dir2示例8:高级权限管理
# 设置SUID(Set User ID)
chmod u+s file.sh
ls -l file.sh
# 取消SUID
chmod u-s file.sh
# 设置SGID(Set Group ID)
chmod g+s file.sh
ls -l file.sh
# 对目录设置SGID(新文件继承目录所属组)
chmod g+s directory/
ls -ld directory/
# 取消SGID
chmod g-s file.sh
# 设置Sticky Bit(只有所有者可以删除文件)
chmod +t directory/
ls -ld directory/
# 取消Sticky Bit
chmod -t directory/
# 同时设置SUID、SGID和Sticky Bit
chmod 4755 file.sh # SUID
chmod 2755 file.sh # SGID
chmod 1755 directory/ # Sticky Bit示例9:权限管理脚本
# 创建权限管理脚本
cat > permission_management.sh << 'EOF'
#!/bin/bash
# 显示菜单
echo "权限管理脚本"
echo "1. 查看文件/目录权限"
echo "2. 修改文件/目录权限(符号表示法)"
echo "3. 修改文件/目录权限(数字表示法)"
echo "4. 修改文件/目录所有者和所属组"
echo "5. 设置目录特殊权限"
echo "6. 检查权限问题"
echo "7. 退出"
read -p "请选择操作:" choice
case $choice in
1)
read -p "请输入文件或目录路径:" path
if [ -f "$path" ]; then
ls -l "$path"
elif [ -d "$path" ]; then
ls -ld "$path"
else
echo "路径不存在"
fi
;;
2)
read -p "请输入文件或目录路径:" path
read -p "请输入权限设置(例如:u+rwx,g+rx,o-r):" permission
chmod "$permission" "$path"
echo "权限修改成功"
ls -l "$path"
;;
3)
read -p "请输入文件或目录路径:" path
read -p "请输入权限数字(例如:755):" permission
chmod "$permission" "$path"
echo "权限修改成功"
ls -l "$path"
;;
4)
read -p "请输入文件或目录路径:" path
read -p "请输入所有者:所属组(例如:user1:group1):" owner_group
chown "$owner_group" "$path"
echo "所有者和所属组修改成功"
ls -l "$path"
;;
5)
read -p "请输入目录路径:" path
echo "1. 设置SGID(新文件继承目录所属组)"
echo "2. 设置Sticky Bit(只有所有者可以删除文件)"
read -p "请选择操作:" special_choice
case $special_choice in
1)
chmod g+s "$path"
echo "SGID设置成功"
;;
2)
chmod +t "$path"
echo "Sticky Bit设置成功"
;;
*)
echo "无效的选择"
;;
esac
ls -ld "$path"
;;
6)
read -p "请输入文件或目录路径:" path
echo "当前用户:$(whoami)"
echo "用户所属组:$(groups)"
if [ -f "$path" ]; then
echo "文件权限:"
ls -l "$path"
elif [ -d "$path" ]; then
echo "目录权限:"
ls -ld "$path"
else
echo "路径不存在"
fi
;;
7)
echo "退出脚本"
exit 0
;;
*)
echo "无效的选择"
;;
esac
EOF
# 使脚本可执行
chmod +x permission_management.sh
# 运行脚本
./permission_management.sh示例10:权限审计
# 查找系统中权限为777的文件和目录
find / -type f -perm 0777 -ls 2>/dev/null
find / -type d -perm 0777 -ls 2>/dev/null
# 查找系统中设置了SUID的文件
find / -type f -perm -4000 -ls 2>/dev/null
# 查找系统中设置了SGID的文件
find / -type f -perm -2000 -ls 2>/dev/null
# 查找系统中设置了Sticky Bit的目录
find / -type d -perm -1000 -ls 2>/dev/null
# 查找所有者为root但可写的文件
find / -type f -user root -perm -o+w -ls 2>/dev/null
# 查找特定目录下权限异常的文件
find /home -type f -perm 0777 -ls课后练习
基础练习:
- 查看和理解文件权限
- 使用符号表示法修改权限
- 使用数字表示法修改权限
- 修改文件所有者和所属组
进阶练习:
- 设置目录的特殊权限
- 排查和解决权限问题
- 管理默认权限(umask)
- 执行权限审计
思考问题:
- 为什么目录需要执行权限?
- 什么是最小权限原则?如何应用?
- 如何安全地设置共享目录?
- SUID、SGID和Sticky Bit的作用是什么?
- 如何排查和解决Permission denied错误?
总结
本集介绍了Linux系统中权限管理的基础知识,包括:
- 文件权限的详细含义和作用
- 目录权限的特殊考虑和应用
- 权限的数字表示法和符号表示法
- 权限管理的常用命令和操作
- 权限管理的最佳实践
- 权限问题的排查和解决方法
- 高级权限管理概念的引入
权限管理是Linux系统安全的核心,掌握权限管理的技能对于维护系统安全至关重要。通过本集的学习,您应该能够理解权限的基本概念,掌握权限的设置和修改方法,了解权限管理的最佳实践,以及排查和解决常见的权限问题。在后续的课程中,我们将深入探讨高级权限管理概念,如SUID、SGID、Sticky Bit的详细应用,以及访问控制列表(ACL)的使用。