第1章 导言 1
1.1 什么是安全 1
1.2 计算机系统安全的历史 1
1.3 计算机系统安全的现状 2
1.4 Linux内核安全概貌 3
第一部分 自主访问控制 5
第2章 主体标记与进程凭证 5
2.1 进程凭证 5
2.2 详述 6
2.2.1 uid和gid 6
2.2.2 系统调用 7
2.3 proc文件接口 9
2.4 参考资料 9
习题 9
第3章 客体标记与文件属性 10
3.1 文件的标记 10
3.2 文件属性 10
3.3 系统调用 11
3.4 其他客体 12
3.5 其他客体的系统调用 14
习题 15
第4章 操作与操作许可 16
4.1 操作 16
4.2 操作许可与操作分类 16
4.3 允许位 18
4.4 设置位 19
4.4.1 文件 19
4.4.2 目录 19
4.5 其他操作的许可 20
4.6 系统调用 20
习题 20
第5章 访问控制列表 21
5.1 简介 21
5.2 扩展属性 21
5.3 结构 21
5.4 操作许可 23
5.5 两种ACL 23
5.6 与允许位的关系 23
5.7 系统调用 23
5.8 参考资料 24
习题 24
第6章 能力(capabilities) 25
6.1 什么是能力 25
6.2 能力列举 25
6.2.1 文件 26
6.2.2 进程 27
6.2.3 网络 28
6.2.4 ipc 28
6.2.5 系统 28
6.2.6 设备 28
6.2.7 审计 28
6.2.8 强制访问控制(MAC) 28
6.3 UNIX的特权机制 29
6.4 Linux的能力集合和能力机制 29
6.4.1 能力集合 29
6.4.2 能力机制 30
6.5 向后兼容 32
6.6 打破向后兼容 33
6.7 总结 34
6.8 参考资料 34
习题 34
第二部分 强制访问控制 36
第7章 SELinux 36
7.1 简介 36
7.1.1 历史 36
7.1.2 工作原理 36
7.1.3 SELinux眼中的世界 39
7.2 机制 39
7.2.1 安全上下文 39
7.2.2 客体类别和操作 40
7.2.3 安全上下文的生成和变化 59
7.3 安全策略 62
7.3.1 基本定义 63
7.3.2 安全上下文定义 68
7.3.3 安全上下文转换 72
7.3.4 访问控制 75
7.3.5 访问控制的限制和条件 75
7.4 伪文件系统的含义 78
7.5 SELinux相关的伪文件系统 78
7.5.1 selinuxfs 78
7.5.2 proc 80
7.6 总结 80
7.7 参考资料 81
习题 81
第8章 SMACK 82
8.1 历史 82
8.2 概述 83
8.3 工作机制 84
8.3.1 操作许可 84
8.3.2 类型转换 84
8.4 扩展属性 86
8.5 伪文件系统 86
8.5.1 策略相关文件 87
8.5.2 网络标签相关文件 89
8.5.3 其他文件 90
8.6 网络标签 91
8.7 总结 91
8.8 参考资料 91
习题 91
第9章 Tomoyo 92
9.1 简介 92
9.1.1 基于路径的安全 92
9.1.2 粒度管理 93
9.1.3 用户态工具 93
9.1.4 三个分支 93
9.2 机制 93
9.2.1 操作许可 94
9.2.2 类型和域 94
9.3 策略 95
9.3.1 域策略 95
9.3.2 异常 96
9.3.3 轮廓 99
9.4 伪文件系统 102
9.5 总结 103
9.6 参考资料 103
习题 103
第10章 AppArmor 104
10.1 简介 104
10.2 机制 104
10.2.1 操作许可 104
10.2.2 域间转换 107
10.3 策略语言 108
10.4 模式 110
10.5 伪文件系统 110
10.5.1 proc文件系统 110
10.5.2 sys文件系统 111
10.5.3 securityfs文件系统 112
10.6 总结 113
10.7 参考资料 113
习题 113
第11章 Yama 114
11.1 简介 114
11.2 机制 114
11.3 伪文件系统 116
11.4 嵌套使用 116
11.5 总结 117
11.6 参考资料 117
习题 117
第三部分 完整性保护 119
第12章 IMA/EVM 119
12.1 简介 119
12.1.1 可信计算 119
12.1.2 完整性 120
12.1.3 哈希 121
12.1.4 IMA/EVM 121
12.2 架构 122
12.2.1 钩子 122
12.2.2 策略 122
12.2.3 扩展属性 123
12.2.4 密钥 123
12.2.5 用户态工具 124
12.3 伪文件系统 126
12.4 命令行参数 127
12.5 总结 128
12.6 参考资料 128
习题 128
第13章 dm-verity 129
13.1 Device Mapper 129
13.2 drn-verity简介 130
13.3 代码分析 131
13.3.1 概况 131
13.3.2 映射函数(veri_map) 132
13.3.3 构造函数(veri_ctr) 137
13.4 总结 138
13.5 参考资料 138
习题 138
第四部分 审计和日志 140
第14章 审计(audit) 140
14.1 简介 140
14.1.1 审计和日志 140
14.1.2 概貌 140
14.2 架构 141
14.2.1 四个消息来源 141
14.2.2 规则列表 147
14.2.3 对文件的审计 150
14.3 接口 153
14.4 规则 155
14.5 总结 157
14.6 参考资料 157
第15章 syslog 158
15.1 简介 158
15.2 日志缓冲 158
15.3 读取日志 159
15.4 netconsole 160
15.5 参考资料 160
习题 160
第五部分 加密 162
第16章 密钥管理 162
16.1 简介 162
16.2 架构 162
16.2.1 数据结构 162
16.2.2 生命周期 164
16.2.3 类型 168
16.2.4 系统调用 171
16.2.5 访问类型 174
16.3 伪文件系统 175
16.4 总结 175
16.5 参考资料 175
第17章 eCryptfs 176
17.1 简介 176
17.2 文件格式 176
17.3 挂载参数 179
17.4 设备文件 180
17.5 用户态工具 180
17.6 总结 185
17.7 参考资料 185
第18章 dm-crypt 186
18.1 简介 186
18.2 架构 186
18.2.1 两个队列(queue) 186
18.2.2 五个参数 189
18.3 总结 193
18.4 参考资料 193
第19章 LUKS 194
19.1 简介 194
19.2 布局 194
19.3 操作 195
19.4 总结 196
19.5 参考资料 196
第六部分 其他 198
第20章 namespace 198
20.1 引言 198
20.1.1 容器与监狱 198
20.1.2 chroot()与pivot_root() 198
20.2 机制 202
20.2.1 挂载命名空间 203
20.2.2 进程间通信命名空间 205
20.2.3 UNIX分时命名空间 207
20.2.4 进程号命名空间 208
20.2.5 网络命名空间 212
20.2.6 用户命名空间 212
20.2.7 进程数据结构 215
20.3 伪文件系统 216
20.4 系统调用 216
20.4.1 clone 216
20.4.2 unshare 217
20.4.3 setns 217
20.5 总结 217
20.6 参考资料 218
习题 218
第21章 cgroup 219
21.1 简介 219
21.1.1 一种安全攻击 219
21.1.2 对策 220
21.1.3 历史 220
21.1.4 用法举例 221
21.2 架构 222
21.2.1 设计原则 222
21.2.2 代码分析 223
21.3 伪文件系统 229
21.4 总结 231
21.5 参考资料 232
第22章 seccomp 233
22.1 简介 233
22.2 架构 233
22.2.1 进程数据结构 233
22.2.2 模式 234
22.2.3 内核中的虚拟机 234
22.2.4 工作原理 235
22.3 内核接口 236
22.3.1 系统调用 236
22.3.2 伪文件 236
22.4 总结 237
22.5 参考资料 237
第23章 ASLR 238
23.1 简介 238
23.2 内存布局 239
23.2.1 伪文件/proc/[pid]/maps 239
23.2.2 ELF文件格式 240
23.2.3 动态链接的可执行文件 241
23.2.4 静态链接的可执行文件 243
23.2.5 位置无关的可执行文件 244
23.3 工作原理 245
23.4 内核接口 246
23.5 总结 246
23.6 参考资料 246
附录 247