关于docker:技术交流|Dockerfile-中-RUN-后面的敏感信息检测

3次阅读

共计 2675 个字符,预计需要花费 7 分钟才能阅读完成。

前言

之前学习过一些容器底层原理,再加上之前倾旋徒弟提了一个小想法:拿到镜像,是否能够最大水平还原 Dockerfile 的内容,因为这个外面很可能有一些敏感信息。于是《镜像反查 Dockerfile》文章就诞生了,实际上外面的技术都是曾经有人做好了,我无非是复现,细节补充罢了。

这个事件并没有完结,秉承着实验室外部钻研必须落地的精力,我想把这个细节落地到工具下来:在云场景的攻防中,当咱们控下一个公有云的仓库的时候,通过运行某个自动化工具,将一些敏感信息提取进去。

筹备工作

1. 抉择工具二开还是间接开写

如果在大学期间,我必定抉择去间接开写,锤炼一些能力。然而前面工作了这么久,才越来越感触到大道至简,况且他人曾经写的很好了又无私奉献。有些时候从 0 开始,不如从 1 开始。况且那个 1 还是一个很成熟,很棒的工具。

2. 抉择哪个工具

其实我首先想到的并不是问脉,而是 CDK, 也看了局部的源码,然而最初从定位来说,并不是很适合。CDK 更多的是容器权限,集群权限,你能够看到 CDK 中对于 Docker 破绽利用方面更多的是逃逸,利用。(只是定位不太适合,不障碍 CDK 是一款优良的,我也很喜爱的一款工具)

这个时候想起来了长亭的问脉 Veinmind,Veinmind 有检测敏感信息和 history 的异样操作这块,并且从大维度来说是反对镜像和容器状态的。再加上之前也常常用,相对来说很相熟。那么我会用到哪些模块呢?

3. 剖析工作

拉取 Veinmind 源码,发现两个模块比拟合乎:

  1. Veinmind-sensitive(扫描镜像中敏感信息)?看起来很合乎。
  2. Veinmind-history(扫描镜像中的异样历史命令)?从 rules 和介绍来看不是很合乎,然而外面有一些现成的匹配 docker history 的逻辑,这意味着我能够少写很多代码。乏味的是 我发现了 https://github.com/chaitin/ve… 这个 pr,这位徒弟像给问脉的 docker history 加一些检测的规定。

最终我还是抉择 Veinmind-sensitive 模块。这个模块的定位很具体,是扫描镜像中的异样历史命令,这个 ” 异样 ” 能够通过模块的 rules 去确定他的定位。举个例子:我在 Dockerfile 中 RUN 前面蕴含了某一串 token,或者写一个 password,你只能说这么写会有敏感信息,然而自身也没挖矿操作,没歹意命令,当然不能说我这个镜像是有异样指令的。

持续剖析 Veinmind-sensitive 模块,发现该模块次要的检测逻辑依赖 rules.toml,检测内容曾经很全面了:镜像的 env 信息、敏感文件及敏感文件中的敏感内容。但咱们晓得,Dockerfile 的编写中 RUN 前面是能够写任何命令,包含命令参数都能够,此时这里可能蕴含很多敏感信息,而 Veinmind-sensitive 没有检测到。

对于检测工具来说,这块的检测维度必须笼罩到,这是向 Veinmind 提 pr 的好机会。很多时候咱们须要把信息通过正则列举进去,并给出相干形容,有没有用,敏感水平是用户说了算。

开始 Code

首先就是 pycharm 的近程调试,而后我为本人确定了一个指标,也就是他应该输入啥样子的。之后就是看源码了,其实懂镜像原理的小伙伴是很好了解写的逻辑的。

在性能上,我为本人定了以下指标:

  1. 在敏感内容的检测中退出 docker hisroty
  2. 遍历每一行 docker history 的指令,而后将其与正则匹配 rules 去匹配(都匹配或者可选)
  3. 如果一行指令命中多个正则,须要在 report 中显示

最终在不改变 toml,不改变外围逻辑的状况下,减少了该性能,成果就是下方展现的 Dockerfile 的内容

[email protected]:/home/ubuntu/docker# cat Dockerfile 
FROM ubuntu:18.04

ENV PATH=${JAVA_HOME}/bin:${PATH} \
CS_PORT=9911 \
CS_PASSWORD=123456 \
CS_PUSH_TOKEN=111111dadsadsadsadsadsa 


RUN sed -i [email protected]/archive.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list && apt-get clean && apt update \
&& apt install -y  redis-server  --fix-missing \
&& sed -i "s|bind 127.0.0.1 ::1|bind 127.0.0.1|" /etc/redis/redis.conf \
&& echo 'password=test123456' > config.ini


CMD bash

这里不展现所有的后果,只展现其中一行命中两个正则规定的后果。为了营造这个条件,我批改了 Veinmind-sensitive/rules.toml 中对于 ”Config File” 的正则语句。(这里只是为了测试)filepath = '''.*\/config\.ini$''' => filepath = ''.*config\.ini$''' 敏感信息的内容是

/bin/sh -c sed -i [email protected]/archive.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list && apt-get clean && apt update && apt install -y redis-server --fix-missing && sed -i \"s|bind 127.0.0.1 ::1|bind 127.0.0.1|\" /etc/redis/redis.conf && echo 'password=test123456' > config.ini

实践上,这一条指令有 password 敏感字段和 config.ini 两个敏感字眼,是会命中 ”Config File” 和 ”Password In Enviroment” 这两个正则。

实现成果

具体的实现代码能够看 https://github.com/chaitin/Ve…

写在最初

最初我想说的是,我在做脚本小子的时候曾经最大化的参照原作者的格调去写并且我写的可能会有纰漏,然而可能逻辑上代码上,始终是原作者更加理解些,对我来说也是时常会学习到大佬的优良代码。很感激问脉的认同以及 D_infinite 徒弟的认同。最初也要感激我的共事 akkuman 徒弟的帮忙。也心愿问脉能够越做越好,能够一起拥抱开源生态。


作者:0-cat

正文完
 0