Contents
基于 PAM 的用户权能分配
1.指出每个权能对应的系统调用,简要解释功能
1.1 查询有哪些 capacities
1.1.1 使用 man 命令查询
$ man capabilities
1.1.2 网站在线查询
完整列表如下:https://man7.org/linux/man-pages/man7/capabilities.7.html
网站对应以下内容:
– Capabilities list(本课程实验对应部分)
– Past and current implementation
– Notes to kernel developers
– Thread capability sets
– File capabilities
– File capability extended attribute versioning
– Transformation of capabilities during execve()
– Safety checking for capability-dumb binaries
– Capabilities and execution of programs by root
– Set-user-ID-root programs that have file capabilities
– Capability bounding set
– Effect of user ID changes on capabilities
– Programmatically adjusting capability sets
– The securebits flags: establishing a capabilities-only environment
– Per-user-namespace “set-user-ID-root” programs
– Namespaced file capabilities
– Interaction with user namespaces
1.2 Capabilities list 内容解释
1.CAP-AUDIT-CONTROL (since Linux 2.6.11) 启用和禁用内核审计;更改审计过滤规则;检索审核状态和过滤规则。
2.CAP-AUDIT-READ (since Linux 3.16) 允许通过一个多播 netlink socket 读取审计日志
3.CAP-AUDIT-WRITE (since Linux 2.6.11) 允许向内核审计日志写记录
4.CAP-BLOCK-SUSPEND (since Linux 3.5) 系统调用:epoll,可以阻塞系统挂起的特性
5.CAP-BPF (since Linux 5.8) 使用特权 BPF 操作。 Linux 5.8 中添加了此功能,来将 BPF 功能与重载的 CAP-SYS-ADMIN 功能分开。
6.CAP-CHECKPOINT-RESTORE (since Linux 5.9) Linux 5.9 中添加了此功能,以将检查点/恢复功能与重载CAP-SYS-ADMIN 功能分离。
7.CAP-CHOWN 系统调用:chown,对文件的 UID 和 GID 做任意的修改
8.CAP-DAC-OVERRIDE 忽略文件读取、写入和执行权限检查
9.CAP-DAC-READ-SEARCH 忽略 DAC 中对文件和目录的读、搜索权限
10.CAP-FOWNER 忽略忽略进程 UID 与文件 UID 的匹配检查
11.CAP-FSETID 文件修改时不清除 setuid 和 setgid 位,不匹配时设置 setgid 位
12.CAP-IPC-LOCK 锁定内存;使用大页面分配内存
13.CAP-IPC-OWNER 绕过对 System V IPC 对象的操作的权限检查
14.CAP-KILL 系统调用:kill,绕过发送信号时的权限检查,允许对不属于自己的进程发送信号
15.CAP-LEASE (since Linux 2.4) 允许在文件上建立租借锁
16.CAP-LINUX-IMMUTABLE 设置 FS-APPEND-FL 和 FS-IMMUTABLE-FL inode 标志
17.CAP-MAC-ADMIN (since Linux 2.6.25) 允许 MAC 配置或状态更改。为 Smack Linux 安全模块 (LSM) 实现。
18.CAP-MAC-OVERRIDE (since Linux 2.6.25) 覆盖强制访问控制 ( MAC )。为 Smack LSM 实现。
19.CAP-MKNOD (since Linux 2.4) 使用 mknod(2) 创建特殊文件
20.CAP-NET-ADMIN 允许执行网络管理任务:接口、防火墙和路由等
21.CAP-NET-BIND-SERVICE 允许绑定到小于 1024 的端口,普通用户不能通过 bind 函数绑定到小于 1024 的端口,而 CAP-NET-BIND-SERVICE 可以让普通用户也可以绑定端口到 1024 以下
22.CAP-NET-BROADCAST 允许网络广播和多播访问
23.CAP-NET-RAW 系统调用:socket,允许使用原始套接字,原始套接字编程可以接收到本机网卡上的数据帧或者数据包,对监控网络流量和分析有很大的作用。
24.CAP-PERFMON (since Linux 5.8) 采用各种性能监控机制,包括:* call perf-event-open(2);* 采用具有性能影响的各种 BPF 操作。Linux 5.8 中添加了此功能,以将性能监控功能与重载的 CAP-SYS-ADMIN 功能分开。
25.CAP-SETGID 系统调用:setgid,设置和管理进程 GID
26.CAP-SETFCAP (since Linux 2.6.24) 设置文件权能
27.CAP-SETPCAP 系统调用:capset,允许授予或删除其他进程的任何权能,只有 init 进程具有这种能力
28.CAP-SETUID 系统调用:setuid,设置和管理进程 UID
29.CAP-SYS-ADMIN 允许执行系统管理任务,如挂载/卸载文件系统,设置磁盘配额,开/关交换设备和文件等
30.CAP-SYS-BOOT 系统调用:reboot,允许普通用户重新启动系统
31.CAP-SYS-CHROOT 系统调用:chroot,普通用户无法使用 chroot() 系统调用更改程序执行时所参考的根目录位置,而 CAP-SYS-CHROOT 可以给普通用户这个权限。
32.CAP-SYS-MODULE 系统调用:init-module,允许普通用户插入和删除内核模块
33.CAP-SYS-NICE 系统调用:nice,允许提升优先级,设置其他进程优先级
34.CAP-SYS-PACCT 系统调用:acct,允许普通用户配置进程记账
35.CAP-SYS-PTRACE 系统调用:ptrace,允许普通用户跟踪任何进程
36.CAP-SYS-RAWIO 允许对 ioperm/iopl 的访问
37.CAP-SYS-RESOURCE 系统调用:setrlimit,设置资源限制,但是普通用户不能用 setrlimit 来突破 ulimit 的限制
38.CAP-SYS-TIME 系统调用:stime,允许改变系统时钟
39.CAP-SYS-TTY-CONFIG 系统调用:vhangup,允许配置 TTY 设备
40.CAP-SYSLOG (since Linux 2.6.37) 系统调用:syslog,执行特权 syslog(2) 操作
41.CAP-WAKE-ALARM (since Linux 3.0) 触发将唤醒系统的东西(设置 CLOCK-REALTIME-ALARM 和 CLOCK-BOOTTIME-ALARM 定时器)
2.基于 PAM 用户权限设置系统
实验环境:
- Windows 11 Pro
- WSL2
- Docker Desktop
- image: Ubuntu:latest
实验要求:
- 在某用户登录时,规定其只具有某种权能,例如 ping、passwd 命令。
实验流程:
- 新建三个用户: os-ping , os-passwd , os-none
- 运行 auto-del-uid.sh 脚本,找出并清除所有程序的权能
- 在切换用户登录前运行 login.sh 脚本,实现三个用户登录后只可以执行不同的命令
- os-ping 用户登录后只可以执行 ping 命令
- os-passwd 用户登录后只可以执行 passwd 命令
- os-none 登录后不可以执行任何命令
配置环境(重要)
容器为了最大程度减小镜像的大小,默认没有 ping 命令
root@56c79e554408:/# apt update
root@56c79e554408:/# apt install iputils-ping
# 为新安装的 ping 命令添加 uid 位
root@56c79e554408:/# chmod u+s /usr/bin/ping
# 添加用户
root@56c79e554408:/# useradd os-ping
root@56c79e554408:/# useradd os-passwd
root@56c79e554408:/# useradd os-none
# 选择 no
root@56c79e554408:/# dpkg-reconfigure dash
root@56c79e554408:/# vim /etc/pam.d/common-session
# 将下面这行命令写入 common-session 文件中
session optional pam-exec.so debug log=/tmp/pam-exec.log seteuid /login.sh
2.1 找出并清除所有程序的权能
2.1.1 找出所有程序的权能
执行 auto-del-uid.sh 脚本,显示出设置了 s 位的程序列表
并将其写入 /tmp/pro-list 文件中
查看 /tmp/pro-list 文件中的内容
2.1.2 清除所有程序的权能
按任意键继续程序,删除所有具有 uid 程序的权能
2.2 查看 ping 、 passwd 命令的权能
getcap 命令查看 ping 、 passwd 命令的权能,显示为空
2.3 切换用户,自动运行 login.sh ,实现用户登录只能运行特定程序
- os-ping 用户只能运行 ping 命令
- os-passwd 用户只能运行 passwd 命令
- os-none 用户无法运行任何命令
2.3.1 os-ping 用户只能运行 ping 命令
2.3.2 os-passwd 用户只能运行 passwd 命令
2.3.3 os-none 用户无法运行任何命令
3.制作了已经配置好环境的 docker 容器
使用以下命令拉取镜像
docker pull tremb1e/os-sec-experiment:ex1
使用以下命令运行直接镜像
docker run -it tremb1e/os_sec_experiment:ex1 /bin/bash
使用教程如下
3.1 直接运行镜像
使用以下命令直接运行镜像
docker run -it tremb1e/os-sec-experiment:ex1 /bin/bash
在当前目录下有两个脚本
3.2 运行脚本
运行后会将拥有 uid 的程序路径写入 /tmp/pro-list 文件中
./auto-del-uid.sh
3.3 切换用户,自动运行 login.sh ,实现用户登录只能运行特定程序
- os-ping 用户只能运行 ping 命令
- os-passwd 用户只能运行 passwd 命令
- os-none 用户无法运行任何命令