运行时安全监控与审计
监控和审计机制是用来保证服务安全性
的常用手段,下面将介绍在容器环境下如何做安全监控和审计。1. 运行时监控 有别于传统环境,为了保证容器的稳定运行,在容器环境下需要从主机、容器实例、镜像等多个层面进行监
控审计。
(1)主机监控
主机监控基本就是传统主机监控的范围,通常可以包括主机的操作系统
信息、CPU 信息、内存信息、进程信 息、文件系统信息、网络状态等信息。主机的监控在运维体系中相对比较成熟,也有很多的开源工具进行实现, 比如 Performance Co-Pilot[^1] 、Icinga[^2] 、Munin[^3] 等,本文不再赘述。(2)容器实例监控
容器实例的监控通常包括主机上容器的基本信息(容器 ID、镜像名称、创建时间、状态、端口信息、容器名等), 容器的 CPU 使用量、内存使用量、块设备 I/O 使用量、网络使用情况等资源使用信息。具体可使用 docker stats 查看相关信息,如下所示。
docker stats 9d83d3116584
CONTAINER ID NAME CPU% MEM USAGE/LIMIT MEM% NET I/O BLOCK I/O PIDS 9d83d3116584 dev_proxy_1 0.00% 14.86MiB/125.9GiB 0.01% 286MB/286MB 14.3MB / 8.19kB 25
- 恶意行为监控
(1)容器监控
攻击者可利用应用程序的漏洞、错误配置进入容器,然后以这个容器为跳板,对内部网络进行探测,进而发 现其它容器或者宿主机的进程和文件系统中的弱点来加以进一步
利用和攻击。相应的保护方法是需要实时监控容 器内可疑进程(如端口扫描进程和反向 Shell 进程等)。具体包括:容器进程监控
被恶意攻击占领的容器会启动非法进程,例如数字货币挖掘软件或网络端口扫描等恶意进程,目前观察到这 类恶意攻击的行为在容器环境下的趋势越来越明显。
考虑到轻量级
的容器环境中,通常每个容器中运行一组数量有限且明确定义的正常进程,这些进程都是相对 稳定和一致的,因而进程级别的白名单安全策略可以有效检测和阻止异常或恶意进程。具体进程监控可以有如下几种方式。
- 扫描 /proc 目录
/proc 是 Linux环境下的一个虚拟文件系统。对于每一个运行的进程,在 /proc 目录下都有相对应的以进程 ID命名的目录。目录中的一系列文件反映了运行进程的信息。比如,每一个进程的目录里面一般会有如下文件或 目录:
- /proc/pid/cmdline:进程运行的命令行参数;
- /proc/pid/cwd:进程的当前运行目录;
- /proc/pid/environ:进程的环境变量;
- /proc/pid/fd:目录中包括进程运行时打开文件的文件描述符;
- /proc/pid/maps:进程使用的执行文件、库和内存的映射信息;
/proc 目录中还有其它的文件提供更多的进程相关信息。通过对 /proc 目录的扫描,我们就可以对系统和容 器运行的进程有一个详细的了解。
-
通过 netlink soc
ket 监视进程活动扫描 /proc 目录虽然可以获取进程的详细信息,但是如果系统中进程比较多,反复读取文件系统就会产生不 必要的开销。如果能够在进程状态发生变化的时候,从系统中得到实时地通知,从系统资源利用和响应速度角度 考虑都是一个更好的解决方案。
Linux 系统恰好提供了这样一种异步通知的机制,这一机制是通过 netlink 消息来实现的。netlink 消息是 Linux内核与用户环境通讯的一种机制,和系统调用(syscall)、输入输出控制(ioctl)等其它通讯机制相比, netlink 对 Linux内核的影响较小,易于开发维护;用户层的编程界面使用的是 socket 的流程,而且提供了广播 和组播的功能,多个进程可以同时获取内核的状态变化。这些都是其它通讯机制难以比拟的优势。
netlink socket 使用的是 AF_NETLINK地址族。若要获取进程信息,需要在打开 socket 的时候指定 NETLINK_CONNECTOR协议,然后发一个 netlink 消息订阅进程活动报告即可。通过指定不同的协议号,用户层 程序还可以监视内核中路由、ARP 和 iptables 等关键组件的行为。 -
使用系统性能分析工具 perf 获取进程活动信息
Perf event 最初的用途是为了调试和诊断 Linux内核及应用程序的性能。它提供了极为广泛的系统行为参数 的汇报和统计。其中包括系统硬件事件,比如 CPU 时钟、流水线指令执行、中断等事件的分析和软件行为,比 如进程切换、内存、文件和 socket 操作等事件的报告。
对于进程有关的事件,perf event 提供了 PERF_RECORD_FORK,PERF_RECORD_EXIT事件的记录报告。 Perf event 的报告既可以获取事件计数的统计值,又可以通过 mmap 分配的共享内存使用取样方式读取事件的详 细信息。在使用 perf event 获取系统信息的时候,应当事先对事件在常态和极端条件下(比如被攻击的时候)发 生的频率进行详细的分析,尽量避免漏报或资源溢出的情况发生。 -
eBPF
eBPF 的全称是 extended Berkeley Packet Filter。它的强大之处在于允许用户以一定语法书写的程序可以在 运行时放入内核,在指定事件发生时触发运行。内核对放入的程序进行检查,确保不会产生死循环和越界操作。 设计之初 eBPF 只是用来过滤网络包,但是由于其功能强大、安全高速,在新的内核中 eBPF 的功能逐渐增强。 使用 eBPF 不但可以控制网络流,还可以过滤系统调用,提高系统监测调试的性能。
eBPF 可以与 perf event 或者 netlink connector 协同使用,监控系统进程的活动。这不但大幅度提高了检测 软件的性能,也使得准确度得以提升
容器文件系统监控
攻击者可以伪装或者利用开源软件库 / 软件包,开发者在不经验证导入后可被容器进程加载,这些恶意软件 包甚至可以篡改容器系统的敏感文件。一旦成功,就可以尝试将自身权限升级到 root 来进行进一步的感染。例如, 近期发现的 SSH 开源库中包含偷窃用户密码的恶意代码,该开源库多年来已经被大量应用在很多商用软件和容 器当中。
因而,容器安全系统需要实时监控文件系统的变化,保证重要系统文件的一致性。此外应自动触发漏洞扫描 并生成警报。
容器数据盗窃
攻击者通常通过一系列的技术窃取容器中的数据,这些技术包括建立反向 Shell 来接收和挖掘数据、加密和 隐藏发送机密数据等。传统的 DLP技术无法有效防护容器数据安全,安全系统需要使用新一代容器 DLP技术、 实时监控容器的行为,甚至分析攻击链事件异常来侦测此类数据窃取。
(2)主机监控
主机监控是容器安全中的重要部分,因为运行容器的主机同样存在影响容器安全的风险,比如权限提升、突 破容器主机隔离等攻击。此外,容器中的可疑行为也有一定机会在主机被检测到。例如,如果容器中的端口扫描 或反向 Shell 进程开始运行,主机安全系统应该能检测到网络和进程行为异常,可实时告警响应。
运行容器的主机本身可能会受到各种新型的来自容器层面的攻击。例如,DirtyCow[59]的 Linux内核漏洞使用 户能够从容器升级到主机的 root 权限。进而从容器逃逸到主机节点,严重影响整个容器运行环境安全。
(3)镜像监控 作为容器的运行基础,还需要对主机上保存的容器镜像进行监控,防止镜像被恶意篡改(比如修改暴露端口、病毒木马植入等)。容器镜像的监控信息一般为静态信息,通常包括镜像数量、镜像 ID、镜像名称、版本、大小、 构建历史信息以及暴露端口等。可以通过 docker images inspect containerid 进行查看镜像当前信息,再与历史 信息进行对比寻找可疑变化。
- docker image inspect c8c29d842c09
[
{
“Id”: “sha256:c8c29d842c09d6c61f537843808e01c0af4079e9e74079616f57dfcfa91d4e25”, “RepoTags”: [
“nginx:1.9”
],
“RepoDigests”: [
“nginx@sha256:54313b5c376892d55205f13d620bc3dcccc8e70e596d083953f95e94f071f6 db”
],
}
……
]
(4)系统容器的监控
容器平台拥有大量的辅助 / 管理容器实例,这些容器是特殊的系统容器,拥有更高的权限以及更多、更 复杂的通信方式和行为。系统容器本身的安全性也十分重要。2018 年初发现的 Tesla[60] 容器安全事件,就
是 Kubernetes 的系统管理界面被黑客入侵,从而被利用部署埋藏了数字货币挖矿的容器来牟利,而且导致 Kubernetes 管理的 Tesla 的技术数据被大量暴露。所以容器安全系统还需要监控系统容器的网络以及行为。
- 配置审计
在 4.6.1 节中介绍了在容器启动时建议的一些安全配置,那么需要在容器运行时对这些信息进行监控、审计, 确保其安全性。
docker inspect 命令可以查看镜像或容器实例的底层详细信息,以此来了解镜像或容器的完整构建信息,用 以实现在安全上的审计功能。具体包括了基础配置,主机配置、网络配置、状态信息等。
比如可以通过采用如下命令,审计容器暴露端口情况:
- docker ps --quiet | xargs docker inspect --format ‘{{.Name}}:Ports = {{.NetworkSettings. Ports}}’
/floodlight.1.xqcd9jio5p0j4jax56a0sz5uc:Ports = map[4200/tcp:[] 6633/tcp:[] 6655/tcp:[] 8081/tcp:[] 9001/tcp:[]]
另外,可以借助一些开源的配置核查项目来进行配置检查,如可使用 docker-bench-security(详见 5.1.5 节) 来进行配置参数核查。
- 镜像脆弱性评估
从镜像的整个生命周期来看,包括“镜像构建”→“上传至镜像仓库”→“获取镜像到本地主机”→“运行 容器实例”。那么在本地的容器主机,就包含了镜像和容器实例,因此在运行中需要对本地镜像和运行的容器进 行脆弱性评估,确保其安全性。
镜像的脆弱性评估手段可以参见 4.4.3 节的镜像扫描,Docker 镜像扫描器数据库存储镜像 BOM的细节和每 个组件的漏洞状态。当一个新的漏洞报告给 CVE数据库,Docker 镜像扫描器将会在数据库中查看哪个镜像相关 的包会受到影响然后推送通知管理员,以便管理员及时对镜像进行修补更新。容器实例的脆弱性评估手段可以借 助于云环境中使用的扫描器进行。