前言

最近有在帮公司制作一个 OpenVpn Snap 安装包,然而频繁遇到了 Apparmor 错误,其实之前安装 Shadowsock 包的时候也见过,但是当时没怎么太认真探究,现在回看起来发现国内这方面的相关资料还是比较少的,本篇博文从介绍到实践由浅到深,帮助自己也帮助读者理解。

错误样例

$ sudo snap install easy-openvpn-server_0.2_amd64.snap --dangerous
error: cannot perform the following tasks:
- Setup snap "easy-openvpn-server" (unset) security profiles (cannot setup apparmor for snap "easy-openvpn-server": cannot unload apparmor profile: exit status 2
apparmor_parser output:
File snap-update-ns.easy-openvpn-server not found, skipping...
File snap.easy-openvpn-server.easy-openvpn-server not found, skipping...
File snap.easy-openvpn-server.hook.configure not found, skipping...
File snap.easy-openvpn-server.hook.connect-plug-firewall-control not found, skipping...
File snap.easy-openvpn-server.hook.connect-plug-network-control not found, skipping...
File snap.easy-openvpn-server.openvpn not found, skipping...
File snap.easy-openvpn-server.status not found, skipping...
File snap.easy-openvpn-server.tcp-server not found, skipping...
File snap.easy-openvpn-server.udp-server not found, skipping...
)
- Setup snap "easy-openvpn-server" (unset) security profiles (cannot unload apparmor profile: exit status 2
apparmor_parser output:
File snap-update-ns.easy-openvpn-server not found, skipping...
File snap.easy-openvpn-server.easy-openvpn-server not found, skipping...
File snap.easy-openvpn-server.hook.configure not found, skipping...
File snap.easy-openvpn-server.hook.connect-plug-firewall-control not found, skipping...
File snap.easy-openvpn-server.hook.connect-plug-network-control not found, skipping...
File snap.easy-openvpn-server.openvpn not found, skipping...
File snap.easy-openvpn-server.status not found, skipping...
File snap.easy-openvpn-server.tcp-server not found, skipping...
File snap.easy-openvpn-server.udp-server not found, skipping...
)
- Run configure hook of "easy-openvpn-server" snap if present (run hook "configure": cannot open directory /tmp/snap.0_easy-openvpn-server_XXXXXX: Permission denied)

什么是AppArmor?

1. 安全模型描述

在谈论一个具体的实现之前,避免不了需要了解一下较为完整的背景,AppArmor 作为 Liunx 安全模型中的点亮的某个技能树叉,从操作系统的权限管理与访问机制来入手是一个比较好的选择。其基础的权限管理与访问控制机制和加强的 ACL 机制、SELinux,都对这些安全模型与安全机制有所实现。

在 Linux 系统中,所有的操作实质上都是在进行进程访问文件的操作。在访问文件之前需要取得相应的权限,而权限是通过 Liunx 系统中的安全模型获得的。理论上进程所拥有的权限与执行它的用户权限相同。

1.1 BLP 安全模型

BLP 于 1976 年首次实现于 Multics 操作系统,该安全模型是一个状态机模型,有一系列错综复杂的数学证明来保证其安全性结果,它是定义多级安全性的基础,被视为基本安全公理

这个模型将信息系统中的实体分为两部分:主体(Subject)和客体(Object)。实时操作的成为主体,例如用户和进程;而被操作的对象则成为客体,例如文件和数据库等。对两者而言,有两种最重要的安全控制方法:自主存取控制强制存取控制

  • DAC:自主访问控制,最初的访问控制模型,DAC 机制就是指对象的拥有者可以任意修改或授予此对象的相应权限。从本体和客体的角度来说,就是主体对其拥有的客体,有权决定自己和其他主体对该客体应具有怎样的访问权限。熟悉 Chown 命令的应该很快可以联想到这段话的含义。它可以随意让某用户对其所有的文件或目录。可以配置 UGO(即:本用户,本用户组,其他用户)对该文件的 RWX 权限,Windows 的用户设计就是非常典型的 DAC 模式
  • MAC:这个不是 MAC 地址,而是强制访问控制的意思,该机制是指系统不再允许对象的拥有者随意修改或者授予此对象的相应权限。而是通过强制的方式为每个对象分别授予权限,有个经典机制 – SELinux

SELinux 是美国国家安全局(NSA)对于强制访问控制的实现,是 Linux 历史上最杰出的系统安全子系统。通过给系统所有用户、进程、文件分别赋予一个安全标记,通过安全策略规则来实施安全控制;只有安全策略允许的操作才能执行成功,安全策略禁止或者没有定制安全策略的操作则执行失败。

1.2 RBAC 安全模型

RBAC 是一种非常流行的访问控制机制,它通过分配角色来管理用户和系统权限,这种模型的核心思想是将权限分配给角色(Role),而不是直接分配给单个用户,从而简化了权限管理和审核过程。每个角色都具有预定义的权限(Permissions),当用户(Users)的需求发生改变时,将被分配到新的角色上。

RBAC 之所以以 “Roles” 为名 (Role-Based Access Control,基于角色的控制访问),是因为这个访问控制模型中,角色作为基本核心概念,其他元素,例如用户、权限和会话(Session)都是围绕角色来进行组织和管理的。角色在模型中起到了桥梁连接的作用,其中连接了用户和权限,从而简化了访问控制的管理和实施过程。

上述的 ”会话“ 值得是用户登录系统并激活一定角色的时间期间。在会话中,用户可以执行其角色所允许的操作。会话机制允许用户在不同的情景中切换角色。例如,一个用户可能同时拥有 ”DBA” 和 “DevOps” 的角色(直接管理员一把梭),但他可以选择仅在需要的时候激活特定的角色。

基于篇幅所限,这里就不更加展开说明模型的原理了,后续的 RBAC-1 建立在 RBAC 的基础模型上,在角色中引入了继承的概念,即增加了 Groups 这一”功能“,可以将其简单理解为给角色分成几个等级,用户关联角色组,角色组关联角色,角色关联权限,从而实现更细颗粒度的权限管理。继承这个概念也使得角色管理更加高效。例如,一个 “高级工程师” 可以继承 ”工程师“ 角色的全部权限,而又附加了其他权限。

而最新的 RBAC-2 引入了对角色分配的约束条件,主要用于强化安全政策和保证组织内部控制的有效性。这些约束条件包括但不限于:

  • 静态分离职责(SSoD): 静态职责分离是通过设置角色之间的相互排斥约束来实现的,这意味着某些角色不能由同一个用户拥有,从而防止权限的滥用,例如一个负责资金审核的用户不应当同时拥有财务支付的权限,这种类型的职责分离有助于提高系统的安全性,确保关键任务的透明度和问责性
  • 动态分离职责(DSoD):动态职责分离则关注与实时的权限控制,意在限制用户在特定情况下可用的权限。这种策略根据用户的实际操作环境(例如时间、地点和正在进行的特定任务)动态调整其权限。DSoD 也可以用来防止在特定情况下的权限冲突,例如在特定时间对于敏感数据的限制访问
  • 基数约束:对可以分配给特定角色的用户数量进行限制。例如只允许有一个用户担任 ”管理员” 这个角色
  • 先决条件角色:需要先担任某个角色,才能被分配另一个角色,这可以用于确保用户具备必要的经验或者资格

此外,模型还涉及到了 NIST 定义的四个层级,用于描述权限的分配和继承,即 Flat(平面)、Hierarchical(层级)、Constrained(受限)、Symmetric(对称),具体的详细说明可以从下面的 参考来源 - 1 进行阅读。

1.3 MLS 多级别安全模型

小试牛刀:用样例场景探究AppArmor作用

另外一个案例:使用AppArmor限制Docker容器

AppArmor联动K8s:限制容器对资源的访问

浅学Apparmor配置文件语言

SELinux的复习

参考来源

  1. 《Role-Based Access Control for a complex enterprise》 - Barbara Hoffman