补充:关于Linux现有的文件访问控制机制,如DAC(Discretionary Access Control)等机制,其基本模型都可以现有的访问控制策略主要包括三个角度:隔离、沙盒、用户态实现。
在隔离角度,主要的技术手段包括:chroot、namespace、虚拟化等技术手段。其主要原理是通过隔离手段创建独立封闭的运行环境,使其造成的影响不会扩散到原来的宿主环境。
在沙盒角度,主要技术手段包括:Linux的DAC机制、MAC、SCI、seccomp-bpf、Capsicum和LD_PRELOAD等技术手段。简单介绍如下:
①Linux的DAC机制实现用户级别粒度的访问控制,其基本模型都可以分为三部分:主体(subject),客体(object)以及规则(policy)。基本流程是主体对客体发出行为,控制程序将该行为与policy进行匹配,进而决定下一步操作。
②MAC机制能够实现程序级别的粒度控制,但它要求对所有要指定规则的ELF都进行深入分析,并且需要超级权限,这两个方面都很不用户友好。
③SCI的方式基于系统调用进行访问控制,但其依赖于ptrace的方式带来了较大的开销,并且基于系统调用的粒度还是太大,并且无法涵盖所有文件请求,基于SCI的程序还需要在用户态维护内核文件状态,实现繁琐且存在并发和同步问题。
④Seccomp-bpf框架允许了运行时指定检查规则,但使用seccomp-bpf的使用需要很高的技术门槛,并且它并不支持完全的动态,一旦安装无法卸载,此外seccomp-bpf也只能基于系统调用,粒度较大,并且seccomp-bpf只能基于原生的参数检查,例如fd的数值,而不是fd对应的具体文件名。
⑤Capsicum机制能够打破只基于系统调用的局限,对某个具体的资源做出访问控制,但这需要对原执行代码进行修改。这意味着使用该机制对运行某个不可信的代码来说是不透明的,使用起来具有很大局限性。
⑥LD_PRELOAD技术是一种通过重载C语言库函数来实现特定检查规则制定的轻量级技术。通过LD_PRELOAD的重载可以对执行系统调用前先做检查。但这种基于用户态重载函数的技术是很容易被绕过或者被劫持的,并且并不是所有的方式都会经过C语言函数库。
在用户态实现的角度,主流的访问控制方式包括基于FUSE的用户态文件系统。FUSE提供了在用户态定制文件系统的方式,这使得用户可以在用户态定制文件系统的同时加入检查规则。但基于FUSE的用户态文件系统的方式,由于其文件请求会经过用户态内核态的多次切换形成很长的调用链,使得其性能开销特别大。
eBPF 是一项革命性的技术,起源于 Linux 内核,可以在特权上下文(如操作系统内核)中运行沙盒程序。它用于安全有效地扩展内核的功能,而无需更改内核源代码或加载内核模块。eBPF prog可以被加载到kernel中的指定路径,当经过该路径时便会执行该eBPF prog。基于此,eBPF为我们提供了强大观测能力,可以观测应用程序的运行时行为以及系统状态;eBPF 常用于编写网络程序,对packet进行过滤;限制进程使用的系统调用;调试内核和进行性能分析。基本原理如下图:
eBPF有诸多前端工具,如bcc,bpftrace,cillium(Go),libbpf C/C++ library。本项目目前已完成的版本选用的是libbpf C/C++ library,正在逐步转到cillium。使用libbpf以及cillium编写eBPF 程序时,首先编写eBPF prog,经LLVM以及Clang编译成字节码。然后再由libbpf或cillium编写的用户态程序将其加载到kernel,挂载到正确的hook点。这些前端工具实际上底层都是对bpf syscall的封装,如图
Serverless,即无服务器计算,它是一种云执行模型,云服务商会在模型当中根据执行特定代码段所需要的计算资源与存储进行动态资源分配和计费。许多云提供商提供FaaS(Function as a Service,Serverless的一种)作为使用驱动、无状态(无服务器)后端服务的接口,为开发基于云的应用程序提供了一个直观的、基于事件的界面。
与传统的云接口相比,在FaaS中,用户不会明确地获得虚拟机或容器,也不会为他们不使用的资源付费;用户只需将其功能的代码上传到云端,函数在被事件“触发”或“调用”时执行,例如收到消息(例如HTTP请求)或计时器结束;服务端需要使用最少的资源向用户提供最高的性能,然后根据用户函数的实际运行进行收费。
要使函数要达到高性能,低开销需要考虑的是根据不同函数需要的资源和被调用的频率(若是HTTP请求等,该值可能是动态变化的),将部分函数的代码和需要的库被装载在内存中(热启动)。
Serverless环境也要使用服务器,只是用户无需承担服务器管理工作。目前,在主流FaaS平台中,仅有阿里云函数计算FC和Amazon Lambda指明了Linux环境,分别为:
<style> .center { width: auto; display: table; margin-left: auto; margin-right: auto; } </style>操作系统 | 架构 |
---|---|
Debian 10 | x86_64 |
Debian 9 | x86_64 |
阿里云函数计算FC
映像 | Linux 内核 | |
---|---|---|
Amazon Linux 2 | 自定义 | 4.14 |
Amazon Linux | amzn-ami-hvm-2018.03.0.20220802.0-x86_64-gp2 | 4.14 |
Amazon Lambda
而华为云FunctionGraph、微软Microsoft Azure、谷歌Google Cloud Functions、IBM Bluemix/OpenWhisk、腾讯云 云函数SCF均未将它们的Linux服务器的详细环境信息直接告诉用户。访问控制列表(Access Control List)是由一条或者多条规则组成的集合,用于指定授予或者拒绝哪些用户或系统访问特定对象或者特定系统资源的规则列表。具有灵活性高,安全性强等优点。
ACL常被安装于路由器或者交换机中,以报文的源地址、目的地址字段,端口号,协议,方向等作为规则,设备会基于规则对行为进行匹配,决定是拦截还是放行或者其他业务操作。
现有的产品中,如华为和阿里云等厂商的交换机都应用了网络ACL来实现网络控制功能,简单而言,可用来实现登陆控制,提供安全访问,防止网络攻击,识别流量从而提高网络带宽利用率,负载均衡等功能;同理,Linux中常见的防火墙iptable,也是在Netfilter中应用了ACL规则,从而实现流量过滤等功能。
相较于传统的网络ACL,本项目BoesFS是将ACL与eBPF技术结合,并应用于文件访问控制,从而达到细粒度的资源访问控制,以及低开销的目标。