1.前言得物服务早期主要运行在ECS上。随着容器技术的成熟,容器在降本增效、易部署、灵活等方面的优势开始显现。目前,得物已基本完成全球容器化,容器已成为支撑得物技术发展的重要基础设施。随着基础设施的变化,业务在集成、交付、编排等方面将与以往有很大不同,同时也会带来新的安全风险。如何发现和应对这些新的安全风险,本文将从技术和实践两个角度与读者分享和交流。2.容器是基础设施。容器化应用大致可以分为两部分:构建时和运行时。2.1容器虚拟化技术与其他虚拟化技术的主要区别容器是典型的“操作系统级虚拟化”,它没有独立的虚拟硬件,不需要安装guestOS,这是它与其他虚拟化的主要区别技术。全虚拟化:服务器操作系统上会有一层hypervisor来实现虚拟化,然后hypervisor对虚拟硬件进行虚拟化,用户在虚拟硬件上安装guestOS。典型如:vmwareworkstation、kvm。裸机:没有服务器操作系统,只有管理程序。开机后,系统启动BIOS后直接启动到hypervisor,将硬件的控制权交给hypervisor,hypervisor将虚拟硬件虚拟化,用户在虚拟硬件上安装guestOS。典型如:vmwareESXi。操作系统级虚拟化:多个容器共享一个内核,没有独立的虚拟硬件,也不需要安装guestOS,通过cgroups和namespaces在容器之间实现资源限制(例如:限制一个容器的CPU和内存阈值)container)和资源隔离(例如:不同容器中的应用程序可以绑定同一个端口,不同容器中ps看到的进程列表都是从1开始的。从容器中的应用程序来看,似乎是独占到这个端口是同一台机器)。典型例子:docker、lxc、openVZ。2.2Linux运行镜像结构基础知识首先需要掌握两个基础知识:Linuxbootfs和rootfs要启动并运行一个Linux系统,至少需要两个文件系统:bootfs:包括boot-loader、kernel和grub。bios通过后,bios会拉起内核(bootfs),将硬件的控制权交给操作系统。用户一般不会修改bootfs,但也有例外,比如编译内核,用新内核启动等。rootfs:包含经典的Linux目录结构:不同的系统组件、应用程序、lib文件、配置文件都包含在rootfs中。Linux不同发行版的差异主要集中在rootfs上。镜像文件结构基础对于同一主机上的不同容器,内核在容器之间是共享的,但是每个容器中包含的分布和应用可以不同,也就是说:bootfs是一样的,但是rootfs是可以不同的.我们通过dockerfile构建不同的镜像,其实就是在控制rootfs的内容,让不同的容器可以运行不同的程序。dockerhub上有很多基础镜像,我们可以在基础镜像的基础上叠加自己的应用,然后生成新的镜像。其实我们在使用dockerfile构建新镜像的时候,就是在基础镜像的基础上再增加一层,即layer。该层包含了与你的应用相关的内容,比如:你的应用、配置文件、环境变量等。分析实例这里以一个docker镜像为例进行说明。首先通过dockerpull命令拉取一个镜像,然后使用dockersave命令将镜像保存为tar.gz文件,最后解压tar.gz得到镜像中的文件列表。拉取镜像:M-C02G8E3AML7H:docker_imageadmin$dockerpullneuvector/scanner:latestlatest:Pullingfromneuvector/scanner213ec9aee27d:Alreadyexistscd33442680d5:Pullcomplete867cbf496ec6:Pullcompleteaddb7fe17473:PullcompleteDigest:sha256:4f2679a8066dec6879d96504d11d880e08180a57fbe3f97176398bc049ee84ebStatus:Downloadednewerimageforneuvector/scanner:latestdocker.io/neuvector/scanner:latestM-C02G8E3AML7H:docker_imageadmin$保存并解析镜像:M-C02G8E3AML7H:docker_imageadmin$dockersaveneuvector/scanner:latest|gzip>test.tar.gzM-C02G8E3AML7H:docker_imageadmin$ls-lhtotal229504-rw-r--r--1名管理人员103M11月23日11:42test.tar.gzM-C02G8E3AML7H:docker_imageadmin$tar-zxvf测试.tar.gzM-C02G8E3AML7H:docker_imageadmin$ls-ltotal229528drwxr-xr-x5adminstaff160Nov2118:391288696addccc4013c5bcf61c1b6c38128a7214a0942976792918b51912d90f7drwxr-xr-x5adminstaff160Nov2118:394261ff25d711bed03d33a361482aeacff23027596d9d1c18f7223e1c4c87b42c-rw-r--r--1adminstaff3102Nov2118:39506daeaa7d07016f020a80cab3a6a8dc1a25551ff2a50e820183f0c255215ea4.jsondrwxr-xr-x5adminstaff160Nov2118:39a1d413f6ea27d0e515f450d103ecec4a8e63564d47cbf156a09e118709399a5ddrwxr-xr-x5adminstaff160Nov2118:39f8ce18fff435609b86079966a73814c1fe976422930ad0e6b3d27725baff4bab-rw-r--r--1名管理人员4441970年1月1日manifest.json-rw-r--r--1名管理人员1001970年1月1日repositories-rw-r--r--1名管理人员10836445111月2311:42test.tar.gzM-C02G8E3AML7H:docker_imageadmin$分析镜像:从manifest.json可以看出,镜像由4层组成第一层,即1288696addccc4013c5bcf61c1b6c38128a7214a0942976792918b51912d90f7/layer.tar解压后的内容如下,可以看出都是最基本的,比如cp,基本库:(由于篇幅原因,只解压出部分文件列表自此层.tar显示)M-C02G8E3AML7H:1288696addccc4013c5bcf61c1b6c38128a7214a0942976792918b51912d90f7admin$tar-zxvflayer.tarxbin/xbin/busyboxxbin/catxbin/cpxbin/datexdev/xetc/xetc//motabxetc//motabxshadowxetc/udhcpd.confxhome/xlib/xlib/libc.musl-x86_64.so.1xlib/libcrypto.so.1.1xlib/libssl.so.1.1xlib/libz.so.1xlib/libz.so.1.2.12xmedia/xmedia/cdrom/xmedia/floppy/xmedia/usb/xmnt/xopt/xproc/xroot/xrun/xsbin/xsrv/xsys/xtmp/xusr/xusr/bin/xusr/bin/awkxusr/bin/basenamexusr/bin/bcxusr/bin/beepxusr/bin/blkdiscardxusr/lib/xusr/lib/libcrypto.so.1.1xusr/lib/libssl.so.1.1xusr/local/xusr/local/bin/xusr/local/lib/xusr/local/share/xusr/sbin/M-C02G8E3AML7H:1288696addccc4013c5bcf61c1b6c38128a7214a0942976792918b51912d90f7admin$第二层,即f8ce18fff435609b86079966a73814c1fe976422930ad0e6b3d27725baff4bab/layer.tar解压出来的内容如下:M-C02G8E3AML7H:f8ce18fff435609b86079966a73814c1fe976422930ad0e6b3d27725baff4babadmin$tar-zxvflayer.tarxetc/xetc/neuvector/xetc/neuvector/certs/xetc/neuvector/certs/internal/xetc/neuvector/certs/internal/ca.certxetc/neuvector/certs/internal/cert.keyxetc/neuvector/certs/internal/cert.pemxglibc-2.33-r0.apkxlicenses/xlicenses/EULA.pdfxusr/xusr/local/xusr/local/bin/xusr/local/bin/.nvcontainerM-C02G8E3AML7H:f8ce18fff435609b86079966a73814c1fe976422930ad0e6b3d27725baff4babadmin$第三层,即f40081c28f00b0f31720fad1c99acaee5186173be08f060ac420f5358a870e16/layer.tar解压出来的内容如下:(因篇幅原因,只展示该layer.tar解压出来的部分文件列表)M-C02G8E3AML7H:a1d413f6ea27d0e515f450d103ecec4a8e63564d47cbf156a09e118709399a5dadmin$tar-zxvflayer.tarxetc/xetc/ld.so.cachexetc/nsswitch.confxetc/ssl/xetc/ssl/certs/xetc/ssl/certs/ca-cert-ACCVRAIZ1.pemxetc/ssl/certs/ca-cert-AC_RAIZ_FNMT-RCM.pemxlib/xlib/ld-linux-x86-64.so.2xlib64/xlib64/ld-linux-x86-64.so.2xusr/xusr/share/ca-certificates/mozilla/vTrus_ECC_Root_CA.crtxusr/share/ca-certificates/mozilla/vTrus_Root_CA.crtM-C02G8E3AML7H:a1d413f6ea27d0e515f450d103ecec4a8e63564d47cbf156a09e118709399a5dadmin$第四层,即4261ff25d711bed03d33a361482aeacff23027596d9d1c18f7223e1c4c87b42c/layer.tar解压出来的内容如下:M-C02G8E3AML7H:4261ff25d711bed03d33a361482aeacff23027596d9d1c18f7223e1c4c87b42cadmin$tar-zxvflayer.tarxetc/xetc/neuvector/xetc/neuvector/db/xetc/neuvector/db/cvedbx/localusr/xusr/localusr/xusr/xusr/local/bin/monitorxusr/local/bin/scannerxusr/local/bin/scannerTaskM-C02G8E3AML7H:4261ff25d711bed03d33a361482aeacff23027596d9d1c18f7223e1c4c87b42cadmin$可以看到解压后的文件从第一层ash到第三层的依赖库都是、配置文件、证书等从第四层开始解压,也就是最终的应用。3、新技术带来的挑战与以往的ECS部署方式相比,容器部署方式带来了诸多优势:降本增效、资源隔离、资源受限、易于部署。但是新引入的基础设施,如:镜像仓库、mirror/dockerfile、k8shost、k8s、dockerruntime、container,也会带来新的安全隐患,如:镜像投毒、不安全镜像、k8sHost/k8s/dockernon-合规、k8shost/k8s/docker高危漏洞、容器逃逸等3.1镜像投毒什么是镜像投毒?众所周知,docker的一个优点是开箱即用。比如:我想要一个mysql环境。在docker之前,我们一般都是先找一台机器,然后安装mysql,改配置,最后启动。现在不用这么干了,直接拉一个mysql镜像,然后运行容器,两条命令就可以了。是不是很有效率?也正是因为这种“开箱即用”带来的便利,我们很少有人会在下载完镜像后检查是否安全,大部分开发同学都是直接使用。黑客会通过推测和利用开发者的心理活动,将一些带有漏洞、病毒、后门、挖矿程序的镜像上传到dockerhub。此过程称为图像中毒。只要下载有毒图像并创建容器,就会在不知情的情况下引入安全风险。下面举几个例子:例1:黑客在镜像中安装了挖矿程序,并设置为自动运行,然后你就在不知不觉中成为了黑客的矿机。示例2:黑客在镜像中安装后门程序并设置为自动运行,那么黑客就可以随时随地控制你的容器,更严重的是,他甚至可以通过一些高危漏洞逃出容器,进一步控制你的主机机器。想想就毛骨悚然。怎么破?下载有OFFICIAL标志的,说明已经通过官方认证。同时,做好定期镜像风险扫描,及时发现和排除安全隐患。如果找不到带有OFFICIAL标志的那一款,可以查看STARS数量,选择STARS数量最多的一款。3.2不安全的镜像可能存在弱点:漏洞、病毒/木马/后门、敏感信息泄露、弱口令、dockerfile不合规等安全风险。有些弱点是系统自带的(例如:python运行时漏洞),有些弱点是我们自己不经意引入的(例如:使用不安全版本的fastjson、毒图携带的病毒、敏感信息明文等).),新报告了一些漏洞。3.3k8shost/k8s/docker不合规什么是合规?可以理解为“符合规范”,符合国家(国家标准)或行业(行业标准)对网络安全的规范要求。k8s主机基本使用linux系统,所以可以采用linux级别保护L2/L3的检测规范。k8s/docker大多使用CISbenchmark。Docker参考:https://www.cisecurity.org/benchmark/dockerk8s参考:https://www.cisecurity.org/benchmark/kubernetes3.4k8shost/k8s/docker高危漏洞是软件,难免会有是漏洞。无论是操作系统内核,还是组件库,还是应用程序。k8s&docker的安全漏洞:3.5容器逃逸什么是逃逸?简单地说:容器获得了它不应该拥有的容器主机系统资源的访问权限。由于Linux内核命名空间机制的限制,容器中的应用程序无法访问宿主机的系统资源(进程、/proc、网络信息、文件系统等)。但是,通过一些漏洞或者错误配置,容器可以逃逸,相当于提权,危害可想而知。4.如何应对这些新的安全挑战,大致可以分为构建时和运行时两个部分。4.1本阶段建设涉及的资产主要包括镜像仓库和镜像。主要目的是确保:(1)无高危易利用漏洞(2)无病毒/后门/木马(3)合规性(4)无敏感信息泄露(如明文密码、token)(5)无弱密码配置登陆实践:镜像扫描器与镜像仓库链接。当图像被推送时,图像将被实时扫描。对镜像存储库中的所有镜像执行每日定期扫描。在核心安全能力方面:提供漏洞扫描能力。支持Web漏洞和系统漏洞检测。提供病毒/木马/后门扫描能力。支持检测Linux病毒和Windows病毒。提供敏感信息检测能力。提供弱口令检测能力。提供IaC检测能力。支持dockerfile和k8syaml的安全扫描。4.2Runtime本阶段涵盖的资产主要包括k8s主机、k8s&docker、容器。主要目的是保证:1.能加固的都尽量加固。包括:漏洞、不合规项、弱口令2、要能够及时发现黑客入侵。为什么有这两个目的?在黑客上门攻击之前,我们应该尽可能地加强系统,以增加黑客攻击的难度;如果黑客闯入,黑客肯定会执行一些命令。一般来说,黑客在渗透攻击阶段会有以下典型行为,通过黑客事先的行为建模,只要用户在系统上的行为落在“黑客行为模型”内,就判断为一种入侵行为。整体运行时框架:在每台k8s主机上,都会以daemonset方式启动一个安全容器,挂在k8s下。两个引擎在这个安全容器内运行:引擎1:基线检测引擎。主要负责漏洞扫描、合规检测、本地爆破。最终目的是为操作学员提供系统强化的基础。同时,该引擎还支持on-the-flySCA(SoftwareComponentAnalysis),能够根据软件供应链漏洞快速梳理出受影响的容器资产,应对频发的软件供应链安全事件。引擎2:入侵检测引擎。主要负责收集系统上的关键指标(进程信息、进程树、文件更改事件、网络连接、fd、历史命令、用户登录等),然后由平台侧的Flink任务进行预处理,以及最后进行模型匹配。最终目的是发现黑客行为,为及时止血提供线索。由于是部署在k8s宿主机上,所以安全容器需要有很高的稳定性,避免资金流失。稳定性方面:以并行容器的形式托管在k8s下,通过Linuxnamespace和cgroup实现资源隔离和资源限制。cpu使用率通过k8s睿频技术动态分配,例如:reqeust=0.02climit=2c,安全容器默认只占用0.02c,当业务容器不使用cpu时,安全容器可以使用一个此时最大2ccpu;当业务容器需要CPU资源时,安全容器会主动释放CPU时间片。版本更新是用k8s框架实现的。灰度升级时使用nodeSelect+marking,实现批量升级。完善监控指标,达到阈值后触发告警。定期进行稳定性演练。5.反映和总结一般准则。围绕“重检测、轻管控、快反应”九字方针开展工作,在效率和安全之间寻求平衡,在保护业务的同时,尽可能少地影响业务。打击安全能力。攻防是一个不断博弈和对抗的过程。每年都会出现新的威胁和新的攻击方法。通过定期实战演练(如:红蓝对抗、白帽渗透测试)来检验安全能力的水位。跳出容器看容器,多方面思考和学习,才能得到理想的结果。如果你不知道如何进攻,你怎么知道如何防守?其实反之亦然:不知道防守,怎么知道进攻。最后就是攻守兼备,才能在自己的认知范围内做到最好。
