前言

最近有在帮公司制作一个 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 权限。
  • MAC:这个不是 MAC 地址,而是强制访问控制的意思,该机制是指系统不再允许对象的拥有者随意修改或者授予此对象的相应权限。而是通过强制的方式为每个对象分别授予权限,有个经典机制 – SELinux

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

1.2 RBAC 安全模型

1.3 MLS 多级别安全模型

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

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

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

浅学Apparmor配置文件语言

SELinux的复习