进程访问控制

教学目标

  • 掌握 Linux 进程权限的基本概念和作用
  • 了解 Linux 进程的安全上下文
  • 熟悉 Linux 能力(Capabilities)机制
  • 学会使用 chroot 和容器技术进行进程隔离
  • 掌握进程资源限制的设置和管理
  • 了解 SELinux 和 AppArmor 对进程的访问控制
  • 学会进程安全审计和监控
  • 能够根据实际需求制定合理的进程访问控制策略

主要知识点

1. 进程权限基础

  • 进程权限的概念:控制进程对系统资源访问权限的安全机制
  • 进程权限的作用
    • 限制进程的操作范围,防止权限滥用
    • 保护系统资源和数据安全
    • 实现最小权限原则
    • 提高系统的安全性和稳定性
  • 进程权限的来源
    • 进程的有效用户 ID(EUID)
    • 进程的有效组 ID(EGID)
    • 进程的附加组 ID(Supplementary GIDs)
    • Linux 能力(Capabilities)

2. 进程的用户 ID

  • 进程的用户 ID 类型
    • 实际用户 ID(RUID):进程创建者的用户 ID
    • 有效用户 ID(EUID):决定进程的访问权限
    • 保存的设置用户 ID(SUID):保存原始的有效用户 ID
    • 文件系统用户 ID(FSUID):用于文件系统操作
  • 用户 ID 的关系
    • 通常情况下,RUID、EUID 和 SUID 相同
    • 当执行设置了 SUID 位的程序时,EUID 会变成文件所有者的 ID
    • 进程可以通过系统调用切换用户 ID
  • 查看进程的用户 ID
    # 查看进程的用户 ID
    ps -eo pid,user,euser,suser,fuser,args
    
    # 查看特定进程的用户 ID
    ps -o pid,user,euser,suser,fuser,args -p <pid>

3. 进程的组 ID

  • 进程的组 ID 类型
    • 实际组 ID(RGID):进程创建者的组 ID
    • 有效组 ID(EGID):决定进程的访问权限
    • 保存的设置组 ID(SGID):保存原始的有效组 ID
    • 文件系统组 ID(FSGID):用于文件系统操作
  • 组 ID 的关系
    • 通常情况下,RGID、EGID 和 SGID 相同
    • 当执行设置了 SGID 位的程序时,EGID 会变成文件所有者的组 ID
    • 进程可以通过系统调用切换组 ID
  • 查看进程的组 ID
    # 查看进程的组 ID
    ps -eo pid,group,egroup,args
    
    # 查看特定进程的组 ID
    ps -o pid,group,egroup,args -p <pid>

4. Linux 能力(Capabilities)

  • Linux 能力的概念:将 root 权限细分为多个独立的能力,进程可以拥有部分 root 权限而不是全部

  • Linux 能力的作用

    • 实现细粒度的权限控制
    • 减少权限提升的安全风险
    • 提高系统安全性
    • 便于权限管理和审计
  • 常见的 Linux 能力

    • CAP_CHOWN:修改文件所有者
    • CAP_DAC_OVERRIDE:绕过文件访问权限检查
    • CAP_DAC_READ_SEARCH:绕过目录读权限和搜索权限
    • CAP_FOWNER:绕过文件所有者 ID 检查
    • CAP_KILL:发送信号给不属于自己的进程
    • CAP_NET_ADMIN:网络管理权限
    • CAP_NET_BIND_SERVICE:绑定小于 1024 的端口
    • CAP_SYS_ADMIN:系统管理权限
    • CAP_SYS_BOOT:重启系统
    • CAP_SYS_CHROOT:使用 chroot 命令
    • CAP_SYS_PTRACE:跟踪任何进程
    • CAP_SYS_RESOURCE:绕过资源限制
    • CAP_SYS_TIME:修改系统时间
    • CAP_SYS_TTY_CONFIG:配置终端
  • 查看进程的能力

    # 安装 libcap 工具
    apt install libcap2-bin
    
    # 查看进程的能力
    getpcaps <pid>
    
    # 查看所有进程的能力
    ps -eo pid,args | grep -v "\[" | while read pid args; do echo "PID: $pid"; getpcaps $pid 2>/dev/null; done
  • 设置进程的能力

    # 给可执行文件添加能力
    setcap cap_net_bind_service+ep /path/to/executable
    
    # 移除可执行文件的能力
    setcap -r /path/to/executable
    
    # 查看可执行文件的能力
    getcap /path/to/executable

5. 进程隔离技术

  • chroot 技术

    • 概念:将进程的根目录切换到指定目录,限制进程的文件系统访问范围
    • 作用:隔离进程的文件系统环境,提高安全性
    • 局限性:只能隔离文件系统,不能隔离网络、进程等其他资源
    • 使用方法:
      # 创建 chroot 环境
      mkdir -p /path/to/chroot/{bin,lib,lib64,dev}
      
      # 复制必要的文件
      cp /bin/bash /path/to/chroot/bin/
      cp /lib/x86_64-linux-gnu/*.so* /path/to/chroot/lib/
      cp /lib64/*.so* /path/to/chroot/lib64/
      mknod -m 666 /path/to/chroot/dev/null c 1 3
      mknod -m 666 /path/to/chroot/dev/zero c 1 5
      
      # 进入 chroot 环境
      chroot /path/to/chroot /bin/bash
  • 容器技术

    • 概念:使用 cgroups 和 namespace 技术,实现对进程的全面隔离
    • 作用:隔离进程的文件系统、网络、进程、挂载点、主机名等资源
    • 优势:比 chroot 提供更全面的隔离,资源管理更精细
    • 常见容器技术:Docker、Podman、LXC 等
    • 使用示例(Docker):
      # 运行一个隔离的容器
      docker run -it --rm ubuntu bash
      
      # 查看容器的隔离环境
      docker ps
      docker inspect <container_id>
  • cgroups 技术

    • 概念:控制组,用于限制、记录和隔离进程组的资源使用
    • 作用:限制进程的 CPU、内存、磁盘 I/O、网络等资源使用
    • 优势:精细的资源管理,防止资源滥用
    • 使用方法:
      # 查看 cgroups 挂载点
      mount | grep cgroup
      
      # 创建 cgroup
      mkdir -p /sys/fs/cgroup/cpu/mygroup
      
      # 设置 CPU 限制
      echo 50000 > /sys/fs/cgroup/cpu/mygroup/cpu.cfs_quota_us
      
      # 将进程加入 cgroup
      echo <pid> > /sys/fs/cgroup/cpu/mygroup/tasks
      
      # 查看进程的 cgroup
      cat /proc/<pid>/cgroup

6. 进程资源限制

  • 进程资源限制的概念:限制进程可以使用的系统资源数量

  • 进程资源限制的类型

    • 最大文件大小(core file size)
    • 最大数据段大小(data seg size)
    • 最大文件描述符数(file size)
    • 最大内存锁定大小(locked memory)
    • 最大常驻集大小(max memory size)
    • 最大打开文件数(open files)
    • 最大管道大小(pipe size)
    • 最大栈大小(stack size)
    • 最大 CPU 时间(cpu time)
    • 最大进程数(max user processes)
    • 最大虚拟内存大小(virtual memory)
    • 最大文件锁数量(file locks)
  • 查看进程资源限制

    # 查看当前进程的资源限制
    ulimit -a
    
    # 查看特定进程的资源限制
    prlimit -p <pid>
    
    # 查看进程的资源限制(从 /proc 查看)
    cat /proc/<pid>/limits
  • 设置进程资源限制

    # 临时设置当前 shell 的资源限制
    ulimit -n 4096  # 设置最大打开文件数
    ulimit -u 1024  # 设置最大进程数
    
    # 永久设置资源限制(编辑 /etc/security/limits.conf)
    # 添加以下内容:
    # username soft nofile 4096
    # username hard nofile 8192
    # username soft nproc 1024
    # username hard nproc 2048

7. SELinux 和 AppArmor

  • SELinux(Security-Enhanced Linux)

    • 概念:基于标签的强制访问控制(MAC)系统
    • 作用:为进程和文件提供细粒度的访问控制
    • 特点:安全级别高,配置复杂
    • 查看 SELinux 状态:
      # 查看 SELinux 状态
      sestatus
      
      # 查看进程的 SELinux 上下文
      ps -eZ
      
      # 查看特定进程的 SELinux 上下文
      ps -Z -p <pid>
  • AppArmor

    • 概念:基于配置文件的强制访问控制(MAC)系统
    • 作用:为进程提供细粒度的访问控制
    • 特点:配置简单,易于使用
    • 查看 AppArmor 状态:
      # 查看 AppArmor 状态
      aa-status
      
      # 查看进程的 AppArmor 配置
      ps auxZ
      
      # 查看特定进程的 AppArmor 配置
      cat /proc/<pid>/attr/current

8. 进程安全审计

  • 进程审计的概念:监控和记录进程的行为,以便于安全分析和故障排查

  • 进程审计的内容

    • 进程的创建和终止
    • 进程的权限变更
    • 进程的系统调用
    • 进程的资源使用
    • 进程的异常行为
  • 使用 auditd 进行进程审计

    # 安装 auditd
    apt install auditd
    
    # 启动 auditd 服务
    systemctl start auditd
    systemctl enable auditd
    
    # 添加进程审计规则
    auditctl -w /path/to/executable -p x -k process_execution
    
    # 查看审计日志
    ausearch -k process_execution
    
    # 查看实时审计日志
    tail -f /var/log/audit/audit.log
  • 使用 psacct 或 acct 进行进程审计

    # 安装 psacct
    apt install psacct
    
    # 启动 psacct 服务
    systemctl start acct
    systemctl enable acct
    
    # 查看进程统计信息
    lastcomm
    sa
    ac

9. 进程访问控制最佳实践

  • 基本原则

    • 遵循最小权限原则:只授予进程必要的权限
    • 避免使用 root 权限运行进程:使用普通用户或特定服务用户
    • 合理使用 Linux 能力:替代 root 权限
    • 采用进程隔离技术:限制进程的影响范围
    • 定期审计进程权限:确保权限设置合理
  • 进程权限管理

    • 为不同的服务创建专用的系统用户
    • 合理设置服务进程的用户 ID 和组 ID
    • 使用 Linux 能力替代 root 权限
    • 为可执行文件设置适当的权限和能力
    • 避免使用 SUID 程序,除非必要
  • 进程隔离

    • 对敏感服务使用容器技术进行隔离
    • 对简单服务使用 chroot 进行隔离
    • 使用 cgroups 限制进程的资源使用
    • 合理配置 SELinux 或 AppArmor 策略
  • 进程监控

    • 使用系统监控工具监控进程的行为
    • 配置进程审计,记录关键进程的操作
    • 设置进程资源限制,防止资源滥用
    • 定期检查异常进程,及时发现安全问题

10. 进程访问控制工具

  • ps 命令:查看进程信息
  • top 命令:实时监控进程
  • htop 命令:交互式进程监控
  • pgrep 命令:查找进程
  • pkill 命令:终止进程
  • prlimit 命令:查看和设置进程资源限制
  • getpcaps 命令:查看进程的能力
  • setcap 命令:设置可执行文件的能力
  • chroot 命令:创建隔离的文件系统环境
  • docker 命令:使用容器技术隔离进程
  • cgexec 命令:在指定的 cgroup 中运行进程
  • auditctl 命令:配置进程审计规则
  • ausearch 命令:查询审计日志
  • lastcomm 命令:查看进程执行历史

实用案例分析

案例 1:使用 Linux 能力替代 root 权限

场景:让普通用户运行的 Web 服务器能够绑定 80 端口(通常需要 root 权限)。

分析步骤

# 1. 查看当前 Web 服务器的权限
# 假设 Web 服务器是 nginx
ps -eo pid,user,euser,args | grep nginx

# 2. 停止 nginx 服务
systemctl stop nginx

# 3. 更改 nginx 执行文件的所有者(如果需要)
chown root:root /usr/sbin/nginx

# 4. 给 nginx 添加绑定低端口的能力
setcap cap_net_bind_service+ep /usr/sbin/nginx

# 5. 查看 nginx 的能力
getcap /usr/sbin/nginx

# 6. 以普通用户身份启动 nginx
# 修改 nginx 配置文件,将用户改为普通用户
# 编辑 /etc/nginx/nginx.conf,将 user 指令改为普通用户
# user nginx; 改为 user webuser;

# 7. 启动 nginx 服务
systemctl start nginx

# 8. 验证 nginx 是否以普通用户身份运行,并绑定 80 端口
ps -eo pid,user,euser,args | grep nginx
netstat -tulpn | grep 80

# 9. 验证 nginx 进程的能力
ps -eo pid,args | grep nginx | grep -v grep | while read pid args; do echo "PID: $pid"; getpcaps $pid; done

# 10. 清理(如果需要)
setcap -r /usr/sbin/nginx

使用 Linux 能力替代 root 权限总结

  • 优势:避免使用 root 权限运行服务,提高安全性
  • 配置:使用 setcap 命令给可执行文件添加必要的能力
  • 验证:使用 getpcaps 命令验证进程的能力
  • 适用场景:需要特定 root 权限但不需要全部 root 权限的服务

案例 2:使用 chroot 隔离进程

场景:创建一个隔离的环境,运行特定的服务,限制其文件系统访问范围。

分析步骤

# 1. 创建 chroot 环境目录
mkdir -p /chroot/{bin,lib,lib64,dev,usr/bin,usr/lib,usr/lib64}

# 2. 复制必要的文件
# 复制 bash
cp /bin/bash /chroot/bin/

# 复制必要的库文件
ldd /bin/bash | awk '{print $3}' | grep -v "(0x" | while read lib; do cp $lib /chroot/lib/ 2>/dev/null || cp $lib /chroot/lib64/ 2>/dev/null; done

# 复制 ls 命令
cp /bin/ls /chroot/bin/
ldd /bin/ls | awk '{print $3}' | grep -v "(0x" | while read lib; do cp $lib /chroot/lib/ 2>/dev/null || cp $lib /chroot/lib64/ 2>/dev/null; done

# 创建必要的设备文件
mknod -m 666 /chroot/dev/null c 1 3
mknod -m 666 /chroot/dev/zero c 1 5
mknod -m 666 /chroot/dev/random c 1 8
mknod -m 666 /chroot/dev/urandom c 1 9

# 3. 测试 chroot 环境
chroot /chroot /bin/bash

# 在 chroot 环境中执行命令
ls -la
bash --version

# 尝试访问 chroot 外的文件(应该失败)
ls -la /host

# 退出 chroot 环境
exit

# 4. 在 chroot 环境中运行服务
# 复制服务可执行文件和依赖
# 假设服务是一个简单的 HTTP 服务器
cp /path/to/httpd /chroot/bin/
ldd /path/to/httpd | awk '{print $3}' | grep -v "(0x" | while read lib; do cp $lib /chroot/lib/ 2>/dev/null || cp $lib /chroot/lib64/ 2>/dev/null; done

# 创建服务配置和数据目录
mkdir -p /chroot/etc/httpd /chroot/var/www/html
cp /etc/httpd/httpd.conf /chroot/etc/httpd/
cp -r /var/www/html/* /chroot/var/www/html/

# 启动服务(在 chroot 环境中)
chroot /chroot /bin/bash -c "/bin/httpd -k start"

# 5. 验证服务运行状态
ps -eo pid,user,args | grep httpd
netstat -tulpn | grep httpd

# 6. 清理 chroot 环境
# 停止服务
chroot /chroot /bin/bash -c "/bin/httpd -k stop"

# 删除 chroot 目录
rm -rf /chroot

使用 chroot 隔离进程总结

  • 优势:简单易用,能有效限制进程的文件系统访问范围
  • 配置:需要复制必要的可执行文件和库文件
  • 局限性:只能隔离文件系统,不能隔离网络、进程等其他资源
  • 适用场景:对安全性要求不高,只需要文件系统隔离的场景

案例 3:使用 Docker 容器隔离进程

场景:使用 Docker 容器运行一个 Web 服务,实现全面的进程隔离。

分析步骤

# 1. 安装 Docker
apt install docker.io

# 2. 启动 Docker 服务
systemctl start docker
systemctl enable docker

# 3. 创建 Dockerfile
cat > Dockerfile << EOF
FROM ubuntu:20.04

RUN apt update && apt install -y nginx

COPY index.html /var/www/html/

EXPOSE 80

CMD ["nginx", "-g", "daemon off;"]
EOF

# 4. 创建 index.html
cat > index.html << EOF
<!DOCTYPE html>
<html>
<head>
    <title>Docker Container</title>
</head>
<body>
    <h1>Hello from Docker Container!</h1>
    <p>This web server is running in an isolated Docker container.</p>
</body>
</html>
EOF

# 5. 构建 Docker 镜像
docker build -t web-server .

# 6. 运行 Docker 容器
docker run -d -p 8080:80 --name web-container web-server

# 7. 验证容器运行状态
docker ps

# 8. 测试 Web 服务
curl http://localhost:8080

# 9. 查看容器内的进程
docker top web-container

# 10. 进入容器内部
docker exec -it web-container bash

# 在容器内执行命令
ls -la
ps aux
cat /etc/hosts

# 退出容器
exit

# 11. 停止和删除容器
docker stop web-container
docker rm web-container

# 12. 清理 Docker 镜像
docker rmi web-server

使用 Docker 容器隔离进程总结

  • 优势:提供全面的进程隔离,包括文件系统、网络、进程等
  • 配置:使用 Dockerfile 定义容器环境
  • 管理:使用 docker 命令管理容器的生命周期
  • 适用场景:对安全性要求高,需要全面隔离的场景

案例 4:设置进程资源限制

场景:限制特定进程的资源使用,防止资源滥用。

分析步骤

# 1. 查看当前用户的资源限制
ulimit -a

# 2. 临时设置资源限制
# 设置最大打开文件数
ulimit -n 1024

# 设置最大进程数
ulimit -u 512

# 设置最大内存使用
ulimit -m 1024000

# 3. 永久设置资源限制
# 编辑 /etc/security/limits.conf
cat >> /etc/security/limits.conf << EOF
# 设置用户的资源限制
username soft nofile 1024
username hard nofile 2048
username soft nproc 512
username hard nproc 1024
username soft memlock 512000
username hard memlock 1024000
EOF

# 4. 使用 prlimit 查看和设置特定进程的资源限制
# 启动一个测试进程
sleep 3600 &
PID=$!

# 查看进程的资源限制
prlimit -p $PID

# 设置进程的最大 CPU 时间
prlimit --cpu=60 -p $PID

# 设置进程的最大内存使用
prlimit --as=100000000 -p $PID

# 验证资源限制设置
prlimit -p $PID | grep -E "(CPU|AS)"

# 终止测试进程
kill $PID

# 5. 使用 cgroups 限制进程的资源使用
# 创建 cgroup 目录
mkdir -p /sys/fs/cgroup/cpu/mygroup
mkdir -p /sys/fs/cgroup/memory/mygroup

# 设置 CPU 限制(50%)
echo 50000 > /sys/fs/cgroup/cpu/mygroup/cpu.cfs_quota_us

# 设置内存限制(100MB)
echo 104857600 > /sys/fs/cgroup/memory/mygroup/memory.limit_in_bytes

# 启动一个测试进程
sleep 3600 &
PID=$!

# 将进程加入 cgroup
echo $PID > /sys/fs/cgroup/cpu/mygroup/tasks
echo $PID > /sys/fs/cgroup/memory/mygroup/tasks

# 查看进程的 cgroup
cat /proc/$PID/cgroup

# 查看 cgroup 的统计信息
cat /sys/fs/cgroup/cpu/mygroup/cpu.stat
cat /sys/fs/cgroup/memory/mygroup/memory.stat

# 终止测试进程
kill $PID

# 清理 cgroup 目录
rmdir /sys/fs/cgroup/cpu/mygroup
rmdir /sys/fs/cgroup/memory/mygroup

设置进程资源限制总结

  • 临时限制:使用 ulimit 命令设置当前 shell 的资源限制
  • 永久限制:编辑 /etc/security/limits.conf 文件设置用户的资源限制
  • 进程限制:使用 prlimit 命令设置特定进程的资源限制
  • 精细限制:使用 cgroups 技术设置更精细的资源限制
  • 适用场景:需要控制进程资源使用的场景,如防止内存泄漏、CPU 占用过高

课后练习

  1. 进程权限基础练习

    • 查看进程的用户 ID 和组 ID
    • 执行设置了 SUID 位的程序,观察进程权限变化
    • 恢复进程的原始权限
  2. Linux 能力练习

    • 安装 libcap 工具
    • 查看进程的能力
    • 给可执行文件添加和移除能力
    • 测试能力对进程权限的影响
  3. chroot 隔离练习

    • 创建 chroot 环境
    • 复制必要的文件和库
    • 在 chroot 环境中运行程序
    • 测试 chroot 环境的隔离效果
  4. Docker 容器练习

    • 安装 Docker
    • 创建 Dockerfile
    • 构建 Docker 镜像
    • 运行 Docker 容器
    • 测试容器的隔离效果
  5. 进程资源限制练习

    • 使用 ulimit 设置临时资源限制
    • 编辑 /etc/security/limits.conf 设置永久资源限制
    • 使用 prlimit 设置特定进程的资源限制
    • 使用 cgroups 设置精细的资源限制
  6. 进程安全审计练习

    • 安装和配置 auditd
    • 添加进程审计规则
    • 查看和分析审计日志
    • 使用 psacct 监控进程活动
  7. 综合进程访问控制练习

    • 设计一个安全的进程运行方案
    • 结合 Linux 能力、进程隔离和资源限制
    • 测试方案的安全性和有效性
    • 优化进程访问控制策略

总结

本章节详细介绍了 Linux 系统中进程访问控制的原理和方法,包括:

  • 进程权限的基本概念和作用
  • 进程的用户 ID 和组 ID
  • Linux 能力(Capabilities)机制
  • 进程隔离技术(chroot、容器、cgroups)
  • 进程资源限制的设置和管理
  • SELinux 和 AppArmor 对进程的访问控制
  • 进程安全审计和监控
  • 进程访问控制的最佳实践

通过学习本章节,您应该能够全面了解 Linux 进程访问控制的原理和方法,掌握进程权限管理的各种技术和工具,制定合理的进程访问控制策略,确保系统和数据的安全。在实际应用中,建议根据进程的用途和敏感程度,结合多种进程访问控制技术,制定多层次、细粒度的访问控制方案,同时定期进行进程审计和监控,及时发现和修复权限问题,提高系统的安全性和可靠性。

扩展阅读

« 上一篇 目录访问控制 下一篇 » 网络访问控制