第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:权限被拒绝
  • 无法进入目录:缺少执行权限
  • 无法列出目录内容:缺少读取权限
  • 无法创建或删除文件:缺少写入权限
  • 脚本无法执行:缺少执行权限

排查方法

  1. 检查文件权限ls -l 文件
  2. 检查目录权限ls -ld 目录
  3. 检查所有者和所属组ls -l 文件
  4. 检查当前用户whoami
  5. 检查用户所属组groupsid
  6. 检查权限继承:特别是目录权限对文件的影响

8. 高级权限管理概念

SUID(Set User ID)

  • 作用:执行文件时,以文件所有者的身份运行
  • 表示:权限位显示为 sS(大写表示原执行权限未设置)
  • 示例/usr/bin/passwd 命令

SGID(Set Group ID)

  • 作用:执行文件时,以文件所属组的身份运行;对于目录,新创建的文件继承目录的所属组
  • 表示:权限位显示为 sS(大写表示原执行权限未设置)
  • 示例:某些需要组权限的命令或共享目录

Sticky Bit

  • 作用:对于目录,只有文件所有者或root可以删除文件
  • 表示:权限位显示为 tT(大写表示原执行权限未设置)
  • 示例/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

课后练习

  1. 基础练习

    • 查看和理解文件权限
    • 使用符号表示法修改权限
    • 使用数字表示法修改权限
    • 修改文件所有者和所属组
  2. 进阶练习

    • 设置目录的特殊权限
    • 排查和解决权限问题
    • 管理默认权限(umask)
    • 执行权限审计
  3. 思考问题

    • 为什么目录需要执行权限?
    • 什么是最小权限原则?如何应用?
    • 如何安全地设置共享目录?
    • SUID、SGID和Sticky Bit的作用是什么?
    • 如何排查和解决Permission denied错误?

总结

本集介绍了Linux系统中权限管理的基础知识,包括:

  • 文件权限的详细含义和作用
  • 目录权限的特殊考虑和应用
  • 权限的数字表示法和符号表示法
  • 权限管理的常用命令和操作
  • 权限管理的最佳实践
  • 权限问题的排查和解决方法
  • 高级权限管理概念的引入

权限管理是Linux系统安全的核心,掌握权限管理的技能对于维护系统安全至关重要。通过本集的学习,您应该能够理解权限的基本概念,掌握权限的设置和修改方法,了解权限管理的最佳实践,以及排查和解决常见的权限问题。在后续的课程中,我们将深入探讨高级权限管理概念,如SUID、SGID、Sticky Bit的详细应用,以及访问控制列表(ACL)的使用。

« 上一篇 用户切换与切换环境 下一篇 » 权限数字表示法