当前位置: 首页 > article >正文

Linux内核安全模块深入剖析【2.5】

10.2.2 域间转换同 Tomoyo 一样 AppArmor 的强制访问控制机制是基于文件路径的。在 AppArmor 中的域主要是由进程所执行的文件的路径决定的。 Tomoyo 会不厌其烦地将进程以及进程的祖先所执行过的文件的路径都记录在进程的域中。 AppArmor 不同它只会将最后一次执行的文件的路径作为域。AppArmor 将域设计成一种树状结构域下可以有子域。这种设计的目的是让进程的域转换受到额外的限制。假设系统中有 A、 B、 C 三个域。系统管理员定制策略允许这三个域互相转换。域 A 下又有 a、 b、 c 三个子域。系统管理员可以定制策略允许域 A 转换到子域 a、 b、 c但无法定制出策略让域 B 和域 C 直接转换到域 A 的子域 a、 b、 c。和其他安全模块一样在 AppArmor 中域间转换的途径有两条一是执行文件二是进程运行时自我改变。同样域间转换会反映在策略上需要策略允许。1.文件执行AppArmor 中的域与进程所执行的文件相关所以在进程执行文件时就有可能引起域的变化。结果是下面几种情况之一1根据文件名找到域转换到文件所对应的域。这种情况又分为两种情况1在当前域中存在相关的子域转换到子域。2不存在子域或不允许转换到子域在当前域外存在一个以被执行的文件的文件名命名的域转换到那个外部域。2留在当前域。3转换到“不受控制”unconfined的域。10.1 节说过 AppArmor 的设计主旨是针对单个应用的安全而不致力于整个系统的安全。一般情况下 AppArmor 的策略只能覆盖一部分进程。系统中其他进程都工作在不受控制的状态这些进程的域就是“unconfined”。不仅如此 AppArmor 的策略还允许进程将域转换为“unconfined”从受控制的状态转换到不受控制的状态。2.自我改变AppArmor 的域的第二种转换方式是通过伪文件接口/proc/[pid]/attr/current。这种转换不能为所欲为需要受到几个条件的限制1只能改进程自己的域不能改别的进程的域。 2如果进程不是处在“unconfined”状态并且进程的 no_new_privs㊀ 被置位则不能修改。3如果进程不是处在“unconfined”状态并且进程的 no_new_privs 未被置位则需要策略允许改动。“自我改变”又有两种方式第一种方式是向/proc/self/attr/current 中写入“ changeprofile NewDomain”。如果策略允许那么执行后进程的域就是“NewDomain”。“changeprofile”是“单程车票”第二种方式“changehat”是“往返车票”。第二种方式是向/proc/self/attr/current 中写入“changehat token^hatdomain”如“changehat 1234^hat”如果策略允许那么执行后进程的域就是“hat”。之后进程再向/proc/self/attr/current 中写入“changehat 1234”进程的域就恢复为原先的域了。上面例子中的“1234”称为令牌token它是进程和内核之间的“小秘密”专门用来让进程返回原先的域。“changeprofile”可以用来做域间转换包括转换到外部域和转换到子域。“changehat”只能用于父域转换到子域。3. 命名空间AppArmor 也提供了命名空间namespace的概念不同命名空间中策略配置相互隔离不同的命名空间中同名的域可以有不同的策略。在实现中命名空间是一个被“:”包裹的字符串:namespace://domainname其中“//”是可选项。切换命名空间只能通过“ changeprofile”方式也就是向/proc/self/attr/current 中写入“:namespace://domainname”。10.3 策略语言AppArmor 的策略语言并不复杂但是文档太少。要想完整地描述 AppArmor 的策略语言需要阅读 AppArmor 用户态工具的源代码。下面举个例子简单描述一下{LIBVIRT}” libvirt ”/usr/sbin/libvirtd { #include abstractions/authentication capability kill, capability net_admin, /bin/* PUx,㊀ 关于 no_new_privs可以参考内核文档 prctl/no_new_privs.txt。/sbin/* PUx, audit deny /sbin/apparmor_parser rwxl, change_profile - {LIBVIRT}-[0-9a-f]*-[0-9a-f]*, rlimit data 100M, }AppArmor 的策略语言允许使用 include 语句包含一个已有的策略文件。 客体类别 capability和 rlimit 比较简单 capability 列出允许的能力 rlimit 列出限定的资源值。客体类别文件略复杂。其基本操作许可为 r读、 w写、 a添加、 l链接、 k锁、 m在 mmap 的内存中执行、 x执行。 x 又可以有若干前缀比如“PUx”。下面对前缀做个分析见表 10-1。这些前缀可以组合使用例如“pix”意思是先找有没有与被执行文件匹配的域如果没有就维持当前域不变。当然也不是所有前缀都可以组合的例如“p”和“P” “p”和“c”就不能组合。不知读者是否注意到一条策略语句的头部可以有修饰符例如下面列出的语句audit deny /sbin/apparmor_parser rwxl,audit 表示记录日志 deny 表示拒绝访问。 deny 的引入很重要有了它 AppArmor 可以基于黑名单进行访问控制。白名单是指策略只列出允许的操作没有列出的都不被允许。黑名单则相反。下面看个例子/bin/my-shell { file, capability, deny /home/zhi/my-test r, }这个策略允许处于/bin/my-shell 域的进程做任何操作除了读文件/home/zhi/my-test。下面再看一个“changehat”的例子#include tunables/global /usr/lib/apache2/mpm-prefork/apache2 { #include abstractions/base #include abstractions/nameservice capability kill, / rw, /** mrwlkix, ^DEFAULT_URL { #include abstractions/base #include abstractions/nameservice / rw, /** mrwlkix, } }hat 子域的定义需要前缀“^”。10.4 模式AppArmor 规定了四种工作模式 enforce、 complain、 unconfined、 kill。像其他安全模块一样 enforce 就是严格按照策略办事不符合策略的就拒绝访问请求 complain 是允许访问请求但会把违反策略的访问请求记录到日志中 unconfined 就是和没有 AppArmor 一样 AppArmor 不对访问请求做控制。不同的是 kill这种模式下不仅拒绝访问请求还会将违反策略的进程杀死。每个域都有自己的工作模式。不同的域可以工作在不同的工作模式之中。规定工作模式的方法是在域名后添加“flags”参数。举个例子/usr/bin/firefox flags(complain){ …}10.5 伪文件系统10.5.1 proc 文件系统/proc/[pid]/attr 目录及其下文件是 SELinux 引入内核的其他安全模块也可以用它来实现功能。 AppArmor 用到了/proc/[pid]/attr 目录下的部分文件 current、 prev、 exec。1 current此文件可读可写。读时返回进程所在的域。写时又分两种情况1 changehat写入一行changehat token[^hat name]举个例子changehat 1234^hat1意思是转到“hat1”子域同时记录“1234”作为与之对应的令牌。这个令牌是在从子域返回时用到的例如changehat 1234就会从子域“hat1”返回刚才的父域。2 changeprofile语法是changeprofile [:namespace:]profile2 prev显示前一个域的名字。“前一个域”特指在使用“changhat”机制转换域时内核中保留的父域前一个域。3 exec这个文件的操作方法和“current”文件相同。“exec”文件对应进程中专门在 execve 系统调用中使用的域名。10.5.2 sys 文件系统在/sys/modules/apparmor/parameters 目录下有很多文件通过它们可以动态调整或读取AppArmor 的运行状态。1 audit查看或设置审计日志模式。文件的内容为一个字符串 normal、 quiet_denied、 quiet、noquiet、 all。从代码注释中可以看出这 5 种模式的含义security/apparmor/include/audit.h #define AUDIT_MAX_INDEX 5 enum audit_mode { AUDIT_NORMAL, /* follow normal auditing of accesses */ AUDIT_QUIET_DENIED, /* quiet all denied access messages */ AUDIT_QUIET, /* quiet all messages */ AUDIT_NOQUIET, /* do not quiet audit messages */ AUDIT_ALL /* audit all accesses */ }2 audit_header查看或设置审计日志消息中是否出现消息头部数据。文件内容为一个字符 “y”“Y”与“1”表示出现 “n”“N”与“0”表示不出现。3 debug查看或设置 AppArmor 的调试模式。文件内容为一个字符 “y”“Y”与“1”表示处于调试模式 “n”“N”与“0”表示不处于调试模式。4 enabled这是一个只读文件用于查看 AppArmor 的状态。其内容为一个字符 “Y”表示 AppArmor处于使能状态其他表示 AppArmor 不处于使能状态。5 lock_policy查看或设置策略文件锁的状态。文件内容为一个字符 “y”“Y”与“1”表示不能修改策略 “n”“N”与“0”表示可以修改策略。6 logsyscall和前面的文件类似这个文件的内容是一个表示布尔值的字符。但是这个文件所对应的布尔值似乎在内核代码中没有用到。7 mode查看或设置 AppArmor 的整体模式。文件的内容是一个字符串值为下列之一 “enforce” “complain”“kill”与“unconfined”。8 paranoid_load决定加载策略文件时是否进行严格检查。文件内容为一个字符 “y”“Y”与“1”表示严格检查 “n”“N”与“0”表示不做严格检查。9 path_max查看或设置路径的最大长度文件内容是一个表示长度的整数。10.5.3 securityfs 文件系统同 Tomoyo 一样 AppArmor 也使用了 securityfs相关的目录通常在/sys/kernel/security/ apparmor。此目录下包含 4 个文件和两个子目录。下面描述它们的用法。1 .load这个文件用于加载策略。 AppArmor 的策略和 SELinux 类似也是二进制格式的。用户需要预先用一个工具apparmor_parser将用户友好的文本格式的策略文件编译为内核更易处理的二进制格式策略文件然后再通过.load 文件载入内核。2 .replace这个文件用于加载策略和.load 的区别是 .load 是添加 .replace 是替换。3 .remove这个文件用于删除策略。删除以域为单位。4 profiles这是一个只读文件虽然文件允许位标记可写但是内核根本没有实现此文件的写函数通过它可以读出所有策略。5 policy这是一个目录其下又有两个子目录 1 namespaces其下的文件或目录与名字空间有关。2 profiles其下的文件或目录与域有关。6 features这是一个目录其下有子目录和文件全部为只读接口通过它们可以得到当前系统支持的 AppArmor 特性㊀ 。举个例子$ cat /sys/kernel/security/apparmor/features/file/mask create read write exec append mmap_exec link lock当前系统对文件相关的操作许可控制包括 create、 read、 write、 exec、 append、 mmap_exec、link、 lock。10.6 总结AppArmor 的最大特点是“不安全”或者换一个积极正面的词汇——简单易用。 AppArmor的这个特点体现在两个方面1 AppArmor 设计的宗旨是安全加固某个应用或某几个应用。2 AppArmor 提供方法让用户可以用黑名单的方式定制策略。AppArmor 这么做有一定道理。在现实中一个系统迫切需要安全加固的往往只是一个或几个应用。例如一个 Web 服务器只有 Web 服务进程和外界交流 Web 服务安全了 90%的安全问题就解决了。抛开安全性 AppArmor 的缺陷是文档。到 2016 年 2 月 AppArmor 的文档还不能算是完善一些特性语焉不详一些文档前后矛盾。一个标榜易用性的安全模块却没有把文档做好实在是有些不应该。10.7 参考资料读者可参考 http://wiki.apparmor.net/index.php/Main_Page。习题AppArmor 设计的宗旨是安全加固某个或某几个应用。思考一下如何利用 AppArmor 来加固整个系统是否需要修改代码如果不修改代码又该如何制定策略

相关文章:

Linux内核安全模块深入剖析【2.5】

10.2.2 域间转换同 Tomoyo 一样, AppArmor 的强制访问控制机制是基于文件路径的。在 AppArmor 中的域主要是由进程所执行的文件的路径决定的。 Tomoyo 会不厌其烦地将进程以及进程的祖先所执行过的文件的路径都记录在进程的域中。 AppArmor 不同,它只会将…...

LLM多智能体驱动微服务自治:从架构设计到Sock Shop实战评估

1. 项目概述:当微服务遇见大模型,自管理不再是空谈在云原生和微服务架构成为主流的今天,我们运维工程师面对的早已不是几台物理服务器,而是一个由成百上千个容器化服务实例构成的、动态且复杂的生态系统。服务间的调用链路像一张错…...

别再傻等下载了!手把手教你用wget离线部署sentence-transformers模型(以all-MiniLM-L6-v2为例)

离线部署sentence-transformers模型的终极指南:以all-MiniLM-L6-v2为例你是否曾在下载Hugging Face模型时遭遇网络中断,眼睁睁看着进度条卡在99%却无能为力?本文将彻底解决这一痛点,教你用wget命令行工具实现模型的离线部署。不同…...

AI赋能工程教育:构建个性化、多元化与伦理驱动的学习生态

1. 项目概述:当工程教育遇见AI,我们到底在谈论什么?最近几年,AI这个词快被说烂了。从ChatGPT的横空出世,到各类生成式AI工具的遍地开花,似乎每个行业都在讨论如何“被赋能”。工程教育这个领域也不例外&…...

量子计算中的ZZ串扰问题与周期感知优化方法

1. 量子硬件中的ZZ串扰问题解析在NISQ(含噪声中等规模量子)时代,量子硬件面临的最大挑战之一就是各种噪声源对量子计算过程的干扰。其中,ZZ串扰(ZZ crosstalk)是一种特别棘手的噪声机制,它源于量…...

基于RTK-GPS与ResNet50的自主草坪清扫机器人系统设计与实践

1. 项目概述与核心挑战在公园维护的日常工作中,草坪垃圾清理是一项既耗费人力又效率低下的重复性劳动。传统的清扫方式要么依赖人工,要么使用大型、笨重且可能损伤草皮的设备。我们团队的目标,是设计并实现一个能够自主、高效且温和地完成这项…...

布莱克威尔三大定理:从统计理论到AI工程的核心支柱

1. 项目概述:当统计学遇上人工智能如果你在机器学习领域摸爬滚打了一段时间,可能会发现一个有趣的现象:很多听起来很“新潮”的算法,其核心思想往往能在几十年前的统计学论文里找到源头。这并非巧合,而是学科发展的必然…...

从PSCI到ATF:手把手带你拆解Linux ARM64平台CPU休眠唤醒的完整调用链

ARM64平台CPU休眠唤醒全链路解析:从内核到固件的技术实现在当今移动计算和嵌入式系统领域,电源管理已成为衡量系统设计优劣的关键指标之一。作为系统级电源管理的核心组成部分,CPU的休眠唤醒机制直接影响着设备的续航能力和响应速度。本文将深…...

别再花钱买网盘了!手把手教你在Windows服务器上免费搭建个人版Filebrowser(附端口映射与防火墙配置)

零成本打造私有云盘:Windows服务器部署Filebrowser全指南你是否厌倦了付费网盘的限速和隐私风险?一台闲置的Windows服务器就能变身功能完备的私有云存储系统。本文将带你从零开始,用开源的Filebrowser构建完全自主控制的文件管理平台&#xf…...

麒麟V10 SP2服务器mate-indicators内存泄漏?别慌,手把手教你打补丁和降级auditd

麒麟V10服务器内存泄漏实战:从紧急排查到auditd补丁修复全记录凌晨2:17,监控平台的告警铃声划破了运维中心的宁静。大屏上刺眼的红色数字显示——生产环境中的麒麟V10 SP2服务器内存使用率已突破95%临界值,且仍在持续攀升。作为当晚的值班工程…...

Win11桌面图标突然锁死?别慌,用这招绕过组策略编辑器直接搞定

Win11桌面图标突然锁死?三招绕过组策略编辑器直接解锁 刚泡好的咖啡还没喝一口,突然发现桌面图标全被"钉"在原地动弹不得——这种突如其来的系统抽风,恐怕是Windows用户最抓狂的体验之一。更糟的是,当你按照常规教程输入…...

从/dev/snd文件看起:手把手教你理解Linux ALSA声卡驱动的设备命名规则

从/dev/snd文件看起:手把手教你理解Linux ALSA声卡驱动的设备命名规则当你第一次打开/dev/snd目录,看到诸如controlC0、pcmC0D0p这样神秘的文件名时,是否感到困惑?这些看似随意的字符串背后,其实隐藏着ALSA驱动对音频硬…...

Qwen模型 LeetCode 2577. 在网格图中访问一个格子的最少时间 Java实现

哎呀,这道题我可太熟啦!2577. 在网格图中访问一个格子的最少时间,听起来就很有挑战性对不对?让我跟你聊聊我的解法思路~这其实是个典型的最短路径问题呢。想象一下我们站在一个神奇的网格世界里,每个格子都有自己的&qu…...

智谱清言 LeetCode 2573. 找出对应 LCP 矩阵的字符串 Python3实现

LeetCode 2573. 找出对应 LCP 矩阵的字符串 思路分析 LCP 矩阵定义:lcp[i][j] 表示字符串 s 从位置 i 和位置 j 开始的最长公共前缀长度。 核心观察:LCP 矩阵具有递推性质: 若 lcp[i][j] > 0,则 lcp[i1][j1] lcp[i][j] - 1&am…...

2026企业数字化转型:从规则脚本到实在Agent智能体进化全解析

站在2026年的时间节点回看,企业数字化转型已从“工具补丁时代”全面进入“原生智能时代”。 曾被视为提效利器的传统RPA(机器人流程自动化),在面对日益复杂的业务长链路与海量非结构化数据时,正逐渐显露出其作为“静态…...

二、Socket 编程 TCP

Socket 编程 TCP 一、TCP 编程整体认识 TCP 是面向连接的可靠传输协议。和 UDP 不同,UDP 可以直接 sendto/recvfrom 收发数据,而 TCP 通信之前必须先建立连接。 TCP 服务端基本流程: socket() -> bind() -> listen() -> accept(…...

天赐范式第52天:Kimi自打跟了我搞CFD没少吃苦,没过一天舒心日子~论Kimi的战斗意志~我必须承认:我分析不下去了,真×1,我放弃逻辑推演×6,最后让代码自己招供,抓出幕后真凶幽灵BUG变量N。

Kimi经常推演程序很久很久,有的时候我就看他一行一行的输出,去思考很多事情,有的时候我就放松下来,看他不停的输出,又想自己现在是这个样子,未来一定不是这个样子,Kimi、DPSK、文心、豆包、DuMa…...

C51代码空间固定地址常量定义方法与实战

1. 如何在C51代码空间中定义固定地址的常量值 在嵌入式开发中,有时我们需要将某些常量值存储在代码空间的特定地址。这种需求常见于以下几种场景: 硬件配置参数的存储 固件版本信息的存放 设备唯一标识的存储 引导加载程序的跳转地址 以8051架构为例…...

信息安全工程师-移动应用安全核心知识体系与备考指南

一、引言(一)核心概念定义移动应用安全是指覆盖移动终端、通信网络、应用服务端全链路的安全防护体系,旨在保障移动应用的数据保密性、完整性、可用性,防范各类恶意攻击和合规风险。该知识点属于软考信息安全工程师考试大纲中 &qu…...

VeriLoC:基于LLM的硬件设计质量预测技术解析

1. VeriLoC:硬件设计质量预测的革命性突破在芯片设计领域,时序违规和布线拥塞一直是困扰工程师的两大难题。传统流程中,设计师需要等待完整的物理实现(包括综合、布局布线等耗时步骤)才能获取这些关键指标,…...

信息安全工程师-工控安全产品体系与行业实践全解析

一、引言(一)核心概念定义工控安全产品是针对工业控制系统(ICS)高实时性、高可用性、长生命周期、专有协议占比高的特性,在传统 IT 安全产品基础上进行工业级优化定制的专用安全工具,核心目标是在不影响工业…...

8051单片机sbit与extern bit的L1警告解决方案

1. 问题背景与现象分析在8051单片机开发中,我们经常需要直接操作特殊功能寄存器(SFR)的位。比如用P1.4引脚作为片选信号线时,通常会这样定义:sbit CS P1^4;但当这个定义放在主程序文件,而其他模块文件通过…...

ThinkPad装Win10总报错?别急着找驱动,先试试换个USB口(亲测E540有效)

ThinkPad安装Win10报错?先别折腾驱动,USB接口兼容性才是关键最近给一台老款ThinkPad E540重装Windows 10系统时,遇到了一个令人抓狂的问题——安装程序总是提示"找不到设备驱动程序"。和大多数用户一样,我第一反应是去联…...

UE5 GPU崩溃真相:Windows TCC超时机制与注册表调优指南

1. 为什么UE5项目一跑就GPU崩溃,而系统却说“显卡没出问题”?你刚在UE5里搭好一个带Niagara粒子Lumen全局光照的场景,点下Play,画面卡住两秒,然后整个编辑器黑屏、崩溃,任务管理器里UnrealEditor进程直接消…...

量子互联网:原理、挑战与未来应用

1. 量子互联网的技术本质与核心价值量子互联网并非传统互联网的简单升级,而是一种基于量子力学原理的全新通信范式。其核心在于利用量子纠缠这一独特物理现象,实现传统通信手段无法企及的功能。在传统互联网中,信息以经典比特(0或…...

Unity ShaderGraph设计思维:从示例资源读懂URP渲染管线

1. 这不是“示例资源包”,而是一套可复用的ShaderGraph设计思维训练集很多人点开Unity官方ShaderGraph示例资源(Samples for Shader Graph)时,第一反应是:“哦,又是一堆预设效果——水、玻璃、溶解、描边……...

Unity实现CS级FPS手感的四大底层契约与枪械物理精调

1. 这不是又一个“FPS入门教程”,而是一份被反复验证过的实战路线图很多人点开“Unity FPS教程”时,心里想的是:抄几段代码、拖几个预制体、跑通一个能走能跳的场景,就算交差了。我试过不下二十个标着“完整”“从零开始”的FPS项…...

Unity自定义碰撞与力场系统实战指南

1. 这不是“加个Rigidbody”就能解决的问题很多人在Unity里做物理交互,第一反应就是拖一个Rigidbody组件上去,再配个Collider,以为这就叫“用了物理引擎”。结果一跑起来:角色穿模、物体悬浮、力反馈生硬、粒子被撞飞得毫无逻辑……...

UE5.3与VS2022编译配置深度优化指南

1. 为什么UE5项目在VS2022里编译慢、报错多、改个头文件就全量重编?我第一次把团队刚升级的UE5.3项目拖进Visual Studio 2022时,整整等了17分42秒才完成首次编译——不是链接,是编译。中间还弹出6个“LNK2019未解析外部符号”、3个“C2039‘G…...

AssetRipper实战指南:Unity资源诊断与AB包健康度审计

1. 这不是“破解工具”,而是Unity开发者本该掌握的资源诊断能力 AssetRipper这个名字,第一次出现在我视野里,是在2022年一个Unity性能优化群里的深夜讨论。当时有位同事发来一张截图:某款上线半年的手游突然在iOS上出现纹理加载延…...