问题现象
负责安全测试的同学需要部署洞态 IAST,通过 java 探针的方式附加到应用服务上,在项目下添加了一个 Dockerfile 文件:
FROM prasadlvi/openjdk-11-jre
WORKDIR /home
ENV TZ 'Asia/Shanghai'
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US:en
ENV LC_ALL en_US.UTF-8
ARG renv
ENV renv=${renv}
COPY service/target/*.jar /home
RUN curl -LJO "http://ip:port/openapi/api/v1/agent/download?url=http://ip:port/openapi&language=java" -H "Authorization: Token 7475b7dfb0abdea8acbf77161b4f2d2276322997" -o /home/agent/dongtai-agent.jar -k
ENTRYPOINT java -javaagent:"/home/agent/dongtai-agent.jar" -Dengine.name='project' -jar -server -Xms1g -Xmx1g -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/error_data *.jar --spring.profiles.active=$renv
提交到 GitLab 之后,WebHook 触发 Jenkins 拉取源码、编译,在构建镜像的时候报错:
看日志是连接 dongtai 服务器超时。
问题分析
最初怀疑是构建镜像的机器,禁用了指定的 port 端口。
找到另一台构建机器,iptables
禁用 port 端口,复现过一次,后面怎么都复现不了。
试了一天,最后测试同学发现,dongtai 服务端的 token 超时后,能复现问题。
问题原因
toekn 过期导致 dongtai 客户端无法注册到服务端。
Agent 每分钟向 Dongtai OpenAPI 服务发送心跳数据,若 Dongtai OpenAPI 服务 2 分钟未收到心跳,则 Agent 被判定为停止。
解决方案
将下载 dongtai-agent.jar 的命令放到 Jenkins 流水线脚本中:
curl -LJO "http://ip:port/openapi/api/v1/agent/download?url=http://ip:port/openapi&language=java" -o /home/agent/dongtai-agent.jar -k
同时去除 Dockerfile 中的 RUN curl
命令。