软件供应链安全是指在软件研发、交付和使用过程中,保障软件及其相关组件的安全性,防止恶意代码、漏洞等安全风险的侵入和传播。本文从供应链角度出发给出安全建议。
背景信息
软件供应链包括三个阶段:软件研发阶段、软件交付阶段、软件使用阶段,不同阶段的攻击面如下:
阶段 | 攻击面 |
软件研发阶段 |
|
软件交付阶段 |
|
软件使用阶段 |
|
在应用构建测试中,制品安全是您防御黑客攻击的第一道防线。一个不安全的、恶意构造的镜像可以让攻击者进行容器逃逸并获得对宿主机的访问权限。进入主机,攻击者就可以访问敏感信息或在集群内使用您的阿里云账户横向移动。在应用部署时刻,K8s原生的Admission准入机制可以帮助您有效验证部署实例的安全性。应用的成功部署并不意味着安全工作的结束,您需要在应用运行时刻实时监控业务应用安全,及时发现并处理运行时安全事件。
保证集群安全性建议
在Kubernetes环境中,遵循以下建议,以保证集群生命周期的安全性。
创建最小化的容器镜像
首先从容器镜像中删除所有无关的二进制文件。若使用的是来自Docker Hub的未知镜像,请使用Dive等应用程序检查该镜像,该应用程序可以向您展示每个镜像层的内容。更多信息,请参见Dive。
在将镜像推送到ACR(Alibaba Cloud Container Registry)后,ACR控制台中也会展示镜像中层信息。删除所有带有
SETUID
和SETGID
位的二进制文件,因为这些信息可用于提升权限,并考虑删除所有可用于恶意目的的Shell和应用程序,如nc
和curl
。您可以使用以下命令找到带有SETUID
和SETGID
位的文件:find / -perm /6000 -type f -exec ls -ld {} \;
要从这些文件中删除特殊权限,请将以下指令添加到您的容器镜像中:
RUN find / -xdev -perm /6000 -type f -exec chmod a-s {} \; || true
使用多阶段构建
使用多阶段构建是一种创建最小镜像的方法。多阶段构建可用于
CI/CD
流程中进行自动化的持续集成。多阶段构建指在Dockerfile
中使用多个FROM语句,每个FROM指令都可以使用不同的基础镜像,并且是一个独立的子构建阶段。使用多阶段构建打包应用具有构建安全、构建速度快、镜像文件体积小等优点。更多信息,请参见在Dockerfile中使用构建打包镜像并运行。为ACR仓库创建RAM策略
一个组织中的多个开发运维团队会使用同一个阿里云账户管理云资源。如果这些团队不需要共享资产,您可能需要创建一组RAM策略来限制每个团队可以访问的命名空间或者仓库。例如,
cr:ListInstance*
表示授予cr:ListInstance
开头的所有Action,设置acs:cr:*:*:repository/$instanceid/$namespace/*
为acs:cr:cn-hangzhou:1234567:repository/cri-123456/ns/*
,表示授予cn-hangzhou地域,账号ID为1234567的用户以下权限:查询ID为cri-123456的实例ns命名空间下镜像仓库的权限。{ "Statement": [ { "Effect": "Allow", "Action": [ "cr:ListRepository", "cr:GetImageLayer", "cr:GetRepoTag" ], "Resource": "*" }, { "Action": [ "cr:List*" ], "Effect": "Allow", "Resource": [ "acs:cr:cn-hangzhou:1234567:repository/cri-123456/ns/*", ] } ], "Version": "1" }
在ACR中配置RAM策略的方法,请参见RAM授权信息和配置使用自定义OSS Bucket时的RAM访问控制。
优先使用ACR企业版
ACR企业版支持云原生制品加密存储,支持镜像安全扫描及多维度漏洞报告,保障存储及内容安全。分别提供容器镜像和Helm Chart的网络访问控制管理,细粒度的操作审计,保障制品访问安全。建议生产环境优先使用ACR企业版,并将仓库访问策略默认置为私有,使用内网VPC域名进行访问,不打开公网访问入口,并配置ACL白名单控制访问来源。更多信息,请参见创建企业版实例。
使用ACR云原生应用交付链
通过容器镜像服务的云原生应用交付链功能,您可以自由组合镜像构建、镜像扫描、镜像全球同步和镜像分发等任务,提供全链路可观测、可追踪、安全防护能力。更多信息,请参见创建交付链。
ACR能在推送完成后自动进行镜像安全扫描,若您设置过安全阻断策略,其会识别镜像的安全风险并阻断高风险的容器镜像。只有通过安全策略的容器镜像才会进行交付链后续的分发和部署环节。交付链能保证容器应用的安全交付和高效部署。您也可以集成安全扫描的相关API,实现自定义周期的镜像安全扫描功能。
定期扫描镜像中的漏洞
与创建虚拟机使用的系统镜像一样,容器镜像同样包含带有漏洞的二进制文件和应用程序,或者随着时间的推移出现漏洞。因此,最佳的做法是使用镜像安全扫描工具定期对您使用的容器镜像进行漏洞扫描。可以在ACR中对新推送的镜像或者存量的镜像进行定期扫描(每隔24小时扫描一次)。应删除或重建具有
HIGH
或CRITICAL
漏洞的镜像。若已部署的镜像出现漏洞,应尽快更换。Kubernetes validation webhook
也可用于验证镜像是否存在严重漏洞。在使用Kubernetes API
之前调用validation webhook
,可用于拒绝不符合webhook
中定义的验证标准的请求。可以通过调用ACR提供的CreateRepoTagScanTask来确定Pod是否正在拉取具有严重漏洞的镜像。如果发现漏洞,则拒绝Pod的创建,并以事件形式返回带有CVE列表的消息。更多信息,请参见CreateRepoTagScanTask。将USER指令添加到您的Dockerfiles中并以非root用户运行镜像
如Pod安全部分所述,您应该避免以root身份运行容器。您可以将其配置为PodSpec的一部分,但在Dockerfile中使用USER指令是一个好习惯。当设置USER指令后,会以指定的用户运行RUN、ENTRYPOINT或CMD。
从可信软件源下载依赖包
在软件研发阶段,您应该尽量避免从不可信的软件源引用软件包。关于配置阿里云可信的镜像和软件制品源或者下载研发需要的软件包,请参见阿里云镜像站。
您可以使用阿里云云效搭建属于自己的软件仓库。云效制品仓库 Packages是阿里云出品的一款企业级私有仓库服务,提供基于Maven、Gradle、NPM等软件包管理工具的企业级私有仓库服务,用于管理企业级依赖托管。仓库支持管理Maven制品和NPM制品,并支持配置远程仓库,一键迁移现有私库。提供租户隔离、权限控制、高可用存储等服务,全面保障企业制品安全。具体操作,请参见在云效中使用自己搭建的私有Maven仓库。
使用镜像加签并配置验签策略
在应用部署时刻对目标镜像的安全性校验能够保证集群中只部署可信授权方签名的容器镜像,降低您环境中发生意外或恶意代码的风险。
阿里云容器镜像服务ACR支持镜像加签功能,保障镜像从分发到部署的全链路一致性,避免中间人攻击和非法镜像的更新及运行。ACR支持命名空间级别的自动加签,每次推送容器镜像后都会匹配加签规则自动加签,保障您的容器镜像内容可信。更多信息,请参见使用容器镜像加签。
在ACK集群中,您可以通过组件管理安装Kritis-validation-hook组件,组件在开源Kritis阿里云容器镜像服务ACR软件的基础上增加了对的深度集成,支持验证通过阿里云密钥管理服务KMS签名的容器镜像,实现自动验证容器镜像签名。更多信息,请参见使用kritis-validation-hook组件实现自动验证容器镜像签名、kritis、阿里云密钥管理服务KMS。
在开启镜像签名之后,您可以配置验签策略,只部署通过验签规则的可信镜像到您的ACK集群,并且支持配置验签规则的白名单,解决第三方组件自动注入的Sidecar容器的镜像无法通过镜像验签,导致无法部署Pod的问题。更多信息,请参见kritis-validation-hook组件介绍。
使用阿里云云安全中心
在云原生应用运行阶段,可实现基于云安全中心的应用运行时威胁检测与阻断,实时保障每个应用Pod的安全运行。云安全中心基于云原生的部署能力,实现威胁的数据自动化采集、识别、分析、响应、处置和统一的安全管控。利用多日志关联和上下文分析方案,实时检测命令执行、代码执行、SQL注入、数据泄露等风险,覆盖业务漏洞入侵场景。结合K8s日志和云平台操作日志实时进行行为审计和风险识别,实现容器服务和编排平台存在的容器逃逸、AccessKey泄露、未授权访问风险。更多信息,请参见什么是云安全中心。