青藤:容器镜像的安全备忘单(Cheatsheet)

发布时间:2022年05月11日
       容器镜像构成了云原生环境中的规范运用交给格局, 依据容器镜像广泛散布和布置的特性, 需求一套最新的安全实践来保证镜像的完整性。经过镜像扫描来查看操作体系和软件言语包中是否有缝隙, 这是保证镜像安全的柱石。了解容器镜像生命周期中每个阶段的说话, 有助于了解应该构建和运用怎样的镜像, 然后加固和进步企业的安全态势。镜像的构建安全根底设施安全假如容器镜像中包含歹意软件, 在运转时就会构成直接要挟。因而, 构建阶段根底设施的安全性与出产环境中的安全性平等重要, 能够避免将外部缝隙引进镜像傍边。在构建和继续集成阶段, 能够采纳以下这些方法来保证镜像安全:•约束对构建根底设施的拜访。•只敞开必要的网络进口。•细心办理secrets,

只颁发最小权限。•细心查看从第三方网站拉取的源文件或其他文件, 经过网络防火墙约束只要受信赖网站在白名单拜访之列。•保证镜像扫描东西的安全性和牢靠性, 以取得相对全面而精准的扫描成果。根底镜像安全假如在现有的第三方根底镜像之上构建镜像, 需求考虑以下几个要素:•根底镜像的来历和主机的可信度。该镜像是否来自一家闻名的公司或开源团队?镜像库房可信吗?镜像中是否有一切组件的Docker文件和源代码?•更新频率。避免运用长时刻不更新的镜像, 尤其是未对相关缝隙发表做出回应的镜像。•默许装置的软件。挑选运用最小根底镜像来构建镜像, 然后挑选性地装置运用程序所需的东西, 这比从已有镜像中删去软件包愈加牢靠。石沉大海挑选精简的根底镜像, 比方:GoogleDistroless。这是一种最小根底镜像, 预制了几种常用言语。但因为缺少软件包装置程序, 所以假如需求装置软件, 需求把文件复制到镜像中。RedHatUniversalBaseImage(UBI)。依据RHEL镜像, 无需RedHat订阅, 该镜像分为最小、规范渠道和多服务三个层次, 能掩盖多言语镜像。此外, 还能够从头开始构建一个根底镜像。删去非必要的软件尽量削减容器中供给的东西, 避免歹意攻击者设法进入后对东西进行缝隙运用。一起, 尽或许坚持镜像最小化, 削减0day缝隙的概率, 加速镜像存储和拉取的速度。此外, 约束镜像中只包含必要的二进制文件、库和装备文件, 并避免装置以下东西(假如已装置, 则将其删去)。•软件包办理东西, 例如apt、yum、apk•Unixshells, 例如sh、bash。
       删去shells会阻碍在运转时运用shell脚本, 要尽或许运用编译言语。•编译器和调试器。只在容器创立和开发环节运用, 不要在出产环境中运用。容器创立与运转时生成和编译运用程序的构建东西在出产体系上运转时或许会被运用。因为容器的生命周期十分短, 因而, 不太或许给正在运转的容器打补丁或进行改变, 而是要构建一个新镜像来代替过期的容器布置。经过Dockerfile多阶段构建的镜像包含了编译软件所需的一切内容, 完成编译环境和运转环境的别离。
       FROMbuild-imageasbuild#Buildmystuff#FROMbase-image#Installmypackages#COPYfrom=build/out/my-app/bin/my-appSecrets即便镜像仅供内部运用, 也不要在镜像中嵌入任何secrets, 包含TLS证书秘钥、云服务商凭据、SSH私钥和数据库暗码等,

因为任何有权限拉取镜像的操作者都能提取secret。别的只在运转时供给灵敏数据, 还可保证操作者能在不同的运转时环境中运用相同的镜像, 这样无需重建镜像, 就能经过运用不同的凭据, 来简化更新过期秘钥或撤消秘钥的流程。
       作为secrets办理的代替计划, 运用KubernetesSecret能够处理灵敏数据的装备问题, 避免把灵敏数据暴露在KubernetesPods中, 或许运用其他的secrets办理体系。镜像扫描镜像中的软件若含有缝隙, 会大大添加在运转时的攻击面。在CI管道中构建镜像时, 必需求经过镜像扫描, 方可经过构建阶段。不安全的镜像不该该被推送到出产环境中的镜像库房中。尽管现已有许多开源和专用的镜像扫描东西以及云扫描服务, 但这些东西的镜像扫描水平不尽相同。一些扫描东西只查看已装置的操作体系包, 一些扫描东西只扫描某些编程言语的已装置运转库, 一些扫描东西只供给额定的二进制指纹或其他文件内容的测验。在为CI管道供给镜像扫描东西时, 要保证其能够满意所需求的扫描掩盖规模, 并支撑根底镜像的软件包装置数据库和运用程序运用的编程言语。此外, 确认可承受的缝隙说话层级, 以便能够经过构建。例如任何低于某一严峻程度的缝隙或高于某一严峻程度的缝隙, 都会导致构建失利, 这就需求扫描东西供给一个能兼容的API或东西,

能够装备进CI管道, 并供给数据来评价构建的规范。镜像的存储安全挑选镜像库房构建好安全的容器镜像后, 就要将其存储至镜像库房。运用私有镜像库房可最大约束的保证安全装备,

但需求细心办理镜像库房的根底设施和拜访托辞权限。
       这种支撑私有存储库的镜像库房会为安排减轻很多的办理费用。安全工程师和构建工程师能够依据安排的安全需求和根底设施资源, 为安排挑选最佳的安全处理计划。镜像管控一些镜像库房支撑额定的镜像管控功用, 支撑在镜像上运用不可变标签, 避免同一标签的镜像在镜像库房的多个版别中被重复运用, 强制履行镜像确实认性运转时刻。许多审计认证安排要求要精确地知道在确认时刻内布置的是哪个版别的镜像, 然后也就知道了在某个时刻运转的是哪个版别的运用程序, 避免了每次镜像拉取时都运用最新镜像签名。镜像签名能够为镜像供给更好的维护。有了镜像签名, 镜像库房会生成一个符号镜像内容的校验和, 然后运用私家秘钥加密来创立一个带有镜像元数据的加密签名。客户端依然能够在不验证签名的状况下拉取并运转镜像, 但安全运转环境下应支撑镜像验证要求。镜像验证运用签名秘钥的公钥对来解密镜像签名内容, 能够将其与拉取的镜像进行比较, 保证镜像内容没有被修正。镜像的运转安全镜像扫描镜像扫描是规范CI进程的一部分, 在构建阶段现已进行过镜像扫描并不意味着运转时阶段就不需求进行镜像扫描, 相反, 运转时扫描更为重要。无论是运用任何第三方镜像仍是安排内部的镜像都或许含有新发现的缝隙, 这能够经过运用自界说的或第三方的Kubernetes集群中的准入托辞器, 来避免不安全的容器镜像的调度。尽管有些扫描东西现已支撑在数据库或缓存中存储扫描成果, 但用户也必需求考虑对过期镜像内容的承受度, 以及对每个镜像拉取进行实时扫描所带来的推迟等要素, 避免影响扫描成果的输出。镜像库房和镜像信赖装备和运用安全的镜像库房很重要, 但假如不在客户端履行, 这些维护措施也会被削弱。因为Kubernetes不供给对运用安全镜像拉取选项的本地支撑, 所以需求布置一个Kubernetes准入托辞器, 来验证Pod能够运用受信赖的镜像库房。此外, 准入托辞器还需求能够验证镜像签名。镜像继续运营维护在镜像的整个生命周期内进行缝隙扫描至关重要, 这需求权衡安排的说话容忍度, 坚持开发速度, 这就要求每个安排都需求有自己的方针和程序来处理镜像安全和缝隙办理问题。首先要确认“哪些是不安全的镜像”的规范。光亮方针包含:•缝隙的严峻性•缝隙数量•缝隙是否有打补丁或可用的修正程序•因装备过错所导致的缝隙接下来, 需求确认服务方针和处理镜像的程序, 是否要树立代替镜像并设定一个期限将其布置到出产环境中?最终期限是否会依据缝隙的严峻程序而改变?当发现新的缝隙时, 是否要阻挠已有镜像的容器调度?此外, 还需求界说程序来处理现已在出产中运转的脆弱性镜像的容器。结语经过光亮以上最佳实践, 在容器的整个生命周期内, 拟定一个有用的镜像安全策略, 能够维护容器安全。作为云原生安全的领军企业, 青藤自主研制的青藤蜂巢•云原生安全渠道支撑在业务流程中进行安全卡点查看, 以“准入”+“准出”进行安全管控, 落地安全左移, 削减攻击面。安全卡点要保证镜像在各阶段的安全性。青藤蜂巢镜像查看才能, 掩盖容器“构建-分发-运转”全生命周期, 对镜像(Image)及其构建文件(Dockerfile、Yaml文件等)进行深度的安全和合规性查看。青藤蜂巢的镜像扫描又快又准, 每千个镜像扫描时刻2分钟。比较开源扫描, 蜂巢的镜像检测才能掩盖全、查看才能深, 不仅能查看Dockerfile不安全装备问题, 更能深化发现镜像中的安全补丁、运用组件缝隙、木马病毒、灵敏信息、受信镜像、是否来历根底镜像、是否运用黑名单运用等问题, 且具有镜像阻断和修正石沉大海等内容, 完成办理闭环。此外,

青藤蜂巢查看才能以API和插件方式集成到出产流程中, 支撑CI/CD集成。除了静态扫描外, 青藤蜂巢还对镜像运转后的作业负载进行动态安全查看, 比方运用和组件缝隙、微服务说话、弱暗码等, 创始了国内首个针对运转态容器说话查看的安全计划。完成安全左移还要进行“准入”和“准出”安全管控, 但凡不合格镜像都“禁绝入”到测验环境;一起, 继续查看出产库房和测验节点镜像, 但凡不合格镜像都“禁绝出”到出产环境。青藤蜂巢·云原生安全渠道, 在镜像进入出产环境之前就保证镜像安全, 在运转时阶段继续进行镜像缝隙扫描, 维护镜像全生命周期的安全。