访问控制概述

教学目标

  • 掌握访问控制的基本概念和重要性
  • 了解常见的访问控制模型和机制
  • 熟悉 Linux 系统中的访问控制实现
  • 学会制定和实施有效的访问控制策略
  • 了解访问控制的最佳实践和发展趋势

主要知识点

1. 访问控制基本概念

  • 访问控制:限制对系统资源的访问权限的安全机制
  • 主体:尝试访问资源的实体,如用户、进程、服务等
  • 客体:被访问的资源,如文件、目录、设备、端口等
  • 权限:主体对客体的操作许可,如读取、写入、执行等
  • 策略:定义哪些主体可以访问哪些客体以及如何访问的规则集合
  • 决策:根据策略决定是否允许访问请求的过程
  • 执行:强制执行访问控制决策的机制
  • 审计:记录和监控访问控制决策和执行的过程

2. 访问控制的重要性

  • 保护敏感数据:防止未授权访问和数据泄露
  • 确保系统安全:防止恶意操作和系统破坏
  • 实现最小权限:限制主体只能访问必要的资源
  • 满足合规要求:符合法律法规和行业标准的要求
  • 提供责任追溯:通过审计记录确定操作责任人
  • 支持业务需求:确保合法用户能够正常访问所需资源
  • 防范内部威胁:减少内部人员滥用权限的风险

3. 访问控制模型

  • **自主访问控制 (DAC)**:

    • 基于主体对客体的所有权
    • 主体可以自主决定谁可以访问其拥有的客体
    • Linux 文件权限是典型的 DAC 实现
    • 优点:灵活性高,易于实现
    • 缺点:安全性较低,可能导致权限扩散
  • **强制访问控制 (MAC)**:

    • 基于系统强制执行的安全策略
    • 主体和客体都有安全标签
    • 访问决策基于安全标签和策略
    • SELinux 和 AppArmor 是 Linux 中的 MAC 实现
    • 优点:安全性高,集中管理
    • 缺点:配置复杂,灵活性较低
  • **基于角色的访问控制 (RBAC)**:

    • 基于用户分配的角色
    • 权限与角色关联,用户通过角色获得权限
    • 适用于大型组织和复杂系统
    • 优点:易于管理,权限分配清晰
    • 缺点:角色设计复杂,变更管理困难
  • **基于属性的访问控制 (ABAC)**:

    • 基于主体、客体和环境的属性
    • 使用策略语言定义访问规则
    • 适用于动态和复杂的访问场景
    • 优点:灵活性高,支持细粒度控制
    • 缺点:策略设计复杂,性能开销较大
  • **基于上下文的访问控制 (CBAC)**:

    • 基于访问请求的上下文信息
    • 考虑时间、位置、行为等因素
    • 适用于需要动态调整权限的场景
    • 优点:响应性强,适应性好
    • 缺点:实现复杂,需要实时评估

4. 访问控制实现机制

  • 身份认证

    • 验证主体身份的过程
    • 包括密码认证、密钥认证、生物认证等
    • 是访问控制的前提和基础
  • 授权

    • 授予主体访问特定资源的权限
    • 基于身份、角色、属性等因素
    • 是访问控制的核心环节
  • **访问控制列表 (ACL)**:

    • 为每个客体维护一个可访问的主体列表
    • 支持细粒度的权限控制
    • Linux 中的文件 ACL 是典型实现
  • 能力系统

    • 基于主体拥有的能力而非身份
    • 能力是执行特定操作的权限
    • 适用于特权分离和最小权限原则
  • 沙箱

    • 限制程序的执行环境和资源访问
    • 防止恶意代码的扩散和破坏
    • Docker、LXC 等容器技术使用沙箱机制
  • 虚拟隔离

    • 基于虚拟机或容器的隔离
    • 提供更强的安全边界
    • 适用于多租户环境和敏感应用

5. Linux 中的访问控制实现

  • 文件系统权限

    • 基于用户、组和其他的权限控制
    • 包括读取 (r)、写入 (w)、执行 (x) 权限
    • 使用 chmodchownchgrp 命令管理
  • **文件访问控制列表 (FACL)**:

    • 扩展的文件权限系统
    • 支持为特定用户或组设置权限
    • 使用 getfaclsetfacl 命令管理
  • sudo 权限管理

    • 允许普通用户执行特权命令
    • 基于 /etc/sudoers 文件的配置
    • 提供细粒度的命令执行权限
  • **PAM (Pluggable Authentication Modules)**:

    • 可插拔的认证模块系统
    • 支持多种认证方式和策略
    • 控制登录和服务访问
  • **SELinux (Security-Enhanced Linux)**:

    • 基于 MAC 模型的安全增强
    • 由 NSA 开发的 Linux 安全模块
    • 提供强制访问控制和安全上下文
  • AppArmor

    • 基于 MAC 模型的应用程序安全框架
    • 由 Novell 开发,Ubuntu 默认采用
    • 提供基于路径的访问控制
  • Linux 能力

    • 分解 root 权限为细粒度的能力
    • 允许进程只获得必要的特权
    • 使用 capshsetcapgetcap 命令管理

6. 访问控制策略制定

  • 策略制定原则

    • 最小权限原则:只授予必要的权限
    • 职责分离原则:不同职责由不同主体承担
    • 默认拒绝原则:未明确允许的访问一律拒绝
    • 权限继承原则:合理处理权限的传递和继承
    • 定期审查原则:定期检查和更新访问控制策略
  • 策略制定步骤

    1. 资产识别:识别需要保护的资源和其价值
    2. 风险评估:评估资源面临的安全风险
    3. 主体分类:根据角色和职责对主体进行分类
    4. 权限定义:为不同主体定义适当的权限
    5. 策略编写:将权限规则正式化和文档化
    6. 策略实施:在系统中配置和部署访问控制策略
    7. 策略测试:验证策略的有效性和正确性
    8. 策略维护:根据业务变化和安全需求更新策略

7. 访问控制管理

  • 权限分配

    • 基于角色的权限分配
    • 基于属性的权限分配
    • 基于规则的权限分配
  • 权限撤销

    • 及时撤销不再需要的权限
    • 处理人员变更和离职
    • 定期权限审查和清理
  • 权限审计

    • 记录权限分配和使用情况
    • 检测异常权限使用
    • 验证权限合规性
  • 权限冲突

    • 识别和解决权限冲突
    • 建立权限优先级规则
    • 确保权限策略的一致性

8. 访问控制最佳实践

  • 技术层面

    • 实施多层访问控制
    • 使用强认证机制
    • 定期更新访问控制策略
    • 启用审计和监控
    • 采用最小权限配置
  • 管理层面

    • 建立明确的访问控制策略
    • 定期进行权限审查
    • 培训用户了解访问控制
    • 制定权限变更流程
    • 响应权限相关事件
  • 组织层面

    • 建立安全委员会
    • 制定安全政策和标准
    • 分配安全责任
    • 定期安全评估
    • 持续改进安全措施

9. 访问控制的挑战和发展趋势

  • 挑战

    • 复杂性管理:随着系统规模增长,访问控制变得更加复杂
    • 性能影响:严格的访问控制可能影响系统性能
    • 用户体验:过于严格的控制可能影响用户工作效率
    • 动态环境:云、容器等动态环境增加了访问控制的难度
    • 内部威胁:内部人员滥用权限的风险难以完全防范
    • 合规要求:不断变化的法规要求增加了合规难度
  • 发展趋势

    • 零信任架构:默认不信任任何主体,持续验证访问请求
    • 自适应访问控制:基于风险和上下文动态调整访问权限
    • 自动化管理:使用 AI 和机器学习自动化权限管理和异常检测
    • 统一身份管理:整合多种认证和授权系统
    • 细粒度控制:提供更精细的权限管理能力
    • 隐私保护:在访问控制中融入隐私保护机制

实用案例分析

案例 1:基于 DAC 的文件权限管理

场景:管理 Linux 系统中的文件权限,确保敏感数据的安全。

分析步骤

# 1. 查看文件权限
# 使用 ls -l 命令查看文件权限
ls -l /etc/passwd

# 输出示例:
# -rw-r--r-- 1 root root 2678 Jan  1 00:00 /etc/passwd
# 权限位解释:
# - rw- r-- r--
# | 所有者  组   其他
# 文件类型

# 2. 修改文件权限
# 使用 chmod 命令修改文件权限
# 示例:将文件设置为只有所有者可读写,其他人无权限
chmod 600 /path/to/sensitive/file

# 3. 修改文件所有者和组
# 使用 chown 命令修改文件所有者
chown user:group /path/to/file

# 4. 使用 ACL 进行细粒度控制
# 安装 ACL 工具(如果未安装)
apt install acl

# 为特定用户设置权限
setfacl -m u:user:rwx /path/to/directory

# 为特定组设置权限
setfacl -m g:group:rx /path/to/directory

# 查看 ACL 权限
getfacl /path/to/directory

# 5. 权限继承设置
# 设置目录的默认 ACL,新创建的文件会继承这些权限
setfacl -d -m u:user:rwx /path/to/directory
setfacl -d -m g:group:rx /path/to/directory

# 6. 权限审计
# 查找权限过于宽松的文件
find /home -type f -perm -007 -ls

# 查找设置了 SUID 位的文件
find / -type f -perm -4000 -ls

# 查找设置了 SGID 位的文件
find / -type f -perm -2000 -ls

# 查找设置了 Sticky Bit 的目录
find / -type d -perm -1000 -ls

DAC 文件权限管理总结

  • 基本权限:使用 chmod 命令设置文件的基本权限
  • 所有者管理:使用 chown 命令修改文件的所有者和组
  • 细粒度控制:使用 ACL 为特定用户或组设置权限
  • 权限继承:使用默认 ACL 确保权限的正确继承
  • 权限审计:定期检查权限设置,发现并修复安全问题

案例 2:基于 sudo 的权限管理

场景:使用 sudo 工具为普通用户分配有限的管理权限。

分析步骤

# 1. 查看 sudo 配置
# 使用 visudo 命令编辑 sudo 配置文件
visudo

# 2. 基本 sudo 配置
# 为用户分配特定命令的执行权限
# 格式:user host=(runas) command
# 示例:允许 user1 在所有主机上以 root 身份执行指定命令
user1 ALL=(root) /bin/systemctl restart apache2, /bin/systemctl stop apache2

# 3. 为组分配权限
# 格式:%group host=(runas) command
# 示例:允许 admin 组的成员以 root 身份执行所有命令
%admin ALL=(ALL) ALL

# 4. 免密码配置
# 示例:允许 user2 免密码执行指定命令
user2 ALL=(root) NOPASSWD: /bin/systemctl restart sshd

# 5. 命令别名配置
# 定义命令别名
Cmnd_Alias WEB_COMMANDS = /bin/systemctl restart apache2, /bin/systemctl stop apache2, /bin/systemctl start apache2

# 使用命令别名
user3 ALL=(root) WEB_COMMANDS

# 6. 主机别名配置
# 定义主机别名
Host_Alias SERVERS = server1, server2, server3

# 使用主机别名
user4 SERVERS=(root) ALL

# 7. 用户别名配置
# 定义用户别名
User_Alias ADMINS = user1, user2, user3

# 使用用户别名
ADMINS ALL=(ALL) ALL

# 8. 权限审计
# 查看 sudo 执行日志
cat /var/log/auth.log | grep sudo

# 或使用 journalctl 查看
journalctl -u sudo

# 9. sudo 最佳实践
# 1. 只授予必要的权限
# 2. 使用命令别名管理权限
# 3. 启用 sudo 日志记录
# 4. 定期审查 sudo 配置
# 5. 限制免密码权限的使用
# 6. 使用 sudo -l 查看用户的 sudo 权限
sudo -l -U user1

sudo 权限管理总结

  • 精细控制:可以为用户或组分配特定命令的执行权限
  • 别名管理:使用别名简化复杂的权限配置
  • 审计跟踪:记录所有 sudo 命令的执行情况
  • 安全配置:遵循最小权限原则,只授予必要的权限
  • 定期审查:定期检查 sudo 配置,确保权限的合理性

案例 3:基于 SELinux 的 MAC 实现

场景:使用 SELinux 为 Linux 系统提供强制访问控制。

分析步骤

# 1. 查看 SELinux 状态
# 查看 SELinux 当前状态
getenforce

# 查看 SELinux 配置
cat /etc/selinux/config

# 2. SELinux 模式
#  enforcing:强制执行 SELinux 策略
#  permissive:仅记录违反策略的行为,不强制执行
#  disabled:完全禁用 SELinux

# 3. 修改 SELinux 模式
# 临时修改(重启后失效)
setenforce 0  # 设置为 permissive 模式
setenforce 1  # 设置为 enforcing 模式

# 永久修改(需要重启)
# 编辑 /etc/selinux/config 文件
# 将 SELINUX=enforcing 改为 SELINUX=permissive 或 SELINUX=disabled

# 4. 查看 SELinux 上下文
# 查看文件的 SELinux 上下文
ls -Z /etc/passwd

# 查看进程的 SELinux 上下文
ps -Z

# 查看端口的 SELinux 上下文
semanage port -l

# 5. 修改 SELinux 上下文
# 使用 chcon 命令临时修改文件上下文
chcon -t httpd_sys_content_t /var/www/html/file.html

# 使用 semanage 命令永久修改文件上下文
semanage fcontext -a -t httpd_sys_content_t "/var/www/html(/.*)?"
restorecon -R /var/www/html

# 6. 管理 SELinux 布尔值
# 查看所有布尔值
getsebool -a

# 查看特定布尔值
getsebool httpd_can_network_connect

# 修改布尔值(临时)
setsebool httpd_can_network_connect 1

# 修改布尔值(永久)
setsebool -P httpd_can_network_connect 1

# 7. 管理 SELinux 模块
# 查看已加载的模块
semodule -l

# 安装新模块
semodule -i module.pp

# 删除模块
semodule -r module

# 8. SELinux 故障排查
# 查看 SELinux 日志
tail -f /var/log/audit/audit.log | grep AVC

# 使用 audit2allow 工具分析日志
audit2allow -a

# 使用 audit2why 工具分析拒绝原因
audit2why -a

# 9. SELinux 最佳实践
# 1. 保持 SELinux 处于 enforcing 模式
# 2. 了解应用程序的 SELinux 需求
# 3. 使用适当的 SELinux 上下文
# 4. 合理配置 SELinux 布尔值
# 5. 定期审查 SELinux 日志
# 6. 为自定义应用程序创建适当的 SELinux 策略

SELinux 访问控制总结

  • 强制控制:强制执行基于安全上下文的访问控制策略
  • 细粒度控制:可以对文件、进程、端口等资源进行精细的权限控制
  • 安全增强:提供额外的安全层,即使 root 用户也受限制
  • 灵活配置:通过布尔值、上下文和模块进行灵活配置
  • 故障排查:使用专门的工具分析和解决 SELinux 相关问题

课后练习

  1. 基本访问控制练习

    • 创建一个测试文件,并设置不同的权限组合
    • 使用不同用户尝试访问该文件,观察权限控制效果
    • 为文件添加 ACL 权限,测试细粒度访问控制
  2. sudo 权限管理练习

    • 编辑 sudo 配置文件,为测试用户分配特定命令的执行权限
    • 测试用户使用 sudo 执行授权命令
    • 尝试执行未授权的命令,观察拒绝效果
    • 查看 sudo 执行日志,验证审计功能
  3. SELinux 配置练习

    • 查看 SELinux 当前状态和模式
    • 修改文件的 SELinux 上下文
    • 配置 SELinux 布尔值以允许特定服务的网络访问
    • 分析 SELinux 日志,解决权限拒绝问题
  4. 访问控制策略制定练习

    • 识别系统中的敏感资源
    • 基于最小权限原则制定访问控制策略
    • 实施和测试访问控制策略
    • 审查和优化访问控制策略
  5. 访问控制审计练习

    • 检查系统中的文件权限,识别过于宽松的权限
    • 审查 sudo 配置,确保权限分配合理
    • 分析 SELinux 日志,识别潜在的安全问题
    • 生成访问控制审计报告
  6. 综合访问控制练习

    • 设计一个包含 DAC、sudo 和 SELinux 的多层次访问控制系统
    • 实施访问控制策略,保护敏感数据和系统资源
    • 测试访问控制效果,确保合法用户能够正常访问,未授权访问被拒绝
    • 建立访问控制的持续监控和维护机制

总结

本章节详细介绍了 Linux 系统访问控制的基本概念、原理和方法,包括:

  • 访问控制的基本概念和重要性
  • 常见的访问控制模型和机制
  • Linux 系统中的访问控制实现
  • 访问控制策略的制定和管理
  • 访问控制的最佳实践和发展趋势
  • 实际访问控制案例的分析和解决

通过学习本章节,您应该能够全面了解访问控制的重要性,掌握 Linux 系统中不同类型的访问控制实现,制定和实施有效的访问控制策略,提高系统的安全性和合规性。在实际应用中,建议根据系统的具体情况和安全需求,采用多层次的访问控制机制,结合 DAC、MAC 和 RBAC 等模型,实现全面而有效的访问控制。

扩展阅读

« 上一篇 安全合规检查 下一篇 » 文件访问控制